Http 如何根据内容长度标题检查实际内容长度?

Http 如何根据内容长度标题检查实际内容长度?,http,node.js,Http,Node.js,用户可以将文档发布到我们的web服务。我们把它流到别处。但是,在流媒体播放结束时,我们需要确保他们没有在内容长度上撒谎 我假设如果headerContentLength>realContentLength,请求只会等待他们发送其余的内容,最终超时。所以这可能没问题 如果headerContentLength

用户可以将文档发布到我们的web服务。我们把它流到别处。但是,在流媒体播放结束时,我们需要确保他们没有在内容长度上撒谎

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

如果headerContentLength呢?也就是说,如果他们在说他们已经完成后继续发送数据会怎么样


Node.js是否以任何方式处理了此问题?如果没有,什么是检查的好方法?我想我可以计算一些
data
事件监听器中的字节数,即
req.on(“data”,function(chunk){totalBytes+=chunk.length;})
。不过,这似乎是个难题。

要检查请求的实际长度,您必须自己加起来。
data
块是
Buffer
s,它们有一个
.length
属性,您可以将其相加

如果使用
request.setEncoding()
指定编码,则
数据
块将改为
字符串
s。在这种情况下,调用
Buffer.bytellength(chunk)
获取长度。(
Buffer
是节点中的全局对象。)

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


注意:
length
指的是
缓冲区内容的最大长度,而不是实际长度。但是,在这种情况下它是有效的,因为块缓冲区总是以精确正确的长度创建的。如果您在其他地方使用缓冲区,请注意这一点。

您是否没有对请求的
end
事件执行此检查,因为如果客户端发送的数据超过指定的
内容长度
头,您希望立即结束连接?我很乐意在
end
事件,但我不知道要访问哪个属性来告诉实际发送了多少字节
http.ServerRequest
似乎没有任何此类属性。
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);
    });
});