O post de ontem apresentou o transporte QUIC bruto no sgcQUIC. Hoje vamos olhar para a camada que fica acima dele: HTTP/3 (RFC 9114). Dois componentes, TsgcHTTP3Client e TsgcHTTP3Server, trazem o transporte web moderno para Delphi, C++ Builder e .NET.
O HTTP/3 mantém a semântica de requisição e resposta que você já conhece do HTTP/1.1 e HTTP/2, mas as executa sobre QUIC em vez de TCP. Os cabeçalhos são comprimidos com QPACK (RFC 9204) e, como o QUIC multiplexa os streams de forma independente, um pacote perdido não trava mais todas as requisições da conexão.
O Cliente HTTP/3
Conecte-se a um host e depois chame um dos métodos de verbo. Get retorna o corpo como uma string, e a resposta completa, incluindo o código de status e os cabeçalhos, é entregue ao OnResponse.
uses
sgcHTTP3_Client;
var
oClient: TsgcHTTP3Client;
vBody: string;
begin
oClient := TsgcHTTP3Client.Create(nil);
oClient.OnResponse := OnResponse;
oClient.OnAltSvc := OnAltSvc;
oClient.Connect('www.example.com', 443);
vBody := oClient.Get('https://www.example.com/');
end;
procedure TForm1.OnResponse(Sender: TObject; aResponse: TsgcHTTP3Response);
begin
Memo1.Lines.Add('status ' + IntToStr(aResponse.StatusCode));
Memo1.Lines.Add(aResponse.GetDataAsString);
end;
Todos os verbos HTTP estão disponíveis: Get, Head, Post, Put, Delete, Patch, Options, Trace, Connect e Query. Cada um tem uma contraparte assíncrona (GetAsync, PostAsync, e assim por diante) que retorna imediatamente e reporta o resultado através do OnResponse.
QPACK e Alt-Svc
O QPACK comprime os cabeçalhos de requisição e resposta usando uma tabela dinâmica transportada em streams dedicados de codificação e decodificação. Você pode ajustá-lo através de Settings:
oClient.Settings.QPACKMaxTableCapacity := 4096;
oClient.Settings.MaxFieldSectionSize := 65536;
Muitos servidores ainda respondem à primeira requisição sobre HTTP/1.1 ou HTTP/2 e anunciam o HTTP/3 em um cabeçalho Alt-Svc (RFC 7838). O evento OnAltSvc expõe esse anúncio, para que um cliente possa descobrir o endpoint HTTP/3 e fazer o upgrade na próxima requisição.
O Servidor HTTP/3
O servidor herda seu listener QUIC e as opções de certificado da camada QUIC, então é configurado da mesma forma, com uma porta e um certificado e chave PEM. Cada requisição dispara OnH3Request, onde você preenche o objeto de resposta.
uses
sgcHTTP3_Server;
var
oServer: TsgcHTTP3Server;
begin
oServer := TsgcHTTP3Server.Create(nil);
oServer.Port := 443;
oServer.QUICOptions.SSLOptions.CertFile := 'cert.pem';
oServer.QUICOptions.SSLOptions.KeyFile := 'key.pem';
oServer.OnH3Request := OnH3Request;
oServer.Active := True;
end;
procedure TForm1.OnH3Request(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 from HTTP/3');
end;
Server Push, Túneis e WebTransport
Os componentes também implementam o conjunto mais amplo de recursos do HTTP/3. Um servidor pode enviar um recurso antes de o cliente solicitá-lo com PushPromise, e o cliente o recebe através do OnPushPromise. O CONNECT estendido (RFC 9220) abre túneis sobre um stream HTTP/3, e o WebTransport se apoia no mesmo mecanismo para oferecer streams bidirecionais e datagramas para aplicações em tempo real.
Disponibilidade
O sgcQUIC é um pacote separado, licenciado como um add-on para o sgcWebSockets Enterprise, e inclui tanto os componentes QUIC quanto os HTTP/3. Cada licença vem com o código-fonte Pascal completo e um ano de atualizações. Os componentes são instalados na paleta SGC QUIC e suportam Delphi e C++ Builder 7 até 13, além de uma versão .NET com os mesmos nomes de classe Tsgc.
Baixe a versão de avaliação e leia a referência completa na página do produto sgcQUIC.
Dúvidas ou comentários? Entre em contato, você receberá uma resposta das pessoas que escreveram o código.
