27

我有一个小程序发送 http 请求并使用 TCP 协议获取响应。

我的请求格式;

GET / HTTP/1.0
Host: somewebsite.com
{two new line}

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

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

4

2 回答 2

37

In HTTP/1.0- 服务器响应没有content-length是流关闭时

In HTTP/1.1- 服务器响应没有content-length是当响应被分块编码时

于 2012-07-07T14:18:36.057 回答
9

请参阅HTTP 规范的相关部分。在您的特定情况下,如果服务器没有返回内容长度,那么它必须在完成响应后关闭流。您(作为客户)没有其他可靠的方法可以知道。与 HTTP 版本无关。@Julian 分块编码确实是 HTTP/1.1 中的一个巧妙升级,但它是专门针对流媒体的,没有理由让“普通”网络服务器实现它。那是在发起响应之前知道内容长度的服务器。而且我猜 OP 没有控制服务器,否则他不会反对丢失的 HTTP 标头。

但是,即使您确实获得了内容长度标头,您也不能毫无保留地信任它。服务器实现者也只是容易犯错的人。将其视为“最可能”的响应,将初始值设置为可调整大小的缓冲区。您仍然必须准备好处理更少和更多(最坏的情况)。

于 2012-07-07T16:49:07.960 回答