Komponenty klienta i serwera HTTP/3 dla Delphi i C++ Builder | eSeGeCe Blog

Komponenty klienta i serwera HTTP/3 dla Delphi i C++ Builder

· Komponenty
Komponenty klienta i serwera HTTP/3 sgcQUIC

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.