Czy można włączyć kompresję HTTP dla żądań?

35

Widzę wiele informacji na temat włączania kompresji HTTP dla odpowiedzi serwera, ale co z przychodzącymi żądaniami. Czy nie ma sensu, aby przeglądarki kompresowały duże posty przed wysłaniem ich na serwer?

Innym przykładem jest usługa internetowa REST, z której korzystamy. Musimy wysyłać częste żądania PUT z dużymi plikami XML (10+ MB) i na pewno dostrzegamy pewne korzyści z przepustowości / prędkości po obu stronach.

Czy to rozwiązany problem po stronie serwera, czy też każda aplikacja internetowa musi sobie z tym poradzić indywidualnie?

Mike L.
źródło

Odpowiedzi:

30

Aby PUTdane do serwera były skompresowane, należy skompresować treść żądania i ustawić Content-Encoding: gzipnagłówek. Sam nagłówek musi być nieskompresowany. Jest to udokumentowane w mod_deflate :

Moduł mod_deflate zapewnia również filtr do dekompresji kompresowanego żądania gzip. Aby aktywować tę funkcję, należy wstawić filtr DEFLATE do łańcucha filtrów wejściowych za pomocą SetInputFilter lub AddInputFilter.

...

Teraz, jeśli żądanie zawiera nagłówek Content-Encoding: gzip, treść zostanie automatycznie zdekompresowana. Niewiele przeglądarek ma możliwość zgzipowania treści żądań. Jednak niektóre specjalne aplikacje faktycznie obsługują kompresję żądań, na przykład niektórzy klienci WebDAV.

I artykuł opisujący to jest tutaj :

Jak to robisz? Oto napis, ponownie z kodu źródłowego mod_deflate: działa tylko na żądanie główne / brak żądań podrzędnych. Oznacza to, że cała treść żądania musi zostać skompresowana przez gzip, jeśli zdecydujemy się go użyć, nie jest możliwe skompresowanie tylko części zawierającej plik, na przykład w żądaniu wieloczęściowym.

Oddzielnie przeglądarka może zażądać skompresowania treści odpowiedzi serwera, ustawiając Accept-Encodingnagłówek zgodnie z poniższym opisem :

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

Spowoduje to zwrócenie skompresowanych danych do przeglądarki.

Andy
źródło
5
+1 NB Piszesz you must compress the whole request, inclusive of header. Nagłówków http nie można jednak kompresować . Jedyną rzeczą, którą należy skompresować (w całości, jak prawidłowo cytowany artykuł), jest treść http.
Eugene Beresovsky
1
To źle: Accept-Encodinginformuje serwer, jaką kompresję obsługuje klient. Nagłówek Content-Encodingopisuje kompresję ciała.
maaartinus,
@maaartinus patrz pierwszy cytat drugi akapit. Zorganizowałem odpowiedź dla większej przejrzystości.
Andy,
4

Odpowiadanie na część dotyczącą skompresowanych żądań, a nie odpowiedzi: tak, jest to możliwe, nawet jeśli nie wydaje się być w powszechnym użyciu. Aplikacja po stronie klienta musi ustawić odpowiedni nagłówek kodowania treści. Jeśli chodzi o aplikację po stronie serwera, istnieją 2 opcje:

  1. aplikacja sama obsługuje ponowne napełnienie treści żądania. Przykładową biblioteką, która może to zrobić, jest biblioteka phpxmlrpc.

  2. serwer WWW napełnia treść odpowiedzi przed przekazaniem jej do aplikacji. Jest to możliwe przy użyciu np. Filtru mod_deflate Apache i skonfigurowania inputFilter

gggeek
źródło
2

Nie natywnie z żadnej znanej mi przeglądarki, musisz znaleźć wtyczkę, która by to zrobiła za Ciebie. Zasadniczo musisz ustawić nagłówek HTTP kodujący zawartość, aby serwer wiedział, w jaki sposób nadchodzi żądanie. Serwer oczywiście musi być w stanie obsłużyć to kodowanie.

squillman
źródło
0

To NIE jest dozwolone. Zgodnie ze specyfikacją HTTP ( RFC 2616 ) Content-EncodingNIE jest jednym z możliwych pól nagłówka żądania, dlatego nie można kompresować treści jednostki żądania, ponieważ nie ma legalnego sposobu, aby powiadomić serwer o tym zdarzeniu. Wszelkie kompresowanie treści żądania odbywa się tylko jako niestandardowe rozszerzenie.

Steve
źródło
12
Ta odpowiedź jest niepoprawna RFC 2616 wyraźnie wspomina, że 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).ponadto wskazano Request and Response messages MAY transfer an entity if not otherwise restricted by the request methodi Content-Encodingwymieniono ją jako opcję wentity-header
PeterT