Ist es möglich, die http-Komprimierung für Anforderungen zu aktivieren?

35

Ich sehe viele Informationen zum Aktivieren der HTTP-Komprimierung für Serverantworten, aber was ist mit eingehenden Anforderungen? Wäre es nicht sinnvoll, wenn die Browser große Formulare komprimieren, bevor sie sie an den Server senden?

Ein weiteres Beispiel ist ein REST-Webdienst, den wir verwenden. Wir müssen häufige PUT-Anfragen mit großen XML-Dateien (10+ MB) senden und würden auf beiden Seiten definitiv einige Bandbreiten- / Geschwindigkeitsvorteile sehen.

Handelt es sich also um ein behobenes Problem auf der Serverseite oder muss jede Webanwendung es einzeln behandeln?

Mike L
quelle

Antworten:

30

Um PUTDaten auf den Server zu komprimieren, müssen Sie den Anforderungshauptteil komprimieren und den Content-Encoding: gzipHeader festlegen . Der Header selbst muss dekomprimiert sein. Es ist in mod_deflate dokumentiert :

Das Modul mod_deflate bietet auch einen Filter zum Dekomprimieren eines mit gzip komprimierten Anforderungskörpers. Um diese Funktion zu aktivieren, müssen Sie den DEFLATE-Filter mit SetInputFilter oder AddInputFilter in die Eingabefilterkette einfügen.

...

Wenn eine Anfrage nun einen Content-Encoding: gzip-Header enthält, wird der Body automatisch dekomprimiert. Nur wenige Browser sind in der Lage, Anfragekörper zu gzipen. Einige spezielle Anwendungen unterstützen jedoch tatsächlich die Anforderungskomprimierung, beispielsweise einige WebDAV-Clients.

Und ein Artikel, der dies beschreibt, ist hier :

Also, wie machst du das? Hier ist ein Klappentext, ebenfalls aus dem mod_deflate-Quellcode: Arbeite nur an Hauptanfragen / keinen Unteranfragen. Dies bedeutet, dass der gesamte Inhalt der Anforderung mit gzip komprimiert werden muss, wenn wir dies verwenden möchten. Es ist nicht möglich, nur den Teil zu komprimieren, der die Datei enthält, beispielsweise in einer mehrteiligen Anforderung.

Unabhängig davon kann ein Browser - Server Antwortinhalt anfordern , indem Sie komprimiert werden Accept-EncodingHeader per hier :

GET /index.html HTTP/1.1
Host: www.http-compression.com
Accept-Encoding: gzip
User-Agent: Firefox/1.0

Dadurch werden komprimierte Daten an den Browser zurückgegeben.

Andy
quelle
5
+1 NB Du schreibst you must compress the whole request, inclusive of header. Die http-Header dürfen jedoch nicht komprimiert werden . Das einzige, was komprimiert werden muss (vollständig, wie der Artikel, den Sie korrekt zitieren, angibt), ist der http-Body.
Eugene Beresovsky
1
Dies ist falsch: Accept-Encodingteilt dem Server mit, welche Komprimierung der Client unterstützt. Der Header Content-Encodingbeschreibt die Kompression des Körpers.
Maaartinus
@ maaartinus siehe erstes Zitat, zweiter Absatz. Ich habe die Antwort aus Gründen der Klarheit neu organisiert.
Andy
4

Beantwortung des Teils über komprimierte Anfragen, nicht Antworten: Ja, es ist möglich, auch wenn es nicht in weit verbreiteter Verwendung zu sein scheint. Die clientseitige App muss den entsprechenden Header für die Inhaltscodierung festlegen. Für die serverseitige App gibt es zwei Möglichkeiten:

  1. Die App unterstützt das erneute Aufblasen des Anfragetexts von selbst. Eine Beispielbibliothek, die dies tun kann, ist phpxmlrpc.

  2. Der Webserver bläst den Antworttext auf, bevor er ihn an die App weiterleitet. Dies ist zB mit dem mod_deflate-Filter von Apache und dem Einrichten eines inputFilter möglich

gggeek
quelle
2

Von keinem mir bekannten Browser aus müssten Sie ein Plugin finden, das dies für Sie erledigt. Grundsätzlich müssen Sie den HTTP-Header für die Inhaltskodierung festlegen, um dem Server mitzuteilen, wie die Anforderung eingeht. Der Server muss natürlich in der Lage sein, diese Kodierung zu verarbeiten.

Squillman
quelle
0

Das ist nicht erlaubt. Gemäß der HTTP-Spezifikation ( RFC 2616 ) Content-Encodingist NICHT eines der möglichen Anforderungsheaderfelder, daher ist es nicht möglich, den Hauptteil der Anforderungsentität zu komprimieren, da es keine legale Möglichkeit gibt, dem Server mitzuteilen, dass dies aufgetreten ist. Eine Komprimierung des Anforderungshauptteils erfolgt nur als nicht standardmäßige Erweiterung.

Steve
quelle
12
Diese Antwort ist falsch RFC 2616 ausdrücklich erwähnt , dass If the content-coding of an entity in a request message is not acceptable to the origin server, the server SHOULD respond with a status code of 415 (Unsupported Media Type).weiterhin durch angegeben Request and Response messages MAY transfer an entity if not otherwise restricted by the request methodund Content-Encodingals Option in aufgelistet werdenentity-header
PeterT