TsgcHTTP3Server implementeert een HTTP/3-server (RFC 9114) die HTTP-verzoeken via QUIC afhandelt.
TsgcHTTP3Server implementeert een HTTP/3-server zoals gedefinieerd in RFC 9114. HTTP/3 draagt HTTP-aanvragen en -responsen via QUIC (een op UDP gebaseerd transport met ingebouwde TLS 1.3), zodat elke verbinding versleuteld en gemultiplexed is zonder head-of-line blokkering. Standaard draait de server op de native QUIC-listener van OpenSSL 3.5 of hoger, en valt terug op de sgc QUIC-engine wanneer die listener niet beschikbaar is (zie QUICMode), zodat er geen externe HTTP/3-bibliotheek nodig is.
Volg de onderstaande stappen om dit component te configureren:
1. Maak een nieuw exemplaar van TsgcHTTP3Server aan en stel de Port in waarop de server luistert (HTTP/3 gebruikt UDP).
2. Stel het certificaat en de privésleutel in bij QUICOptions.SSLOptions. QUIC vereist TLS, dus een certificaat is vereist.
3. Behandel de OnH3Request-gebeurtenis, vul het antwoord in en roep Start aan. De aResponse-parameter wordt aangemaakt door de server (statuscode is standaard 200); stel de StatusCode, ContentType en body in, en de server verstuurt het automatisch terug wanneer de handler terugkeert. voorbeeld:
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;
| Naam | Beschrijving |
|---|---|
| Port | UDP-poort waarop de HTTP/3-server luistert. |
| QUICOptions | QUIC-transportopties, inclusief het certificaat, de privésleutel en verbindingslimieten. |
| H3Settings | HTTP/3-protocolinstellingen (QPACK en veldsectie-limieten) die aan peers worden geadverteerd. |
| Naam | Beschrijving |
|---|---|
| Start | Start de QUIC-listener en begint HTTP/3-verbindingen te accepteren. |
| Stop | Stopt de listener en sluit alle actieve verbindingen. |
| SendResponse | Verstuurt een HTTP/3-antwoord op een verzoek-stream. |
| Naam | Beschrijving |
|---|---|
| OnH3Request | Wordt geactiveerd wanneer een volledig HTTP/3-verzoek is ontvangen zodat de applicatie het antwoord kan invullen. |
| OnH3Connect | Wordt geactiveerd wanneer een client een HTTP/3-verbinding tot stand brengt. |
| OnH3Disconnect | Wordt geactiveerd wanneer een HTTP/3-verbinding wordt gesloten. |
Het volgende voorbeeld start een HTTP/3-server die een aantal paden verwerkt en een JSON- of plain-text-body retourneert. Het antwoord wordt ingevuld in OnH3Request en automatisch door de server verstuurd.
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 voorwaardelijke definitie ingeschakeld.sgcHTTP3_Server toe aan de uses-clausule.QUICOptions.SSLOptions.IOHandler = iohOpenSSL. Met iohNativeTLS is geen OpenSSL nodig.