Kompresja HTTP

Obsługiwane przez

TsgcWebSocketHTTPServer

HTTPCompression kompresuje odpowiedzi HTTP/1.1 za pomocą gzip lub deflate, zanim zostaną wysłane do klienta, gdy klient zgłasza obsługę tej funkcji nagłówkiem żądania Accept-Encoding. Dotyczy zarówno plików statycznych serwowanych z DocumentRoot, jak i odpowiedzi, które budujesz samodzielnie w OnCommandGet. Jest domyślnie wyłączona, więc istniejące aplikacje nie są zmieniane, dopóki jej nie włączysz.

To inna funkcja niż Compression, która kompresuje wiadomości WebSocket przy użyciu protokołu PerMessage_Deflate. HTTPCompression wpływa wyłącznie na zwykłe żądania i odpowiedzi HTTP/1.1; nie ma wpływu na ruch WebSocket, a Compression nie ma wpływu na odpowiedzi HTTP.

Aby to włączyć, ustaw:

HTTPCompression / Enabled

Możesz też go dostroić:

Level — poziom kompresji od 0 (brak) do 9 (maksymalny); domyślnie 6.

MinSize — odpowiedzi mniejsze niż ta wartość, w bajtach, nie są kompresowane; domyślnie 1024.

Algorithms — które kodowania serwer może stosować; domyślnie zarówno gzip, jak i deflate. Gdy klient akceptuje oba, preferowany jest gzip.

ContentTypes — lista typów zawartości kwalifikujących się do kompresji, obsługiwane są symbole wieloznaczne, takie jak "text/*"; domyślnie obejmuje typowe typy text, JSON, JavaScript, XML i SVG.

Serwer negocjuje kodowanie na podstawie nagłówka Accept-Encoding żądania, traktując wartość jakości równą 0 jako odmowę (na przykład "gzip;q=0"). Nigdy nie kompresuje odpowiedzi, która ma już Content-Encoding, ma status 204/304/1xx, jest strumieniem Server-Sent Events lub ma treść, która po kompresji nie byłaby mniejsza. Gdy kompresuje, ustawia nagłówek Content-Encoding odpowiedzi i dodaje Vary: Accept-Encoding, aby pamięci podręczne poprawnie uwzględniały kodowanie w kluczu.

HTTPCompression dotyczy obecnie wyłącznie odpowiedzi HTTP/1.1; odpowiedzi HTTP/2 nie są kompresowane przez tę właściwość. Jeśli kompresujesz treść, która miesza sekret (taki jak token CSRF) z danymi kontrolowanymi przez atakującego, przesyłaną połączeniem TLS, pamiętaj, że to właśnie kompresja odpowiedzi umożliwia klasę ataków BREACH; jest to ogólna cecha kompresji HTTP, a nie coś specyficznego dla tej implementacji.


oServer := TsgcWebSocketHTTPServer.Create(nil);
oServer.DocumentRoot := 'C:\inetpub\wwwroot';
oServer.HTTPCompression.Enabled := true;
oServer.HTTPCompression.MinSize := 1024;
oServer.Active := true;