Wczorajszy wpis przedstawił surowy transport QUIC w sgcQUIC. Dziś przyglądamy się warstwie, która działa nad nim: HTTP/3 (RFC 9114). Dwa komponenty, TsgcHTTP3Client i TsgcHTTP3Server, wnoszą nowoczesny transport internetowy do Delphi, C++ Builder i .NET.
HTTP/3 zachowuje semantykę żądań i odpowiedzi, którą znasz już z HTTP/1.1 i HTTP/2, ale uruchamia ją na QUIC zamiast na TCP. Nagłówki są kompresowane za pomocą QPACK (RFC 9204), a ponieważ QUIC multipleksuje strumienie niezależnie, utracony pakiet nie wstrzymuje już każdego żądania na połączeniu.
Klient HTTP/3
Połącz się z hostem, a następnie wywołaj jedną z metod czasownikowych. Get zwraca treść jako łańcuch znaków, a pełna odpowiedź, w tym kod statusu i nagłówki, jest dostarczana do OnResponse.
uses
sgcHTTP3_Client;
var
oClient: TsgcHTTP3Client;
vBody: string;
begin
oClient := TsgcHTTP3Client.Create(nil);
oClient.OnResponse := OnResponse;
oClient.OnAltSvc := OnAltSvc;
oClient.Connect('www.example.com', 443);
vBody := oClient.Get('https://www.example.com/');
end;
procedure TForm1.OnResponse(Sender: TObject; aResponse: TsgcHTTP3Response);
begin
Memo1.Lines.Add('status ' + IntToStr(aResponse.StatusCode));
Memo1.Lines.Add(aResponse.GetDataAsString);
end;
Dostępny jest każdy czasownik HTTP: Get, Head, Post, Put, Delete, Patch, Options, Trace, Connect i Query. Każdy z nich ma asynchroniczny odpowiednik (GetAsync, PostAsync i tak dalej), który natychmiast zwraca sterowanie i raportuje wynik przez OnResponse.
QPACK i Alt-Svc
QPACK kompresuje nagłówki żądań i odpowiedzi za pomocą tabeli dynamicznej przenoszonej na dedykowanych strumieniach kodera i dekodera. Możesz go dostroić za pomocą Settings:
oClient.Settings.QPACKMaxTableCapacity := 4096;
oClient.Settings.MaxFieldSectionSize := 65536;
Wiele serwerów nadal odpowiada na pierwsze żądanie przez HTTP/1.1 lub HTTP/2 i ogłasza HTTP/3 w nagłówku Alt-Svc (RFC 7838). Zdarzenie OnAltSvc ujawnia to ogłoszenie, dzięki czemu klient może wykryć punkt końcowy HTTP/3 i przejść na niego przy następnym żądaniu.
Serwer HTTP/3
Serwer dziedziczy swój nasłuchiwacz QUIC oraz opcje certyfikatu z warstwy QUIC, więc konfiguruje się go w ten sam sposób, za pomocą portu oraz certyfikatu i klucza PEM. Każde żądanie wyzwala OnH3Request, gdzie wypełniasz obiekt odpowiedzi.
uses
sgcHTTP3_Server;
var
oServer: TsgcHTTP3Server;
begin
oServer := TsgcHTTP3Server.Create(nil);
oServer.Port := 443;
oServer.QUICOptions.SSLOptions.CertFile := 'cert.pem';
oServer.QUICOptions.SSLOptions.KeyFile := 'key.pem';
oServer.OnH3Request := OnH3Request;
oServer.Active := True;
end;
procedure TForm1.OnH3Request(Sender: TObject;
const aConnection: TsgcQUICServerConnection;
const aRequest: TsgcHTTP3Request; const aResponse: TsgcHTTP3Response);
begin
aResponse.StatusCode := 200;
aResponse.ContentType := 'text/plain';
aResponse.Data := TEncoding.UTF8.GetBytes('Hello from HTTP/3');
end;
Server Push, tunele i WebTransport
Komponenty implementują również szerszy zestaw funkcji HTTP/3. Serwer może wypchnąć zasób, zanim klient o niego poprosi, za pomocą PushPromise, a klient otrzymuje go przez OnPushPromise. Rozszerzone CONNECT (RFC 9220) otwiera tunele przez strumień HTTP/3, a WebTransport opiera się na tym samym mechanizmie, aby oferować dwukierunkowe strumienie i datagramy dla aplikacji czasu rzeczywistego.
Dostępność
sgcQUIC to osobny pakiet, licencjonowany jako dodatek do sgcWebSockets Enterprise, i obejmuje zarówno komponenty QUIC, jak i HTTP/3. Każda licencja zawiera pełny kod źródłowy w Pascalu oraz rok aktualizacji. Komponenty instalują się na palecie SGC QUIC i obsługują Delphi oraz C++ Builder od wersji 7 do 13, a także port .NET z tymi samymi nazwami klas Tsgc.
Pobierz wersję próbną i przeczytaj pełną dokumentację na stronie produktu sgcQUIC.
Masz pytania lub uwagi? Skontaktuj się z nami, otrzymasz odpowiedź od osób, które napisały ten kod.
