我编写了一个CGI程序,通过HTTP发送大量动态生成的数据。但是,我事先并不知道确切的内容长度。
我无法将整个响应存储在内存中以计算字节数,因为工作集很多GB。
同样,我无法在开始传输之前遍历数据,因为传输所需的时间比HTTP请求的典型超时要长得多 - 将响应写入{{1}需要几分钟}。
然而,我可以猜测内容长度在1.5左右。
所以,如果我发送
/dev/null
然后写一个长度为233的主体,并优雅地Status: 200 OK
Content-Length: 328
套接字,HTTP客户端会认为它是否成功?
一个数据点是wget似乎发送了带头文件的第二个请求
close(2)
好的,我已为此做好准备,并做出回应
Range: bytes=234-
这里是完整的wget会话(使用微小的模拟数据):
Status: 416 Range Not Satisfiable
所以,wget以返回代码0退出,这似乎表示成功 - 这就是应该发生的事情!
问题是:这是正确的,还是有更好的方法?
答案 0 :(得分:0)
这不正确。如果您事先不知道内容长度,请不要发送Content-Length标头字段。相反,使用分块编码。 (有关详细信息,请参阅RFC 7230)