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

3

我正在使用这个问题的源代码如何异步执行http请求并显示下载响应的进度来获取网页的html源代码,并显示一个进度条,展示已经下载了多少数据以及页面的总大小。

由于服务器的响应中省略了Content-Length头,所以那段代码在ICS 4.0.3上实际上并不起作用,因为clHeaders[0]指向为空,会引发一个名为ArrayIndexOutOfBounds的异常,并且无法正常工作。我尝试使用getContentLength来解决这个问题 - 它返回一个负值-1,然后我遍历了所有的头文件,但Content-Length不存在其中。删除这些部分后,代码能够正常运行,成功获取网页,将其写入文件,并在下载过程中显示大小,但显然不能显示最终大小,直到我真正下载完它。

我只有三个想法:

  1. 我没有发送Content-Length头,因此我也没有收到它 - 但这听起来不对。并且我不知道HttpClient是否在后台发送它。
  2. 我在另一个问题中读到,如果服务器的响应是流式的或分块的,则getContentLength可能会返回-1。
  3. gzip?但我不知道如何禁用它,或者它是否已经启用。

如果你认为是服务器出了问题,我尝试了许多网站,包括Google,但仍然没有Content-Length头。

2个回答

0

Content-Length 头部是可选的,它通常只对 HEAD 请求或非常大的数据有用,客户端可能会决定如果内容太大,则放弃请求。因此,是的,Content-Length 不总是存在的。除此之外,您通常只需通过读取数据来获取内容长度。


0

有些情况下,响应中不应包含Content-Length或应该被忽略。这些情况在W3网站上有记录。例如,如果您的内容使用gzip传输编码,则应忽略Content-Length。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接