获取没有内容长度的http请求的响应?

pre*_*per 19 tcp http http-headers

我有一个小程序发送http请求并获得TCP协议的响应.

我的要求格式;

GET / HTTP/1.0
Host: somewebsite.com
{two new line}
Run Code Online (Sandbox Code Playgroud)

我从socket中逐行读取响应(在c#中使用NetworkStream和StreamReader)直到找到content-length头.我存储长度,然后继续阅读,直到找到一个空行.然后创建一个具有长度的缓冲区并接收其余的响应.

但有些响应没有内容长度标题.所以我的方法失败了.如果我不知道我应该收到多少字节,何时应该停止?

Jul*_*hke 25

在HTTP/1.0中?当流关闭时.

在HTTP/1.1中?使用分块编码.


Pav*_*nek 8

请参阅HTTP规范的相关部分.在您的特定情况下,如果服务器没有提供内容长度,那么它必须在完成响应后关闭流.您(作为客户)没有其他可靠的方法可以了解.无论HTTP版本如何.@Julian chunked编码确实是HTTP/1.1中的一个聪明的升级,但它特别适用于流媒体,没有理由为什么"普通"的网络服务器会实现它.这是一个在启动响应之前知道内容长度的服务器.我猜这个OP没有控制服务器,否则他不会反对丢失HTTP头.

但即使你得到内容长度标题,你也不能毫无保留地信任它.服务器实现者也只是易犯错的人.将其作为"最可能"的响应,初始值为可调整大小的缓冲区.你仍然必须准备好处理更少和更多(更糟糕的情况).

  • 这是非常误导的.如果响应具有内容长度标头字段并且不使用分块编码,那么这就是*only*信息.如果您收到的内容较少,则应视为内容被截断.如果您收到更多内容,那么搜索者就会被破坏,或者您已经在查看下一个响应. (9认同)
  • 我很谦虚地要求解释当客户端尚未完成对当前响应的解析时,如何在一个唯一的套接字上读取下一个响应,因此它不太可能已经发送了下一个请求。我可能会更好地理解下降投票。否则,我在这件事上不会有任何重大分歧。当您读取声明的内容长度并且套接字读取告诉您还有2个字节时,您将怎么办?实际上,说“愚蠢的服务器坏了,我不再和你说话了”并不像好的程序员所希望的那样经常适用。 (3认同)
  • vtmarvin:客户端可以使用管道。 (2认同)