TsgcHTTP3Server

TsgcHTTP3Server implémente un serveur HTTP/3 (RFC 9114) qui traite les requêtes HTTP via QUIC.

Introduction

TsgcHTTP3Server implémente un serveur HTTP/3 tel que défini dans RFC 9114. HTTP/3 transporte les requêtes et réponses HTTP via QUIC (un transport basé sur UDP avec TLS 1.3 intégré), de sorte que chaque connexion est chiffrée et multiplexée sans blocage en tête de ligne. Par défaut, le serveur repose sur le listener QUIC natif fourni par OpenSSL 3.5 ou version ultérieure, et se replie sur le moteur QUIC sgc lorsque ce listener n'est pas disponible (voir QUICMode), donc aucune bibliothèque HTTP/3 externe n'est requise.

Suivez les étapes ci-dessous pour configurer ce composant :

1. Créez une nouvelle instance de TsgcHTTP3Server et définissez le Port sur lequel le serveur écoutera (HTTP/3 utilise UDP).

2. Définissez le certificat et la clé privée dans QUICOptions.SSLOptions. QUIC impose TLS, donc un certificat est requis.

3. Gérez l'événement OnH3Request, remplissez la réponse et appelez Start. Le paramètre aResponse est créé par le serveur (le code de statut est 200 par défaut) ; définissez son StatusCode, ContentType et corps, et le serveur le renvoie automatiquement lorsque le gestionnaire retourne. exemple :


    oServer := TsgcHTTP3Server.Create(nil);
    oServer.Port := 443;
    oServer.QUICOptions.SSLOptions.CertFile := 'cert.pem';
    oServer.QUICOptions.SSLOptions.KeyFile := 'key.pem';
    oServer.OnH3Request := OnH3RequestEvent;
    oServer.Start;

    procedure OnH3RequestEvent(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 HTTP/3');
    end;

Référence

Propriétés clés

NomDescription
PortPort UDP sur lequel le serveur HTTP/3 écoute.
QUICOptionsOptions de transport QUIC, incluant le certificat, la clé privée et les limites de connexion.
H3SettingsParamètres de protocole HTTP/3 (limites QPACK et de section de champ) annoncés aux pairs.

Méthodes clés

NomDescription
StartDémarre le listener QUIC et commence à accepter des connexions HTTP/3.
StopArrête le listener et ferme toutes les connexions actives.
SendResponseEnvoie une réponse HTTP/3 sur un flux de requête.

Événements clés

NomDescription
OnH3RequestSe déclenche lorsqu'une requête HTTP/3 complète est reçue afin que l'application puisse remplir la réponse.
OnH3ConnectSe déclenche lorsqu'un client établit une connexion HTTP/3.
OnH3DisconnectSe déclenche lorsqu'une connexion HTTP/3 est fermée.

Exemple complet

L'exemple suivant démarre un serveur HTTP/3 qui route quelques chemins et retourne un corps JSON ou texte brut. La réponse est remplie dans OnH3Request et envoyée automatiquement par le serveur.


oServer := TsgcHTTP3Server.Create(nil);
oServer.Port := 443;
oServer.QUICOptions.SSLOptions.CertFile := 'cert.pem';
oServer.QUICOptions.SSLOptions.KeyFile := 'key.pem';
oServer.OnH3Request := OnH3RequestEvent;
oServer.OnH3Connect := OnH3ConnectEvent;
oServer.OnH3Disconnect := OnH3DisconnectEvent;
oServer.Start;

procedure OnH3ConnectEvent(Sender: TObject; const aConnection:
    TsgcQUICServerConnection);
begin
  Log('HTTP/3 client connected: ' + aConnection.PeerIP);
end;

procedure OnH3DisconnectEvent(Sender: TObject; const aConnection:
    TsgcQUICServerConnection; aCode: Int64; const aReason: string);
begin
  Log('HTTP/3 client disconnected');
end;

procedure OnH3RequestEvent(Sender: TObject; const aConnection:
    TsgcQUICServerConnection; const aRequest: TsgcHTTP3Request;
    const aResponse: TsgcHTTP3Response);
begin
  if aRequest.Path = '/api/time' then
  begin
    aResponse.StatusCode := 200;
    aResponse.ContentType := 'application/json';
    aResponse.Data := TEncoding.UTF8.GetBytes(
      '{"time":"' + DateTimeToStr(Now) + '"}');
  end
  else
  begin
    aResponse.StatusCode := 404;
    aResponse.ContentType := 'text/plain';
    aResponse.Data := TEncoding.UTF8.GetBytes('Not Found');
  end;
end;

Prérequis