Componentes cliente y servidor HTTP/3 para Delphi y C++ Builder | Blog de eSeGeCe

Componentes cliente y servidor HTTP/3 para Delphi y C++ Builder

· Componentes
Componentes cliente y servidor HTTP/3 de sgcQUIC

El artículo de ayer presentaba el transporte QUIC en bruto de sgcQUIC. Hoy examinamos la capa que se sitúa encima: HTTP/3 (RFC 9114). Dos componentes, TsgcHTTP3Client y TsgcHTTP3Server, llevan el transporte web moderno a Delphi, C++ Builder y .NET.

HTTP/3 conserva la semántica de petición y respuesta que ya conoces de HTTP/1.1 y HTTP/2, pero la ejecuta sobre QUIC en lugar de TCP. Las cabeceras se comprimen con QPACK (RFC 9204) y, como QUIC multiplexa los flujos de forma independiente, un paquete perdido ya no bloquea todas las peticiones de la conexión.

El cliente HTTP/3

Conéctate a un host y luego llama a uno de los métodos de verbo. Get devuelve el cuerpo como una cadena, y la respuesta completa, incluidos el código de estado y las cabeceras, se entrega a 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 los verbos HTTP están disponibles: Get, Head, Post, Put, Delete, Patch, Options, Trace, Connect y Query. Cada uno tiene su contrapartida asíncrona (GetAsync, PostAsync, etc.) que retorna de inmediato e informa del resultado a través de OnResponse.

QPACK y Alt-Svc

QPACK comprime las cabeceras de petición y respuesta usando una tabla dinámica transportada en flujos de codificador y decodificador dedicados. Puedes ajustarlo mediante Settings:

oClient.Settings.QPACKMaxTableCapacity := 4096;
oClient.Settings.MaxFieldSectionSize   := 65536;

Muchos servidores todavía responden a la primera petición sobre HTTP/1.1 o HTTP/2 y anuncian HTTP/3 en una cabecera Alt-Svc (RFC 7838). El evento OnAltSvc expone ese anuncio, de modo que un cliente puede descubrir el extremo HTTP/3 y actualizarse en la siguiente petición.

El servidor HTTP/3

El servidor hereda su escucha QUIC y las opciones de certificado de la capa QUIC, por lo que se configura de la misma manera, con un puerto y un certificado y clave PEM. Cada petición dispara OnH3Request, donde rellenas el objeto de respuesta.

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úneles y WebTransport

Los componentes implementan también el conjunto más amplio de funciones de HTTP/3. Un servidor puede enviar un recurso antes de que el cliente lo solicite con PushPromise, y el cliente lo recibe a través de OnPushPromise. El CONNECT extendido (RFC 9220) abre túneles sobre un flujo HTTP/3, y WebTransport se apoya en el mismo mecanismo para ofrecer flujos bidireccionales y datagramas para aplicaciones en tiempo real.

Disponibilidad

sgcQUIC es un paquete independiente, con licencia como complemento de sgcWebSockets Enterprise, e incluye tanto los componentes QUIC como los de HTTP/3. Cada licencia se entrega con el código fuente Pascal completo y un año de actualizaciones. Los componentes se instalan en la paleta SGC QUIC y admiten Delphi y C++ Builder 7 a 13, además de un port a .NET con los mismos nombres de clase Tsgc.

Descarga la versión de prueba y consulta la referencia completa en la página del producto sgcQUIC.

¿Preguntas o comentarios? Ponte en contacto, recibirás respuesta de las personas que escribieron el código.