2

这是一个脑筋急转弯问题,我实际上知道答案。我悬赏它,因为它代表了一个有价值的 Node 编程安全提示(这是第一个提示)。

  • 提示 2:在 HTTP 请求中,“Content-Length”标头字段的单位是什么?

我在用着

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 字符串(可预测地)导致语法错误之前,不会出现任何错误。

这是怎么回事?

4

1 回答 1

5

knox-module 的源代码 ( https://github.com/LearnBoost/knox/blob/master/lib/client.js ) 您可以了解到它使用标准http-requests。

req.writereq.end默认从 'utf8' 转换字符串(http://nodejs.org/api/http.html#http_request_end_data_encoding)。

所以真正发生的是,您通过设置字符串长度而不是“内容长度”字段中的字节数意外切断了字符串的结尾。服务器扔掉所有东西的时间比这更长;所以当你解析字符串时,你会得到一个错误。

最快的解决方法是:

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

甚至更快:只需删除“Content-Length”行。

于 2013-06-29T08:16:28.380 回答