TsgcHTTP3Server implementa um servidor HTTP/3 (RFC 9114) que atende requisições HTTP sobre QUIC.
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;
| Name | Descrição |
|---|---|
| Port | Porta UDP em que o servidor HTTP/3 escuta. |
| QUICOptions | Opções de transporte QUIC, incluindo o certificado, a chave privada e os limites de conexão. |
| H3Settings | Configurações do protocolo HTTP/3 (limites QPACK e de seção de campo) anunciadas aos pares. |
| Name | Descrição |
|---|---|
| Start | Inicia o QUIC listener e começa a aceitar conexões HTTP/3. |
| Stop | Para o listener e fecha todas as conexões ativas. |
| SendResponse | Envia uma resposta HTTP/3 em um stream de requisição. |
| Name | Descrição |
|---|---|
| OnH3Request | Disparado 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. |
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;
SGC_HTTP3 habilitado.sgcHTTP3_Server à cláusula uses.QUICOptions.SSLOptions.IOHandler = iohOpenSSL, que fornece o listener QUIC nativo. Com iohNativeTLS o OpenSSL não é necessário.