Wenn der Webserver eine gzip-Antwort senden kann, warum kann der Browser dann keine gzip-Anfrage senden?
Antworten:
Der Client und der Server müssen sich auf die Kommunikation einigen. Ein Teil davon ist, ob die Kommunikation komprimiert werden kann. HTTP wurde als Anforderungs- / Antwortmodell konzipiert, und die ursprüngliche Erstellung sollte mit ziemlicher Sicherheit immer kleine Anforderungen und potenziell große Antworten enthalten. Für die Implementierung von HTTP ist keine Komprimierung erforderlich . Es gibt sowohl Server als auch Clients, die dies nicht unterstützen.
Die HTTP-Komprimierung wird vom Client implementiert und gibt an, dass sie die Komprimierung unterstützen kann. Wenn der Server dies in der Anforderung sieht und die Komprimierung unterstützt, kann er die Antwort komprimieren. Um die Anforderung zu komprimieren, müsste der Client eine "Voranforderung" haben, die tatsächlich ausgehandelt hat, dass die Anforderung komprimiert werden soll, ODER es müsste eine Komprimierung als unterstützte Codierung für ALLE Anforderungen erforderlich sein.
* UPDATE Feb '17 * Es sind 8 Jahre vergangen, aber wie @ Phil_1984_ feststellt, besteht eine dritte mögliche Lösung darin, dass Client und Server die Komprimierungsunterstützung aushandeln und diese dann für nachfolgende Anforderungen verwenden. Tatsächlich funktionieren Dinge wie HSTS genau so mit dem Client-Caching, dass der Server erwartet, nur TLS zu sprechen und unverschlüsselte Links zu ignorieren. HTTP wurde explizit als zustandslos konzipiert, aber wir sind an dieser Stelle darüber hinausgegangen.
Ein Client kann nicht im Voraus wissen, dass ein Server eine komprimierte Anforderung verstehen würde, aber der Server kann wissen, dass der Client eine akzeptiert.
Es könnte, vorausgesetzt es könnte garantieren, dass der Server es akzeptieren würde. Dies kann die Verwendung einer OPTIONS-Anforderung bedeuten.
Es gibt eine Menge Dinge, die Webbrowser tun könnten (zum Beispiel Pipelining), die sie nicht tun. Webbrowser-Entwickler berücksichtigen die Auswirkungen einer Änderung auf die Kompatibilität.
In einer heterogenen Umgebung gibt es viele verschiedene Webserver und Konfigurationen. Wenn Sie die Arbeitsweise eines Kunden ändern, können einige davon beschädigt werden.
Möglicherweise akzeptiert nur 1% der Server komprimierte Anforderungen, aber möglicherweise geben einige von ihnen dies an, können dies jedoch nicht korrekt akzeptieren. Daher wird Benutzern das Hochladen von Dateien auf diese Websites verweigert.
In der Vergangenheit gab es viele fehlerhafte Client / Server-Implementierungen - lange Zeit waren komprimierte Antworten in den wichtigsten Webbrowsern fehlerhaft (zum Glück sind diese jetzt größtenteils verschwunden).
Sie würden also schwarze Listen von Benutzeragenten oder Servern (oder Domänennamen) erhalten, auf denen diese Optionen automatisch deaktiviert wurden, was unangenehm ist.
Weil es nicht weiß, dass der Server es akzeptieren kann. Bei einer HTTP-Transaktion wird eine einzelne Anforderung vom Client gesendet, gefolgt von einer Antwort. Der Client sendet unter anderem, welche Codierung / Komprimierung er unterstützen kann. Der Server kann dann entscheiden, wie die Antwort komprimiert werden soll. Der Kunde hat diesen Luxus nicht.
Wenn Sie eine Webanwendung schreiben, gehe ich davon aus, dass Sie die Kontrolle darüber haben, was an den Client gesendet und was vom Client zurückgesendet wird.
Es wäre einfach genug, eine gzip-Implementierung in Javascript zu schreiben, die die an den Server gesendeten Post-Daten komprimiert. Der Server könnte einen Filter (j2ee-Begriff) haben, der weiß, dass Clientdaten komprimiert gesendet werden. Dieser Filter dekomprimiert die Daten und übergibt die Daten dann an das Servlet (oder die Aktionsklassen in Struts), das die Daten wie gewohnt liest, z. B. request.getParameter ( ...).
Dies scheint vollkommen logisch und machbar, wenn Sie die Kontrolle haben. Wie in anderen Beiträgen erwähnt, können Sie sich nicht darauf verlassen, dass der Browser dies automatisch ausführt. Da Sie jedoch die Webseiten schreiben, können Sie den Browser dazu bringen, die gewünschte Komprimierung durchzuführen (mit ein wenig Arbeit).
Andy.
HTTP ist folgendermaßen aufgebaut:
ABER IN DIESEM DESIGN kann der Client keine komprimierten Anforderungen senden, da er nicht weiß, ob der Server dies im Voraus versteht.