2009-02-27 14 views
7

Chcę sprawdzić, czy serwer WWW ma włączoną kompresję http, a konkretna kompresja (np. Gzip, Deflate, Compress) jest włączona?Jak sprawdzić programowo, czy serwer WWW ma włączoną kompresję http?

Lub Jeśli zażądam danych za pośrednictwem obiektu WebClient w .NET, ustawiając opcję Accept-Encoding na "gzip, deflate" skąd mogę wiedzieć, czy pobrane dane są skompresowane przed ich przetworzeniem?

Odpowiedz

9

Aby sprawdzić, jakie jest kodowanie treści odpowiedzi, należy sprawdzić nagłówek odpowiedzi HTTP: Kodowanie treści.

Serwer może używać tylko kodowań określonych przez nagłówek żądania akceptującego kodowanie. Jeśli serwer nie może udzielić odpowiedzi za pomocą jednego z określonych kodów akceptujących, musi odpowiedzieć 406 (nie do przyjęcia).

Przykład wniosek:

GET/HTTP/1.1 
Host: www.brianbondy.com 
Accept-Encoding: gzip,deflate 

Przykład reakcji:

HTTP/1.1 200 OK 
Date: Thu, 04 Dec 2003 16:15:12 GMT 
Server: Apache/2.0 
Content-Encoding: gzip 
Content-Length: 1533 

Inne przykłady Accept-Encoding:

Accept-Encoding: compress, gzip 
Accept-Encoding: 
Accept-Encoding: * 
Accept-Encoding: compress;q=0.5, gzip;q=1.0 
Accept-Encoding: gzip;q=1.0, identity; q=0.5, *;q=0 

Jak dokładnie wiedzieć, jakie są dostępne na serwerze kodowania:

Nie ma sposobu, aby wiedzieć dokładnie, jakie są dostępne kodowania na poziomie serwera, ponieważ niektóre serwery mogą obsługiwać pewne kodowania tylko dla niektórych typów plików.

Oznacza to, że najlepiej jest odpowiedzieć na pytanie: Czy dla pliku określonego w pierwszym wierszu żądania dostępne jest określone kodowanie tego pliku? Możesz na to odpowiedzieć, jawnie odmawiając kodowania treści tożsamości i określając kodowanie, o którym chcesz wiedzieć.

Accept-Encoding: gzip, identity;q=0 

Source of examples, HTTP RFC

+0

Ale kodowanie tożsamości (czyli bez kompresji) jest zawsze dozwolone, chyba że wyraźnie zabraniają.Więc jeśli serwer zwraca kodowanie treści: tożsamość, nadal nie wiesz, czy obsługuje kompresję, czy nie; mógł po prostu nie kompresować tej konkretnej odpowiedzi. – Thomas

+0

zaktualizowany opis –

+0

Masz na myśli 'gzip, tożsamość; q = 0' zamiast' gzip; tożsamość; q = 0''? – Pacerier

4

Z HTTP spec:

4. Kodowanie treści "tożsamości" jest zawsze akceptowalne, chyba że konkretnie odmówiono, ponieważ pole Accept-Encoding zawiera "tożsamość; q = 0", lub ponieważ pole zawiera "*; q = 0" i czy nie zawiera wyraźnie kodowanie treści "tożsamości". Jeśli wartość pola Accept-Encoding jest pusta, dopuszczalne jest tylko kodowanie "tożsamości" .

Jeśli ustawisz Accept-Encoding: identity;q=0, gzip, deflate, zmusisz serwer do skompresowania lub zwróci 406 (niedozwolone).

+0

O ile mi wiadomo, Microsoft-IIS/7.0 tego nie szanuje. Czy Apache to szanuje? A może apache po prostu zwróciłby tożsamość zamiast 406 (podobnie jak Microsoft-IIS)? – Pacerier