TsgcHTTP3Server

TsgcHTTP3Server implementa um servidor HTTP/3 (RFC 9114) que atende requisições HTTP sobre QUIC.

Introdução

TsgcHTTP3Server implementa um servidor HTTP/3 conforme definido na RFC 9114. HTTP/3 transporta requisições e respostas HTTP sobre QUIC (um transporte baseado em UDP com TLS 1.3 integrado), portanto toda conexão é criptografada e multiplexada sem head-of-line blocking. Por padrão o servidor roda sobre o listener QUIC nativo fornecido pelo OpenSSL 3.5 ou posterior, recorrendo ao mecanismo QUIC sgc quando esse listener não está disponível (veja QUICMode), portanto nenhuma biblioteca HTTP/3 externa é necessária.

Siga os passos abaixo para configurar este componente:

1. Crie uma nova instância de TsgcHTTP3Server e defina a Port em que o servidor irá escutar (HTTP/3 usa UDP).

2. Defina o certificado e a chave privada em QUICOptions.SSLOptions. O QUIC exige TLS, portanto um certificado é obrigatório.

3. Trate o evento OnH3Request, preencha a resposta e chame Start. O parâmetro aResponse é criado pelo servidor (o código de status padrão é 200); defina StatusCode, ContentType e o corpo, e o servidor o envia de volta automaticamente quando o handler retorna. exemplo:


    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;

Referência

Principais Propriedades

NameDescrição
PortPorta UDP em que o servidor HTTP/3 escuta.
QUICOptionsOpções de transporte QUIC, incluindo o certificado, a chave privada e os limites de conexão.
H3SettingsConfigurações do protocolo HTTP/3 (limites QPACK e de seção de campo) anunciadas aos pares.

Métodos Principais

NameDescrição
StartInicia o QUIC listener e começa a aceitar conexões HTTP/3.
StopPara o listener e fecha todas as conexões ativas.
SendResponseEnvia uma resposta HTTP/3 em um stream de requisição.

Eventos Principais

NameDescrição
OnH3RequestDisparado quando uma requisição HTTP/3 completa é recebida para que a aplicação possa preencher a resposta.
OnH3ConnectÉ disparado quando um cliente estabelece uma conexão HTTP/3.
OnH3DisconnectÉ disparado quando uma conexão HTTP/3 é fechada.

Exemplo Completo

O exemplo a seguir inicia um servidor HTTP/3 que roteia alguns caminhos e retorna um corpo JSON ou texto simples. A resposta é preenchida dentro de OnH3Request e enviada automaticamente pelo servidor.


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