Obsługiwane przez
HTTPCompression kompresuje odpowiedzi HTTP/1.1 przy użyciu gzip lub deflate, zanim zostaną wysłane do klienta, gdy klient zgłasza ich obsługę za pomocą nagłówka żądania Accept-Encoding. Dotyczy to zarówno plików statycznych serwowanych z DocumentRoot, jak i odpowiedzi budowanych samodzielnie w OnCommandGet. Domyślnie jest wyłączona, więc istniejące aplikacje nie są dotknięte, dopóki jej nie włączysz.
To inna funkcja niż Kompresja, która kompresuje wiadomości WebSocket przy użyciu protokołu PerMessage_Deflate. HTTPCompression dotyczy wyłącznie zwykłych żądań i odpowiedzi HTTP/1.1; nie ma wpływu na ruch WebSocket, a Kompresja nie ma wpływu na odpowiedzi HTTP.
Aby ją włączyć, ustaw:
HTTPCompression / Enabled
Można również dostosować jej ustawienia:
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 — kodowania, których serwer może używać; domyślnie zarówno gzip, jak i deflate. Gdy klient akceptuje oba, preferowany jest gzip.
ContentTypes — lista typów treści kwalifikujących się do kompresji, obsługiwane są symbole wieloznaczne, takie jak „text/*"; domyślnie obejmuje typowe typy tekstowe, JSON, JavaScript, XML i SVG.
Serwer negocjuje kodowanie na podstawie nagłówka Accept-Encoding żądania, traktując wartość jakości 0 jako odmowę (na przykład „gzip;q=0"). Nigdy nie kompresuje odpowiedzi, która już ma Content-Encoding, kod stanu 204/304/1xx, strumień Server-Sent Events lub treść, która nie stałaby się mniejsza. Gdy kompresuje odpowiedź, ustawia jej nagłówek Content-Encoding i dodaje Vary: Accept-Encoding, aby pamięci podręczne poprawnie różnicowały klucz według kodowania.
HTTPCompression obecnie dotyczy wyłącznie odpowiedzi HTTP/1.1; ta właściwość nie kompresuje odpowiedzi HTTP/2. Jeśli kompresowana treść łączy sekret (na przykład token CSRF) z danymi kontrolowanymi przez atakującego w ramach połączenia TLS, należy pamiętać, że to właśnie kompresja odpowiedzi umożliwia ataki z klasy 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;