gpt4 book ai didi

http - 如果 Content-Length 只是近似值,发送 HTTP 的最佳方式是什么?

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:28:06 25 4
gpt4 key购买 nike

我编写了一个 CGI 程序来通过 HTTP 发送大量动态生成的数据。但是,我事先不知道确切内容长度。

我无法将整个响应存储在内存中以计算字节数,因为工作集有很多 GB。

同样,我无法在开始传输之前遍历数据,因为传输时间比 HTTP 请求的典型超时时间长得多——将响应写入 /dev/需要几分钟空

不过,我可以猜测 Content-Length 在 ~1.5 的因数内。

所以如果我发送

Status: 200 OK
Content-Length: 328

然后写入一个长度为 233 的 body,然后优雅地close(2) socket,HTTP 客户端会认为它成功了还是失败了?

一个数据点是 wget 似乎发送了带有 header 的第二个请求

Range: bytes=234-

好的,我已经为此做好了准备,然后回应

Status: 416 Range Not Satisfiable

这是完整的 wget session (使用微小的模拟数据):

Connecting to 127.0.0.1:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 328 [text/csv]
Saving to: ‘large_blob’

71% [========================> ] 233 --.-K/s in 0.03s

2015-10-21 09:22:57 (7.31 KB/s) - Connection closed at byte 233. Retrying.

--2015-10-21 09:22:58-- (try: 2) http://127.0.0.1/large_blob
Connecting to 127.0.0.1:80... connected.
HTTP request sent, awaiting response... 416 Requested Range Not Satisfiable

The file is already fully retrieved; nothing to do.

因此,wget 退出并返回代码 0,这似乎表明成功 -- 这是应该发生的事情!

问题是:这是正确的,还是有更好的方法?

最佳答案

这是不正确的。如果您事先不知道内容长度,请不要发送 Content-Length header 字段。相反,使用分块编码。 (有关详细信息,请参阅 RFC 7230)

关于http - 如果 Content-Length 只是近似值,发送 HTTP 的最佳方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33264731/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com