2012-07-07 130 views
11

我有一个小程序发送http请求并获得TCP协议的响应。获取没有内容长度的http请求的响应?

我的请求格式;

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

我从插座(使用C#中的NetworkStream和StreamReader的),直到找到要找的内容长度报头读取响应一行一行。我存储的长度,然后继续阅读,直到找到一个空行。然后创建一个长度的缓冲区并接收其余的响应。

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

回答

4

请参阅relevant part of HTTP spec。 在您的特定情况下,如果服务器不提供内容长度,则必须在完成响应后关闭流。没有其他可靠的方法可以让你(作为客户)知道。不管HTTP版本。 @Julian chunked编码确实是HTTP/1.1中的一个聪明的升级,但是对于流式处理而言更具体,并且没有理由为什么“普通”web服务器会实现它。这是一个在启动响应之前知道内容长度的服务器。我猜OP没有控制服务器,否则他不会反对缺少的HTTP头。

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

+7

这很容易让人误解。如果响应具有内容长度标题字段并且不使用分块编码,那就是* only *信息。如果您收到的内容较少,则应将内容视为截断。如果您收到更多内容,则服务器已损坏,或者您已在查看下一个响应。 – 2012-07-07 19:53:02

+0

我虚心地询问解释如何读取下一个响应可能发生在一个唯一的套接字上,当客户端没有完成解析当前的一个,所以它不太可能发送下一个请求。我可以更好地理解downvote。否则,我不会在这件事上看到任何重大分歧。当你读到声明的内容长度时,你会做什么,并且socket read告诉你还剩下2个字节?在现实中,说“愚蠢的破碎的服务器,我不会再和你说话”并不像很多程序员喜欢的那样频繁。 – 2012-07-08 11:22:07

+0

vtmarvin:客户端可以使用流水线。 – 2012-07-08 19:26:52