节点的http服务器是否对ReadableStream请求进行Content-Length验证

Does node's http server have any Content-Length verification for the ReadableStream request

Node.js 的 http 服务器在请求上实现了一个 ReadableStream。

我知道我需要自己检查 Content-Length 来决定是否要接受那么长的请求。

但是节点是否对 ReadableStream 进行任何验证以确保其有效?

A) 如果客户端提前关闭连接并且 Node 没有收到足够的数据来满足 Content-Length,它会 end 流并假装它没问题还是会发出错误?

B) 如果客户端发送的数据多于 Content-Length 所说的,Node 会发出错误并停止传输数据,还是继续传输超出长度的数据?

我正在通过 XHR2 实现简单的 POST 正文上传,我想知道我是否必须编写自定义转换流来自己验证流(所以有人不能说他们正在上传 2KB但实际上上传了 20GB 写入磁盘)。

回答我自己的问题,因为我必须尝试对测试脚本进行测试攻击。

节点确实可以正确处理 http 请求流。

在将请求通过管道传输到文件的正常请求中:

  • end 事件将直接在 req
  • 上触发
  • close 事件将在可写流上触发

当您尝试编写超出 Content-Length 的内容时:

  • req 将 Content-Length 定义的数据量通过管道传输到文件中
  • end 事件将直接在 req
  • 上触发
  • close 事件将在可写流上触发

当您尝试下写然后关闭连接时:

  • close 事件将直接在 req
  • 上触发
  • 不会在可写流上触发任何事件(我假设这意味着您应该将其视为中止并自行关闭和取消链接文件)

因此,在您确认 Content-Length 可接受后,将 req 传送到文件是安全的。当 Content-Length 为 2KB 时,Node 不会将 20GB 的数据写入磁盘。