HttpClient jette TruncatedChunkException accéder à de vastes ressources chunked

[à l'aide de httpcore 4.1.4, httpclient 4.2.5, Oracle JDK 1.7.0_25]

Je suis en train de 'proxy' une connexion à un tiers de service web pour le compte d'une webapp du javascript (AJAX) et le code, il semble échouer sur grand chunked réponses, erroring mi-chemin à travers un morceau par l'envoi de plusieurs Ear et en jetant un org.apache.http.TruncatedChunkException.

Alors je me demandais:

  1. pourquoi est client http en essayant de supprimer la connexion?
  2. est-il en train de faire quelque chose d'intelligent? (ie. le serveur est probablement une faute) ou est-il quelque chose de buggy qui se passe ici?

Mon approche de base est de tout copier à partir d'une servlet l'objet de demande à apache de composants httpclient demande et de l'exécuter. Plus specfically, j':

  1. créer un apache commons httpclient DefaultHttpClient objet,
  2. copie de tous les en-têtes de requête à travers une nouvelle demande d'objet,
  3. set (/remplacer) le host en-tête sur la nouvelle demande auprès de l'hôte/port je suis la transmission par proxy,
  4. copier tous les paramètres HTTP à la nouvelle demande,
  5. copier tout corps d'entité dans la nouvelle demande,
  6. l'exécution de la demande,
  7. copie en-têtes de réponse à ma servlet-têtes de réponse, et
  8. copier tout corps d'entité comme un flux à travers la servlet flux de sortie.

Le bit de me causer des problèmes est le dernier. Il semble échouer mi-chemin à travers un morceau et j'ai le 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)

J'ai snooped avec Wireshark et d'obtenir un processus quelque chose comme ceci:

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

Dans ma compréhension limitée, FIN signifie "je suis fait envoyer', qui OMI est assez juste, car le client en-têtes sont déjà envoyés. Cependant TVD/reset semble tout simplement essayer de laisser tomber la connexion.

Les en-têtes HTTP pour le client sont les suivantes:

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

Et pour le serveur:

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

btw, cette question: [restlet ]TruncatedChunkException: ressemble, mais ne semble pas avoir toute info utile.

Mise à jour: j'ai essayé avec un non-chunked site (/. 🙂 ) et il échoue de la même façon avec:

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

OriginalL'auteur Phasmal | 2013-09-16