TsgcHTTP3Server

TsgcHTTP3Server implementuje serwer HTTP/3 (RFC 9114), który obsługuje żądania HTTP przez QUIC.

Wprowadzenie

TsgcHTTP3Server implementuje serwer HTTP/3 zgodnie z definicją w RFC 9114. HTTP/3 przenosi żądania i odpowiedzi HTTP przez QUIC (transport oparty na UDP z wbudowanym TLS 1.3), więc każde połączenie jest szyfrowane i multipleksowane bez blokowania head-of-line. Domyślnie serwer działa na natywnym nasłuchiwaczu QUIC dostarczonym przez OpenSSL 3.5 lub nowszy, a gdy ten nasłuchiwacz jest niedostępny, korzysta z własnego silnika QUIC sgc (zobacz QUICMode), więc nie jest wymagana żadna zewnętrzna biblioteka HTTP/3.

Należy wykonać poniższe kroki w celu skonfigurowania tego komponentu:

1. Utwórz nową instancję TsgcHTTP3Server i ustaw Port, na którym serwer będzie nasłuchiwać (HTTP/3 używa UDP).

2. Ustaw certyfikat i klucz prywatny we właściwości QUICOptions.SSLOptions. Protokół QUIC wymaga TLS, więc certyfikat jest obowiązkowy.

3. Obsłuż zdarzenie OnH3Request, wypełnij odpowiedź i wywołaj Start. Parametr aResponse jest tworzony przez serwer (domyślny kod statusu to 200); ustaw jego StatusCode, ContentType i treść, a serwer automatycznie odeśle odpowiedź po powrocie z procedury obsługi. przykład:


    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;

Dokumentacja

Kluczowe właściwości

NazwaOpis
PortPort UDP, na którym nasłuchuje serwer HTTP/3.
QUICOptionsOpcje transportu QUIC, w tym certyfikat, klucz prywatny i limity połączeń.
H3SettingsUstawienia protokołu HTTP/3 (QPACK i limity sekcji pól) ogłaszane partnerom.

Kluczowe metody

NazwaOpis
StartUruchamia nasłuch QUIC i rozpoczyna akceptowanie połączeń HTTP/3.
StopZatrzymuje nasłuch i zamyka wszystkie aktywne połączenia.
SendResponseWysyła odpowiedź HTTP/3 na strumieniu żądania.

Kluczowe zdarzenia

NazwaOpis
OnH3RequestWywoływane po odebraniu kompletnego żądania HTTP/3, aby aplikacja mogła wypełnić odpowiedź.
OnH3ConnectUruchamiane, gdy klient nawiązuje połączenie HTTP/3.
OnH3DisconnectUruchamiane, gdy połączenie HTTP/3 zostaje zamknięte.

Kompletny przykład

Poniższy przykład uruchamia serwer HTTP/3, który obsługuje kilka ścieżek i zwraca treść JSON lub zwykłego tekstu. Odpowiedź jest wypełniana wewnątrz OnH3Request i wysyłana automatycznie przez serwer.


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;

Wymagania