TsgcHTTP3Server implementa un servidor HTTP/3 (RFC 9114) que sirve solicitudes HTTP sobre QUIC.
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;
| Nombre | Descripción |
|---|---|
| Port | Puerto UDP en el que escucha el servidor HTTP/3. |
| QUICOptions | Opciones de transporte QUIC, incluidos el certificado, la clave privada y los límites de conexión. |
| H3Settings | Ajustes del protocolo HTTP/3 (QPACK y límites de la sección de campos) anunciados a los peers. |
| Nombre | Descripción |
|---|---|
| Start | Inicia el listener QUIC y comienza a aceptar conexiones HTTP/3. |
| Stop | Detiene el listener y cierra todas las conexiones activas. |
| SendResponse | Envía una respuesta HTTP/3 en un stream de solicitud. |
| Nombre | Descripción |
|---|---|
| OnH3Request | Se activa cuando se recibe una solicitud HTTP/3 completa para que la aplicación pueda rellenar la respuesta. |
| OnH3Connect | Se activa cuando un cliente establece una conexión HTTP/3. |
| OnH3Disconnect | Se activa cuando se cierra una conexión HTTP/3. |
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;
SGC_HTTP3 habilitada.sgcHTTP3_Server a la cláusula uses.iohNativeTLS no se necesita OpenSSL.