2016-09-07 1 views
0

Ich bin dabei, eine HTTP-Chunked-Anforderung an ein internes System zu senden. Ich habe bestätigt, dass andere Faktoren nicht im Spiel sind, indem ich sicherstelle, dass ich kleine Nachrichten ohne Chunk-Encoding senden kann.HttpServletRequest.getInputStream() entpackt keine Chunked-HTTP-Anforderung

Mein Prozess war im Grunde zu ändern, die Transfer-Encoding Header zu chunked und ich habe die Content-Length Header entfernt. Zusätzlich benutze ich eine interne ChunkedOutputStream, die es schon seit einiger Zeit gibt.

Ich bin in der Lage zu verbinden, erhalten einen Ausgabestrom und senden die Daten. Der Empfänger gibt dann eine 200 Antwort zurück, so scheint es, dass die Anfrage empfangen und erfolgreich behandelt wurde. Der Endpunkt empfängt die HTTP-Anforderung und leitet die Daten direkt in eine Tabelle (unter Verwendung von HttpServletRequest.getInputStream()).

Beim Überprüfen der gestreamten Daten kann ich sehen, dass die Chunk-Codierungsinformationen im Stream nicht automatisch vom Tomcat-Container ausgepackt/decodiert wurden. Ich habe die Tomcat HTTPConnector Dokumentation gecrawlt und kann nichts finden, das auf die chunked Kodierung w.r.t verweist, wie eine Chunk codierte Nachricht innerhalb einer HttpServlet behandelt werden sollte. Ich kann keine anderen StackOverflow-Fragen sehen, die das abfragen, also vermute ich, dass mir etwas Grundlegendes fehlt.

Meine Frage läuft darauf hinaus:

  • Should Tomcat automatisch die aufgeteilte Codierung von meinem Wunsch dekodieren und gib mir eine „saubere“ InputStream wenn ich HttpServletRequest.getInputStream() nennen?
  • Wenn ja, muss die Konfiguration aktualisiert werden, um diese Funktionalität zu aktivieren? Sende ich in den Headern etwas falsches, das den nicht decodierten Stream zurückgibt?
  • Wenn nein, ist es allgemeine Praxis, Eingangsstrom in eine ChunkedInputStream oder etwas Ähnliches zu wickeln, wenn die Transfer-Encoding Kopfzeile vorhanden ist?

Antwort

0

Dies ist gelöst. Wie erwartet war es in meinem Fall grundlegend.

Das Legacy-System, das ich verwendet habe, bietet handgerollte Methoden, um den Vorgang des Öffnens einer HTTP-Verbindung zu vereinfachen, Header zu senden und dann einen OutputStream zu verwenden, um den Inhalt über einen POST zu senden. Ich wusste nicht, und es war an einem ziemlich obskuren Ort, aber die Behind-the-scenes-Helfer identifizieren wir, dass ich nicht mit einem Content-Length so die TRANSFER_ENCODING=chunked Header hinzugefügt wurde und den OutputStream in einem ChunkedOutputStream verpackt. Dies führte dazu, dass ich die Inhalte doppelt codierte, daher meine Endpunkte (scheinbar) Unfähigkeit, sie zu entschlüsseln.

Gehäuse geschlossen.

+0

Sie sollten 'HttpURLConnection' verwendet haben. Es hat bereits Chunking eingebaut. Ich weiß nicht, warum Leute das Rad immer wieder neu erfinden. – EJP

+0

stimme voll und ganz zu. Wirklich, es war eine reine Aufsicht meinerseits. Das Legacy-System ist 15+ Jahre alt und ich bin nicht überrascht, dass die Dinge dort suboptimal sind, trotzdem hätte ich es bemerken müssen. –

Verwandte Themen