Der gestrige Beitrag stellte den reinen QUIC-Transport in sgcQUIC vor. Heute betrachten wir die Schicht, die darauf aufsetzt: HTTP/3 (RFC 9114). Zwei Komponenten, TsgcHTTP3Client und TsgcHTTP3Server, bringen den modernen Web-Transport zu Delphi, C++ Builder und .NET.
HTTP/3 behält die Anfrage- und Antwort-Semantik bei, die Sie bereits von HTTP/1.1 und HTTP/2 kennen, führt sie aber über QUIC statt über TCP aus. Header werden mit QPACK (RFC 9204) komprimiert, und da QUIC Streams unabhängig voneinander multiplext, blockiert ein verlorenes Paket nicht mehr jede Anfrage der Verbindung.
Der HTTP/3-Client
Verbinden Sie sich mit einem Host und rufen Sie dann eine der Verb-Methoden auf. Get gibt den Body als String zurück, und die vollständige Antwort, einschließlich Statuscode und Header, wird an OnResponse geliefert.
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;
Jedes HTTP-Verb ist verfügbar: Get, Head, Post, Put, Delete, Patch, Options, Trace, Connect und Query. Jedes hat ein asynchrones Gegenstück (GetAsync, PostAsync und so weiter), das sofort zurückkehrt und das Ergebnis über OnResponse meldet.
QPACK und Alt-Svc
QPACK komprimiert Anfrage- und Antwort-Header mithilfe einer dynamischen Tabelle, die über dedizierte Encoder- und Decoder-Streams übertragen wird. Sie können es über Settings anpassen:
oClient.Settings.QPACKMaxTableCapacity := 4096;
oClient.Settings.MaxFieldSectionSize := 65536;
Viele Server beantworten die erste Anfrage weiterhin über HTTP/1.1 oder HTTP/2 und kündigen HTTP/3 in einem Alt-Svc-Header an (RFC 7838). Das OnAltSvc-Ereignis macht diese Ankündigung sichtbar, sodass ein Client den HTTP/3-Endpunkt erkennen und bei der nächsten Anfrage darauf umsteigen kann.
Der HTTP/3-Server
Der Server erbt seinen QUIC-Listener und seine Zertifikatsoptionen von der QUIC-Schicht, wird also auf dieselbe Weise konfiguriert, mit einem Port sowie einem PEM-Zertifikat und -Schlüssel. Jede Anfrage löst OnH3Request aus, wo Sie das Antwortobjekt füllen.
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, Tunnel und WebTransport
Die Komponenten implementieren auch den erweiterten HTTP/3-Funktionsumfang. Ein Server kann mit PushPromise eine Ressource senden, bevor der Client sie anfordert, und der Client empfängt sie über OnPushPromise. Extended CONNECT (RFC 9220) öffnet Tunnel über einen HTTP/3-Stream, und WebTransport baut auf demselben Mechanismus auf, um bidirektionale Streams und Datagramme für Echtzeitanwendungen bereitzustellen.
Verfügbarkeit
sgcQUIC ist ein separates Paket, lizenziert als Add-on zu sgcWebSockets Enterprise, und enthält sowohl die QUIC- als auch die HTTP/3-Komponenten. Jede Lizenz wird mit vollständigem Pascal-Quellcode und einem Jahr Updates ausgeliefert. Die Komponenten werden auf der Palette SGC QUIC installiert und unterstützen Delphi und C++ Builder 7 bis 13, dazu ein .NET-Port mit denselben Tsgc-Klassennamen.
Laden Sie die Testversion herunter und lesen Sie die vollständige Referenz auf der sgcQUIC-Produktseite.
Fragen oder Feedback? Nehmen Sie Kontakt auf, Sie erhalten eine Antwort von den Menschen, die den Code geschrieben haben.
