【问题标题】:Getting response of http request without content-length?获取没有内容长度的http请求的响应?
【发布时间】:2012-07-07 16:44:54
【问题描述】:

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

我的请求格式;

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

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

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

【问题讨论】:

    标签: http tcp http-headers


    【解决方案1】:

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

    HTTP/1.1 - 没有content-length 的服务器响应是当响应为chunked encoded

    【讨论】:

    • 基于另一个答案似乎 HTTP/1.1 服务器仍然可以通过关闭流来做到这一点......
    • @rogerdpack 是的,可以,但现在不需要了
    【解决方案2】:

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

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

    【讨论】:

    • 这非常具有误导性。如果响应具有内容长度标头字段并且不使用分块编码,那是您拥有的 only 信息。如果您收到的内容较少,则应将内容视为已截断。如果您收到更多内容,则服务器已损坏,或者您已经在查看下一个响应。
    • 我谦虚地要求解释如何在单个唯一套接字上读取下一个响应,当客户端尚未完成对当前的解析时,它不太可能已经发送下一个请求。我可能会更好地理解反对票。否则我看不出在这个问题上有任何重大分歧。当您读取到声明的内容长度并且套接字读取告诉您还剩下 2 个字节时,您会怎么做?实际上,说“愚蠢的破服务器,我不会再和你说话了”并不像优秀的程序员想要的那样经常适用。
    • vtmarvin:客户端可以使用流水线。
    • 啊流水线,好的。我几乎感到惊讶的是,有一些神秘的 HTTP 功能允许服务器对单个请求发送多个响应,这可能是 OP 最可能想要做的。
    猜你喜欢
    • 1970-01-01
    • 2018-06-24
    • 1970-01-01
    • 1970-01-01
    • 2013-01-24
    • 2018-04-18
    • 1970-01-01
    • 1970-01-01
    • 2021-03-25
    相关资源
    最近更新 更多