TsgcHTTP3Server

TsgcHTTP3Server implementa un servidor HTTP/3 (RFC 9114) que sirve solicitudes HTTP sobre QUIC.

Introducción

TsgcHTTP3Server implementa un servidor HTTP/3 tal como se define en RFC 9114. HTTP/3 transporta solicitudes y respuestas HTTP sobre QUIC (un transporte basado en UDP con TLS 1.3 integrado), por lo que cada conexión está cifrada y multiplexada sin bloqueo de cabeza de línea. Por defecto el servidor se ejecuta sobre el listener QUIC nativo proporcionado por OpenSSL 3.5 o posterior, y recurre al motor QUIC propio de sgc cuando ese listener no está disponible (vea QUICMode), por lo que no se requiere ninguna biblioteca HTTP/3 externa.

Siga los pasos que se indican a continuación para configurar este componente:

1. Cree una nueva instancia de TsgcHTTP3Server y establezca el Port en el que el servidor escuchará (HTTP/3 utiliza UDP).

2. Establezca el certificado y la clave privada en QUICOptions.SSLOptions. QUIC exige TLS, por lo que se requiere un certificado.

3. Gestione el evento OnH3Request, rellene la respuesta y llame a Start. El parámetro aResponse lo crea el servidor (el código de estado es 200 de forma predeterminada); establezca su StatusCode, ContentType y cuerpo, y el servidor lo envía de vuelta automáticamente cuando el controlador retorna. ejemplo:


    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;

Referencia

Propiedades clave

NombreDescripción
PortPuerto UDP en el que escucha el servidor HTTP/3.
QUICOptionsOpciones de transporte QUIC, incluidos el certificado, la clave privada y los límites de conexión.
H3SettingsAjustes del protocolo HTTP/3 (QPACK y límites de la sección de campos) anunciados a los peers.

Métodos clave

NombreDescripción
StartInicia el listener QUIC y comienza a aceptar conexiones HTTP/3.
StopDetiene el listener y cierra todas las conexiones activas.
SendResponseEnvía una respuesta HTTP/3 en un stream de solicitud.

Eventos clave

NombreDescripción
OnH3RequestSe activa cuando se recibe una solicitud HTTP/3 completa para que la aplicación pueda rellenar la respuesta.
OnH3ConnectSe activa cuando un cliente establece una conexión HTTP/3.
OnH3DisconnectSe activa cuando se cierra una conexión HTTP/3.

Ejemplo completo

El siguiente ejemplo inicia un servidor HTTP/3 que enruta un par de rutas y devuelve un cuerpo JSON o de texto plano. La respuesta se rellena dentro de OnH3Request y el servidor la envía automáticamente.


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;

Requisitos