Pha*_*mal 6 java apache http httpclient chunked
[使用httpcore 4.1.4,httpclient 4.2.5,Oracle JDK 1.7.0_25]
我试图代表webapp的javascript(AJAX)代码"代理"与第三方Web服务的连接,并且它似乎在大型chunked响应上失败,通过发送多个RST并抛出一个错误部分地通过块org.apache.http.TruncatedChunkException.
所以我想知道:
我的基本方法是将所有内容从servlet的请求对象复制到apache组件httpclient请求并执行.更具体地说,我:
host使用我要代理的主机/端口设置(/覆盖)新请求上的标头,引起我问题的是最后一个.它似乎在一半块中失败了,我得到以下堆栈跟踪:
org.apache.http.TruncatedChunkException: Truncated chunk ( expected size: 7752; actual size: 4077)
at org.apache.http.impl.io.ChunkedInputStream.read(ChunkedInputStream.java:186)
at org.apache.http.conn.EofSensorInputStream.read(EofSensorInputStream.java:138)
at <mypackage>.<MyServlet>.service(<MyServlet>.java:XXX)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.jboss.resteasy.plugins.server.servlet.FilterDispatcher.doFilter(FilterDispatcher.java:63)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Thread.java:724)
Run Code Online (Sandbox Code Playgroud)
我已经使用Wireshark窥探了它并获得了类似这样的过程:
source dest info
client server [SYN] seq=0
server client [SYN, ACK] seq=0 ack=1
client server [ACK] seq=1 ack=1
client server GET /url?param=value... HTTP/1.1
server client [ACK] seq=1 ack=221
server client [TCP segment of a reassembled PDU]
client server [ACK] seq=221 ack=4345
client server [FIN, ACK] seq=221 ack=4345
server client [TCP segment of a reassembled PDU]
client server [RST] seq=221
server client Continuation or non-HTTP traffic
client server [RST] seq=221
Run Code Online (Sandbox Code Playgroud)
在我有限的理解中,FIN意味着'我已完成发送',因为客户端标题已经发送,所以IMO是公平的.但是,RST/reset似乎只是试图放弃连接.
客户端的HTTP标头是:
GET /some/path?params=values HTTP/1.1
connection: Keep-Alive
host: target.host.com
accept: */*
user-agent: Wget/1.14 (linux-gnu)
Run Code Online (Sandbox Code Playgroud)
而对于服务器:
HTTP/1.1 200 OK
Date: Mon, 16 Sep 2013 03:59:37 GMT
Server: Apache-Coyote/1.1
Content-Disposition: inline; filename=geoserver-GetFeature.text
Content-Type: text/xml; subtype=gml/2.1.2
Vary: Accept-Encoding
Connection: close
Transfer-Encoding: chunked
Run Code Online (Sandbox Code Playgroud)
顺便问一下,这个问题:[restlet] TruncatedChunkException:看起来很相似,但似乎没有任何有用的信息.
更新:我尝试过一个非分块的网站(/.:-)),它的失败与:
org.apache.http.ConnectionClosedException: Premature end of Content-Length delimited message body
Run Code Online (Sandbox Code Playgroud)
好的,我发现了我做了什么.我太早地清理了我的连接 - 基本上我的连接方法中的样板有一个
finally
{
client.getConnectionManager().shutdown();
}
Run Code Online (Sandbox Code Playgroud)
但该方法返回了流对象,因此在关闭发生时未完成读取.
| 归档时间: |
|
| 查看次数: |
14605 次 |
| 最近记录: |