gpt4 book ai didi

java - HttpClient 抛出 TruncatedChunkException 访问大块资源

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:09:57 26 4
gpt4 key购买 nike

[使用 httpcore 4.1.4,httpclient 4.2.5,Oracle JDK 1.7.0_25]

我正在尝试代表 webapp 的 javascript (AJAX) 代码“代理”到第三方 Web 服务的连接,但它似乎在大型 chunked 响应上失败,中途出错通过发送多个 RST 并抛出 org.apache.http.TruncatedChunkException 来生成一个 block 。

所以我想知道:

  1. 为什么 http 客户端试图断开连接?
  2. 它在做一些明智的事情吗? (即服务器可能有问题)还是这里有问题?

我的基本方法是将所有内容从 servlet 的请求对象复制到 apache 组件 httpclient 请求并执行。更具体地说,我:

  1. 创建一个 apache commons httpclient DefaultHttpClient 对象,
  2. 将所有请求 header 复制到一个新的请求对象中,
  3. 使用我要代理的主机/端口在新请求上设置(/覆盖)host header ,
  4. 将所有 HTTP 参数复制到新请求中,
  5. 将任何实体主体复制到新请求中,
  6. 执行请求,
  7. 将响应 header 复制到我的 servlet 的响应 header ,并且
  8. 将任何实体主体作为流复制到 servlet 的输出流。

导致我出现问题的是最后一个。它似乎在一个 block 中途失败,我得到以下堆栈跟踪:

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)

我已经用 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

以我有限的理解,FIN means 'I'm done sending' ,IMO 足够公平,因为客户端 header 已经发送。然而,RST/reset 似乎只是试图断开连接。

客户端的 HTTP header 是:

GET /some/path?params=values HTTP/1.1
connection: Keep-Alive
host: target.host.com
accept: */*
user-agent: Wget/1.14 (linux-gnu)

对于服务器:

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

顺便说一句,这个问题:[restlet ]TruncatedChunkException:看起来很相似,但似乎没有任何有用的信息。

更新: 我已经尝试使用非分块网站 (/. :-) ),但同样失败了:

org.apache.http.ConnectionClosedException: Premature end of Content-Length delimited message body

最佳答案

好的,我知道我做了什么。我太早清理了我的连接——基本上我的连接方法中的样板文件有一个

finally
{
client.getConnectionManager().shutdown();
}

但是方法返回的是stream对象,所以关机时读取还没有完成。

关于java - HttpClient 抛出 TruncatedChunkException 访问大块资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18820867/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com