5

用户可以将文档发布到我们的 Web 服务。我们将其流式传输到其他地方。但是,在流式传输结束时,我们需要确保他们没有在 Content-Length 上撒谎。

我假设如果headerContentLength > realContentLength,请求将等待他们发​​送其余的,最终超时。所以这可能没问题。

如果headerContentLength < realContentLength呢?即,如果他们说完成后继续发送数据怎么办?

这是否由 Node.js 以任何方式处理?如果没有,有什么好的检查方法?我想我可以只计算一些data事件侦听器内部的字节数——即req.on("data", function (chunk) { totalBytes += chunk.length; }). 不过,这似乎是一个kludge。

4

1 回答 1

2

要检查请求的实际长度,您必须自己添加。data块是Buffers 并且它们具有您可以添加的属性.length

如果您使用 指定编码request.setEncoding(),则您的data块将String改为 s。在这种情况下,调用Buffer.byteLength(chunk)以获取长度。(Buffer是节点中的全局对象。)

将每个块的总数加起来,您就会知道发送了多少数据。这是一个粗略的(未经测试的)示例:

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's 内容的最大长度,而不是实际长度。但是,它在这种情况下是有效的,因为块缓冲区总是以完全正确的长度创建的。如果您在其他地方使用缓冲区,请注意这一点。

于 2012-07-25T22:42:39.307 回答