Похоже, что сервер не предлагает Content-Length в своих заголовках ответа. Вы получили заголовок Transfer-Encoding = chunked из заголовков ответа?
Моя ситуация такова: я выполняю HttpURLConnection и считаю, что сервер ответит мне «Content-Length» с положительным значением, но это не так, затем я перехожу к
AndroidHttpClient , в котором реализована реализация Android HttpClient, выполните тот же запрос еще раз и получите право Content-Length .
Я использовал Wireshark для анализа двух запросов, обнаружил небольшую разницу в заголовках запросов.
список заголовков, использующих AndroidHttpClient:
---------------------------------- request headers
Range : bytpe=0-
Host : download.game.yy.com
Connection : Keep-Alive
User-Agent : com.duowan.mobile.netroid
---------------------------------- response headers
Server : nginx
Content-Type : text/plain; charset=utf-8
ETag : "535e2578-84e350"
Cache-Control : max-age=86400
Accept-Ranges : bytes
Content-Range : bytes 0-8708943/8708944
Content-Length : 8708944
список заголовков запросов, которые используют HttpURLConnection:
---------------------------------- request headers
Range : bytpe=0-
Host : download.game.yy.com
Connection : Keep-Alive
User-Agent : com.duowan.mobile.netroid
Accept-Encoding : gzip // difference here
---------------------------------- response headers
Server : nginx
Content-Type : text/plain; charset=utf-8
Cache-Control : max-age=86400
Transfer-Encoding : chunked
X-Android-Received-Millis : 1398861612782
X-Android-Sent-Millis : 1398861608538
Единственное отличие с заголовком запроса - Accept-Encoding , которое не добавлено мной самостоятельно, это было значение по умолчанию Android для HttpURLConnection , после этого я установил его на identity , затем снова выполните запрос, ниже приведены полные стеки заголовков:
---------------------------------- request headers
Range : bytpe=0-
Host : download.game.yy.com
Connection : Keep-Alive
User-Agent : com.duowan.mobile.netroid
Accept-Encoding : identity
---------------------------------- response headers
Server : nginx
Content-Type : text/plain; charset=utf-8
ETag : "535e2578-84e350"
Cache-Control : max-age=86400
Accept-Ranges : bytes
Content-Range : bytes 0-8708943/8708944
Content-Length : 8708944
X-Android-Received-Millis : 1398862186902
X-Android-Sent-Millis : 1398862186619
Как вы можете видеть, после того, как я установил Accept-Encoding на «identity», заменил системное значение по умолчанию «gzip», сервер предоставил «Content-Length» положительное значение, поэтому AndroidHttpClient мог принять правильное значение Content-Length и HttpURLCподключения нет.
кодировка сжатия gzip может привести к получению фрагментированного ответа, который учитывается серверной стороной, и если сервер считает, что вы можете получить ответ фрагментированного кодирования, он может не предложить заголовок Content-Length , попробуйте отключить gzip приемлемый поведение тогда посмотрим, какая разница с этим.