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.