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

时间:2012-07-07 13:43:41

标签: http tcp http-headers

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

我的请求格式;

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

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

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

2 个答案:

答案 0 :(得分:21)

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

在HTTP / 1.1中?使用chunked encoding

答案 1 :(得分:6)

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

但即使你得到内容长度标题,你也must not unreservedly trust it。服务器实现者也只是易犯错的人。将其作为“最可能”的响应,初始值为可调整大小的缓冲区。你仍然必须准备好处理更少的事情(更糟糕的情况)。