用户可以将文档发布到我们的网络服务。我们将其流式传输到其他地方。但是,在流式传输结束时,我们需要确保他们没有在 Content-Length 上撒谎。
我假设如果headerContentLength > realContentLength
,请求将等待他们发送其余部分,最终超时。所以这可能没问题。
如果headerContentLength < realContentLength
呢? ? IE。如果他们在说完成后继续发送数据怎么办?
这是否由 Node.js 以任何方式处理?如果没有,检查的好方法是什么?我想我可以计算一些 data
中的字节数事件监听器---即req.on("data", function (chunk) { totalBytes += chunk.length; })
.不过,这似乎是一种拼凑。
最佳答案
要查看请求的实际长度,您必须自己添加它。 data
block 是 Buffer
,它们有一个可以加起来的 .length
属性。
如果您使用 request.setEncoding()
指定编码,您的 data
block 将改为 String
。在这种情况下,调用 Buffer.byteLength(chunk)
来获取长度。 (Buffer
是 Node 中的全局对象。)
将每个 block 的总数加起来,您就会知道发送了多少数据。 这是一个粗略的(未经测试的)示例:
https.createServer(function(req, res) {
var expected_length = req.headers['content-length']; // I think this is a string ;)
var actual_length = 0;
req.on('data', function (chunk) {
actual_length += chunk.length;
});
req.on('end', function() {
console.log('expected: ' + expected_length + ', actual: ' + actual_length);
});
});
注意:length
是指Buffer
内容的最大长度,不是实际长度。然而,它在这种情况下有效,因为 block 缓冲区总是以完全正确的长度创建。如果您在其他地方使用缓冲区,请注意这一点。
关于http - 如何根据 Content-Length header 检查实际内容长度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11164976/