使用HttpClient时,为什么在服务器响应中省略了Content-Length标头?

时间:2013-02-15 21:14:11

标签: android http-headers

我正在使用此问题的源代码How to asynchronous perform a httprequest and show the progress of downloading the response来获取网页的html源代码并显示包含目前已下载数据的进度条以及该页面的总大小。

该特定代码实际上不适用于ICS 4.0.3,因为clHeaders [0]没有指向任何内容,并且在索引0处引发了一个名为ArrayIndexOutOfBounds的异常,因为从服务器的响应中省略了Content-Length头。我尝试使用getContentLength以防出现问题 - 它返回负值-1然后我遍历所有标题并且Content-Length不存在。删除这些位后,代码工作正常,并提取一个网页,写入文件,并显示正在下载的大小,但显然不是最终大小,直到我实际下载它。

我对原因只有三个想法:

  1. 我没有发送Content-Length标题因此我也没有收到 - 但这听起来不对。另外我不知道HttpClient是不是在后台发送一个。
  2. 我在另一个问题中读到,如果服务器的响应是流式传输或分块,则getContentLength可以返回-1。
  3. Gzip已?但我不知道如何禁用它或者首先启用它
  4. 如果您认为服务器坏了,我尝试了许多网站,包括谷歌,但仍然没有内容长度标题。

2 个答案:

答案 0 :(得分:0)

Content-Length标头是可选的,它主要仅对HEAD请求或非常大的数据有用,如果内容太大,客户端可能决定要中止请求。所以是的,Content-Length并不总是存在。除此之外,您通常应该通过阅读数据来获取内容长度。

答案 1 :(得分:0)

有些情况下,Content-Length不应包含在响应中或应忽略。这些案例是documented on the W3 site。例如,如果您的内容的传输编码为gzip,则应忽略内容长度。