De post van gisteren introduceerde het ruwe QUIC-transport in sgcQUIC. Vandaag bekijken we de laag die daarbovenop zit: HTTP/3 (RFC 9114). Twee componenten, TsgcHTTP3Client en TsgcHTTP3Server, brengen het moderne webtransport naar Delphi, C++ Builder en .NET.
HTTP/3 behoudt de request- en response-semantiek die u al kent van HTTP/1.1 en HTTP/2, maar voert deze uit over QUIC in plaats van TCP. Headers worden gecomprimeerd met QPACK (RFC 9204), en omdat QUIC streams onafhankelijk multiplext, blokkeert een verloren pakket niet langer elke request op de verbinding.
De HTTP/3-client
Maak verbinding met een host en roep vervolgens een van de verb-methoden aan. Get geeft de body als een string terug, en de volledige response, inclusief statuscode en headers, wordt afgeleverd aan 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;
Elke HTTP-verb is beschikbaar: Get, Head, Post, Put, Delete, Patch, Options, Trace, Connect en Query. Elk daarvan heeft een asynchrone tegenhanger (GetAsync, PostAsync, enzovoort) die meteen terugkeert en het resultaat rapporteert via OnResponse.
QPACK en Alt-Svc
QPACK comprimeert request- en response-headers met behulp van een dynamische tabel die op speciale encoder- en decoderstreams wordt meegevoerd. U kunt dit afstemmen via Settings:
oClient.Settings.QPACKMaxTableCapacity := 4096;
oClient.Settings.MaxFieldSectionSize := 65536;
Veel servers beantwoorden de eerste request nog steeds over HTTP/1.1 of HTTP/2 en adverteren HTTP/3 in een Alt-Svc-header (RFC 7838). De OnAltSvc-event brengt die advertentie naar boven, zodat een client het HTTP/3-eindpunt kan ontdekken en bij de volgende request kan upgraden.
De HTTP/3-server
De server erft zijn QUIC-listener en certificaatopties van de QUIC-laag, dus hij wordt op dezelfde manier geconfigureerd, met een poort en een PEM-certificaat en -sleutel. Elke request activeert OnH3Request, waar u het response-object invult.
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, tunnels en WebTransport
De componenten implementeren ook de bredere HTTP/3-featureset. Een server kan een resource pushen voordat de client erom vraagt met PushPromise, en de client ontvangt deze via OnPushPromise. Extended CONNECT (RFC 9220) opent tunnels over een HTTP/3-stream, en WebTransport bouwt voort op hetzelfde mechanisme om bidirectionele streams en datagrammen aan te bieden voor realtime-applicaties.
Beschikbaarheid
sgcQUIC is een apart pakket, gelicentieerd als een add-on voor sgcWebSockets Enterprise, en het bevat zowel de QUIC- als de HTTP/3-componenten. Elke licentie wordt geleverd met volledige Pascal-broncode en een jaar aan updates. De componenten installeren op het SGC QUIC-palet en ondersteunen Delphi en C++ Builder 7 tot en met 13, plus een .NET-port met dezelfde Tsgc-klassenamen.
Download de trial en lees de volledige referentie op de sgcQUIC-productpagina.
Vragen of feedback? Neem contact op, u krijgt antwoord van de mensen die de code hebben geschreven.
