Transfer-Encoding: chunked
在访问 http://sz.58.com/bijibenweixiu/ 时, 不能读出内容, HttpClient 程序最后以"socketTimeout"结束,
看到有以下信息:
ResponseHeaders - get - Date = Fri, 24 Aug 2012 07:48:35 GMT
ResponseHeaders - get - Server = Apache-Coyote/1.1
ResponseHeaders - get - Last-Modified = Fri, 24 Aug 2012 07:48:35 GMT
ResponseHeaders - get - Cache-Control = max-age=30
ResponseHeaders - get - Content-Type = text/html;charset=UTF-8
ResponseHeaders - get - Vary = Accept-Encoding
ResponseHeaders - get - Set-Cookie = A2B=I; Domain=58.com; Expires=Sat, 25-Aug-2012 07:48:35 GMT; Path=/
ResponseHeaders - get - Keep-Alive = timeout=15, max=99
ResponseHeaders - get - Connection = Keep-Alive
ResponseHeaders - get - Transfer-Encoding = chunked
查 http://hi.baidu.com/tk_ayj/blog/index/18 有以下说明, 但应如何处理呢:
23. Transfer-Encoding: WEB 服务器表明自己对本响应消息体(不是消息体里面的对象)作了怎样的编码,比如是否分块(chunked)。
例如:Transfer-Encoding: chunked
24. Vary: WEB服务器用该头部的内容告诉 Cache 服务器,在什么条件下才能用本响应所返回的对象响应后续的请求。
假如源WEB服务器在接到第一个请求消息时,其响应消息的头部为:Content-Encoding: gzip; Vary: Content-Encoding
那么 Cache 服务器会分析后续请求消息的头部,检查其 Accept-Encoding,是否跟先前响应的 Vary 头部值一致,即是否使用
相同的内容编码方法,这样就可以防止 Cache 服务器用自己 Cache 里面压缩后的实体响应给不具备解压能力的浏览器。
例如:Vary:Accept-Encoding
http://hi.baidu.com/andylo25/blog/item/434cc3106f78bdcda6ef3f52.html
以下是否解决问题?
注: 经测试, 按以下修改了代码, 仍没有解决问题.
3.4 chunked 编码不规范的问题
有时候Web 服务器生成HTTP Response 是无法在Header 就确定消息大小的, 这时一般来说服务器将不会提供Content- Length
的头信息, 而采用Chunked 编码动态的提供body 内容的长度。Chunked 编码使用若干个Chunk 串连而成, 由一个标明长度为0 的chunk 标示结束。使用十分广泛的Tomcat Web 服务器大量采用了Chunked 编码方案, 然而早期的Tomcat Web 服务器实现并不十分规范, 并没有以标明长度为0 的chunk 标示内容传输结束。
因此HttpClient 在接收这些早期的Tomcat Web 服务器的Http 响就会导致解析错误。分析HttpClient 源码发现, ChunkedInputStream 类负责在HttpClient 中解析chunked 编码, 修改一个此类中 getChunkSizeFromInputStream(final InputStream in) 方法, 可使标准的和上述非标准的chunked 编码均可正常解析。具体修改方法如下:
private static int getChunkSizeFromInputStream(final InputStream in)
throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
// States: 0=normal, 1=\r was scanned, 2=inside quoted string, - 1=end
int state = 0;
while (state ! = - 1) {
int b = in.read();
if (b == - 1) {
return 0;//新增加语句
throw new IOException("chunked stream ended unexpectedly");//原始语句, 需将其去掉或注释掉}