Composants client et serveur HTTP/3 pour Delphi et C++ Builder | Blog eSeGeCe

Composants client et serveur HTTP/3 pour Delphi et C++ Builder

· Composants
Composants client et serveur HTTP/3 sgcQUIC

L'article d'hier présentait le transport QUIC brut de sgcQUIC. Aujourd'hui, nous examinons la couche qui s'appuie dessus : HTTP/3 (RFC 9114). Deux composants, TsgcHTTP3Client et TsgcHTTP3Server, apportent le transport web moderne à Delphi, C++ Builder et .NET.

HTTP/3 conserve la sémantique des requêtes et des réponses que vous connaissez déjà de HTTP/1.1 et HTTP/2, mais les exécute sur QUIC au lieu de TCP. Les en-têtes sont compressés avec QPACK (RFC 9204), et comme QUIC multiplexe les flux de façon indépendante, un paquet perdu ne bloque plus toutes les requêtes de la connexion.

Le client HTTP/3

Connectez-vous à un hôte, puis appelez l'une des méthodes de verbe. Get renvoie le corps sous forme de chaîne, et la réponse complète, y compris le code de statut et les en-têtes, est transmise à 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;

Tous les verbes HTTP sont disponibles : Get, Head, Post, Put, Delete, Patch, Options, Trace, Connect et Query. Chacun possède un équivalent asynchrone (GetAsync, PostAsync, etc.) qui renvoie immédiatement et rapporte le résultat via OnResponse.

QPACK et Alt-Svc

QPACK compresse les en-têtes des requêtes et des réponses à l'aide d'une table dynamique transportée sur des flux d'encodeur et de décodeur dédiés. Vous pouvez l'ajuster via Settings :

oClient.Settings.QPACKMaxTableCapacity := 4096;
oClient.Settings.MaxFieldSectionSize   := 65536;

De nombreux serveurs répondent encore à la première requête via HTTP/1.1 ou HTTP/2 et annoncent HTTP/3 dans un en-tête Alt-Svc (RFC 7838). L'événement OnAltSvc fait remonter cette annonce, afin qu'un client puisse découvrir le point de terminaison HTTP/3 et basculer lors de la requête suivante.

Le serveur HTTP/3

Le serveur hérite de son écouteur QUIC et de ses options de certificat de la couche QUIC, il se configure donc de la même manière, avec un port ainsi qu'un certificat et une clé PEM. Chaque requête déclenche OnH3Request, où vous remplissez l'objet réponse.

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;

Push serveur, tunnels et WebTransport

Les composants implémentent également l'ensemble plus large des fonctionnalités de HTTP/3. Un serveur peut pousser une ressource avant que le client ne la demande avec PushPromise, et le client la reçoit via OnPushPromise. Le CONNECT étendu (RFC 9220) ouvre des tunnels sur un flux HTTP/3, et WebTransport s'appuie sur le même mécanisme pour offrir des flux bidirectionnels et des datagrammes destinés aux applications en temps réel.

Disponibilité

sgcQUIC est un paquet distinct, sous licence en tant qu'extension de sgcWebSockets Enterprise, et il inclut à la fois les composants QUIC et HTTP/3. Chaque licence est livrée avec le code source Pascal complet et un an de mises à jour. Les composants s'installent dans la palette SGC QUIC et prennent en charge Delphi et C++ Builder 7 à 13, ainsi qu'un portage .NET avec les mêmes noms de classe Tsgc.

Téléchargez la version d'essai et consultez la référence complète sur la page produit de sgcQUIC.

Des questions ou des commentaires ? Contactez-nous, vous recevrez une réponse des personnes qui ont écrit le code.