HttpClient бросает TruncatedChunkException доступ к большому фрагментированному ресурсу

[использование httpcore 4.1.4, httpclient 4.2.5, Oracle JDK 1.7.0_25]

Я пытаюсь "прокси" подключение к сторонней веб-службе от имени кода javascript (AJAX) webapp, и, похоже, не удается на большом chunked ответы, ошибки частично через кусок, отправив несколько RSTs и бросив org.apache.http.TruncatedChunkException.

поэтому мне интересно:

  1. почему http-клиент пытается удалить соединение?
  2. он что-то делает разумно? (т. возможно, сервер виноват) или здесь что-то не так?

мой основной подход-скопировать все из объекта запроса сервлета в запрос компонентов Apache httpclient и выполнить. Более specfically, я:

  1. создайте объект Apache commons httpclient DefaultHttpClient,
  2. скопируйте все заголовки запросов в новый объект запроса,
  3. установить (/переопределить)host заголовок на новом запрос с хостом / портом, на который я проксирую,
  4. скопируйте все параметры HTTP в новый запрос,
  5. скопируйте любое тело сущности в новый запрос,
  6. выполнить запрос,
  7. скопируйте заголовки ответов в заголовки ответов моего сервлета и
  8. скопируйте любое тело сущности в виде потока в выходной поток сервлета.

бит, который вызывает у меня проблемы, является последним. Это, кажется, не половина пути через чанк и я получаем следующий stacktrace:

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 означает "я закончил посылать", что ИМО достаточно справедливо, так как заголовки клиентов уже отправлены. Однако 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)

и для сервер:

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

1 ответов


хорошо, я узнал, что я сделал. Я слишком рано очистил свое соединение - в основном шаблон в моем методе соединения имел

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

но метод вернул объект stream, поэтому чтение не было завершено при завершении работы.