2008-12-03 6 views
7

Ich mache eine HTTP-Verbindung zu einem IIS-Webserver und senden eine POST-Anfrage mit den Daten, die mit Transfer-Encoding: chunked codiert sind. Wenn ich dies tun, schließt IIS einfach die Verbindung ohne Fehlermeldung oder Statuscode. Nach dem HTTP 1.1 spec,Warum unterstützt IIS keine Chunked-Transfer-Codierung?

Alle HTTP/1.1 Anwendungen in der Lage sein muss, empfangen und entschlüsseln die „gestückelt“ Transfer-Codierung

so verstehe ich nicht, warum es (a) Handhabung nicht, dass Kodierung und (b) es sendet keinen Statuscode zurück. Wenn ich die Anforderung ändere, die Content-Length anstelle von Transfer-Encoding zu senden, ist die Abfrage erfolgreich, aber das ist nicht immer möglich.

Wenn ich das gleiche gegen Apache versuche, bekomme ich einen "411 Length required" Status und eine Meldung "chunked Transfer-Encoding verboten".

Warum unterstützen diese Server diese Codierung nicht?

Antwort

4

Mein Verständnis ist, dass chunked Codierung kann nur in einer HTTP-Antwort verwendet werden. Ein Chunked-Request-Body hätte die Eigenschaft, mit einem 1.0-Server inkompatibel zu sein, und in jedem Fall würde ein User-Agent nicht wissen, dass der Server ein 1.0-Server war, bis er die Anfrage bereits gesendet hatte.

Aber ich stimme zu, es ist unklar, aus der Dokumentation.

+3

Der Client konnte den Server unter anderem durch Senden einer HEAD-Anfrage abfragen.Lesen von RFC 2616, Abschnitt 3.6 besagt, dass der Server eine 501-Antwort senden muss, wenn er einen Header empfängt, der die Übertragung codiert, den er nicht versteht. Abschnitt 3.6.1 besagt, dass alle HTTP 1.1-Anwendungen in der Lage sein müssen, Chunked-Transfer-Coding zu empfangen und zu dekodieren. So scheint es für mich klar zu sein - Client-zu-Server-Kommunikation kann chunked werden. Ein häufiges Szenario ist das Hochladen von Dateien. – Cheeso

+1

Das ursprüngliche Poster erwähnte nicht, welche Version von IIS sie verwenden, aber IIS 7 unterstützt eingehende chunked Daten - ich habe eine C++ - Anwendung, die Anforderungen als Chunked-Daten an IIS 7 ohne Probleme sendet –

+1

Ich denke, Sie sind falsch . Server und Clients sollten chunked unterstützen (das heißt nicht, dass sie das tun). Ihr Argument, dass eine Inkompatibilität eintreten würde, ist nicht gültig, da jeder Client, der http1.1 unterstützt, auch verstehen sollte, wie er mit einem http1.0-Server kommuniziert. Siehe: http://www.jmarshall.com/easy/http/#http1.1s3 und: http://www.atnan.com/2008/8/8/transfer-encoding-chunked-chunky-http und: http : //www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.6 (Abschnitt 3.6.1 auch) –

-1

Meine einzige Vermutung ist, dass sie es aus Sicherheitsgründen nicht umgesetzt haben. In einer naiven Lösung wäre es einfach, einen DOS-Angriff zu starten, indem mehrere Chunked-Übertragungen gestartet werden, die niemals enden. Und eine komplexe Lösung, die für den DOS-Angriff verantwortlich sein könnte, ist den Aufwand wahrscheinlich nicht wert.

Natürlich kann ich für Apache oder IIS nicht sprechen, können Sie in der Lage sein, das Apache-Team direkt obwohl kontaktieren: http://httpd.apache.org/bug_report.html

ich mit MarkR einverstanden, dass ich immer aufgeteilte Codierung dachte nur als Antwort verwendet werden könnte, aber Die Dokumentation klingt so, als ob sie in einer Anfrage oder Antwort verwendet werden könnte.

+2

Clients können Chunked-Codierung verwenden. Dies ist von RFC2616 erlaubt. Zum Beispiel ist es in Datei-Upload-Szenarien nützlich. – Cheeso

+1

Sie könnten eine ähnliche DOS-Attacke ohne Chunked-Codierung trivialerweise einrichten. Fordern Sie eine Inhaltslänge von 1 auf, aber senden Sie niemals den Body. Erledigt. Ich denke, der Unterschied zu Chunked besteht darin, dass kein Content-Length-Header erforderlich ist, sodass Sie unbekannte Daten streamen können, die durch Schließen der Verbindung beendet werden. IIS schützt vor diesen Problemen mit einer maximalen Anforderungslänge und einem Anforderungstimeout. – MarkPflug

7

Werfen Sie einen Blick auf Ihren Kunden.

Beide IIS & Apache unterstützt POST-Anfragen mit Chunked Transfer-Encoding.

curl <upload-url> --form "[email protected]<local_file>" --header "Transfer-Encoding: chunked" 

die Übertragung Verify chunked Wireshark

2

mit geht es in beiden Richtungen: Sie können dies die curl utility Verwendung überprüfen. versuche, ein Bild 2MB ++ auf den Photobucket hochzuladen und aufzuzeichnen. Ihr Uploader lädt Chunked auf ihre Apache-Server.

-1

Dieser Befehl kam für mich zu retten!

C: \ Windows \ System32 \ Inetsrv \ Appcmd.exe set config -Abschnitt: httpCompression
- [name = 'gzip'] staticCompressionLevel. 9 - [name = 'gzip'] dynamicCompressionLevel. 4

gerettet mein Tag ... hoffe, es hilft jemand wie ich!

+0

Ich sehe nicht, was die Aktivierung von Chunked-Anfragen mit der Komprimierung zu tun hat. Downvoted. –

Verwandte Themen