2013-02-15 25 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的傳輸編碼,則應該忽略內容長度。

相關問題