TsgcHTTP3Server implémente un serveur HTTP/3 (RFC 9114) qui traite les requêtes HTTP via QUIC.
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;
| Nom | Description |
|---|---|
| Port | Port UDP sur lequel le serveur HTTP/3 écoute. |
| QUICOptions | Options de transport QUIC, incluant le certificat, la clé privée et les limites de connexion. |
| H3Settings | Paramètres de protocole HTTP/3 (limites QPACK et de section de champ) annoncés aux pairs. |
| Nom | Description |
|---|---|
| Start | Démarre le listener QUIC et commence à accepter des connexions HTTP/3. |
| Stop | Arrête le listener et ferme toutes les connexions actives. |
| SendResponse | Envoie une réponse HTTP/3 sur un flux de requête. |
| Nom | Description |
|---|---|
| OnH3Request | Se déclenche lorsqu'une requête HTTP/3 complète est reçue afin que l'application puisse remplir la réponse. |
| OnH3Connect | Se déclenche lorsqu'un client établit une connexion HTTP/3. |
| OnH3Disconnect | Se déclenche lorsqu'une connexion HTTP/3 est fermée. |
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;
SGC_HTTP3 activée.sgcHTTP3_Server à la clause uses.QUICOptions.SSLOptions.IOHandler = iohOpenSSL, qui fournit le listener QUIC natif. Il n'y a pas de repli sur une version antérieure d'OpenSSL. Avec iohNativeTLS, OpenSSL n'est pas nécessaire.