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

标签 http node.js

用户可以将文档发布到我们的网络服务。我们将其流式传输到其他地方。但是,在流式传输结束时,我们需要确保他们没有在 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/

相关文章:

http - Golang,零指针取消引用或无效内存地址

node.js - 关于快速验证的几个问题

javascript - 如何在 NodeJs 中断开与 tcp 套接字的连接

http - Blackberry JDE HTTPConnection 问题

ruby-on-rails - Rails - 非阻塞 HTTP 请求?

node.js - Express 应用程序中端口 3000 的意义

node.js - Webpack 无法解析 JS 模块(在 Typescript 项目中)

javascript - 在 View 中访问模型实例方法 (Sails.js/EJS)

javascript - 基于 JavaScript 文件上的 random() 执行不同的函数

rest - 在 RESTful API 上使用 Last-Modified 和 If-Modified-Since