Componentes HTTP/3 Cliente e Servidor para Delphi e C++ Builder | eSeGeCe Blog

Componentes HTTP/3 Cliente e Servidor para Delphi e C++ Builder

· Componentes
Componentes cliente e servidor HTTP/3 do sgcQUIC

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.