如何根据Content-Length标题检查实际内容长度?

时间:2012-06-22 22:30:29

标签: http node.js

用户可以将文档发布到我们的Web服务。我们将其流到其他地方但是,在流媒体结束时,我们需要确保他们不会对他们的内容长度撒谎。

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

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

这是由Node.js以任何方式处理的吗?如果没有,有什么好办法检查?我想我可以计算一些data事件监听器内的字节数,即{,req.on("data", function (chunk) { totalBytes += chunk.length; })。这看起来像是一块垃圾。

1 个答案:

答案 0 :(得分:2)

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

如果您使用request.setEncoding()指定编码,则data块将改为String。在这种情况下,请致电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内容的最大长度,而不是实际长度。但是,它适用于这种情况,因为块缓冲区始终以正确的正确长度创建。如果你正在使用其他地方的缓冲区,请注意这一点。