knox S3 загрузить поврежденный или усеченный файл

Это вопрос с дразнилкой, на котором я действительно знаю ответ. Я даю ему награду, потому что она представляет собой ценный совет по безопасности программирования на Node (и это первая подсказка).

  • Подсказка 2: Каковы единицы измерения в поле заголовка "Content-Length" в HTTP-запросе?

я использую

var knox = require('knox');
var s3 = knox.createClient({
    key: ...,
    secret: ...,
    bucket: ...
});

// The bug is below:

var stringVal = JSON.stringify(<2d javascript array from a large spreadsheet>)

var req = s3.put(path + filename, {
    'Content-Length': stringVal.length,
    'Content-Type': 'application/json'
});
req.end(stringVal);

Полученная загрузка либо усечена, либо повреждена иным образом. У нас есть stringVal.length === 322889и полученный размер элемента S3 соответствует этому. Но загрузка и перезагрузка файла приводит к строке, которая имеет длину 322140, Никаких ошибок не будет по пути, пока не будет предпринята попытка JSON.parse строки, которая (как и ожидалось) приводит к синтаксической ошибке

Что происходит?

1 ответ

Решение

Из источника knox-модуль ( https://github.com/LearnBoost/knox/blob/master/lib/client.js) вы можете узнать, что он использует стандартные http-Запросы.

req.write а также req.end по умолчанию преобразует строки из utf8 ( http://nodejs.org/api/http.html).

Так что на самом деле происходит то, что вы случайно обрезаете конец строки, устанавливая длину строки вместо количества байтов в поле "Content-Length". Сервер выбрасывает все дольше, чем это; поэтому, когда вы анализируете строку, вы получаете ошибку.

Самое быстрое решение будет:

'Content-Length': new Buffer(stringVal).length,

Или даже быстрее: просто удалите строку Content-Length.

Другие вопросы по тегам