TsgcHTTP3Server

TsgcHTTP3Server implementeert een HTTP/3-server (RFC 9114) die HTTP-verzoeken via QUIC afhandelt.

Inleiding

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;

Referentie

Belangrijkste Eigenschappen

NaamBeschrijving
PortUDP-poort waarop de HTTP/3-server luistert.
QUICOptionsQUIC-transportopties, inclusief het certificaat, de privésleutel en verbindingslimieten.
H3SettingsHTTP/3-protocolinstellingen (QPACK en veldsectie-limieten) die aan peers worden geadverteerd.

Belangrijkste Methoden

NaamBeschrijving
StartStart de QUIC-listener en begint HTTP/3-verbindingen te accepteren.
StopStopt de listener en sluit alle actieve verbindingen.
SendResponseVerstuurt een HTTP/3-antwoord op een verzoek-stream.

Belangrijkste Gebeurtenissen

NaamBeschrijving
OnH3RequestWordt geactiveerd wanneer een volledig HTTP/3-verzoek is ontvangen zodat de applicatie het antwoord kan invullen.
OnH3ConnectWordt geactiveerd wanneer een client een HTTP/3-verbinding tot stand brengt.
OnH3DisconnectWordt geactiveerd wanneer een HTTP/3-verbinding wordt gesloten.

Volledig voorbeeld

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;

Vereisten