2013-02-15 120 views
3

我使用这个问题的源代码How to asynchronous perform a httprequest and show the progress of downloading the response为了获取一个网页的html源代码,并显示一个进度条到目前为止的下载数据和多大的页面总大小。为什么在使用HttpClient时从服务器响应中忽略Content-Length头?

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

我只有事业的三个想法:

  1. 我不发送Content-Length头因此我没有收到任何一个 - 不过这听起来是错误的。另外我不知道如果HttpClient不在后台发送一个。
  2. 我在这里读到另一个问题,如果服务器的响应是流式传输或分块,那么getContentLength可以返回-1。
  3. Gzip?但我不知道如何禁用它,或者如果它首先启用

如果您认为这是服务器坏了,我尝试了很多网站,包括谷歌,仍然没有任何Content-Length头。

回答

0

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

0

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

相关问题