Componenti client e server HTTP/3 per Delphi e C++ Builder | eSeGeCe Blog

Componenti client e server HTTP/3 per Delphi e C++ Builder

· Componenti
Componenti client e server HTTP/3 sgcQUIC

Il post di ieri ha presentato il trasporto QUIC grezzo in sgcQUIC. Oggi esaminiamo il livello che si trova al di sopra di esso: HTTP/3 (RFC 9114). Due componenti, TsgcHTTP3Client e TsgcHTTP3Server, portano il moderno trasporto web su Delphi, C++ Builder e .NET.

HTTP/3 mantiene la semantica di richiesta e risposta che già conosci da HTTP/1.1 e HTTP/2, ma la esegue su QUIC anziché su TCP. Le intestazioni sono compresse con QPACK (RFC 9204) e, poiché QUIC multiplexa i flussi in modo indipendente, un pacchetto perso non blocca più ogni richiesta sulla connessione.

Il client HTTP/3

Connettiti a un host, quindi chiama uno dei metodi verbo. Get restituisce il corpo come stringa e la risposta completa, incluso il codice di stato e le intestazioni, viene consegnata 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;

Ogni verbo HTTP è disponibile: Get, Head, Post, Put, Delete, Patch, Options, Trace, Connect e Query. Ognuno ha una controparte asincrona (GetAsync, PostAsync e così via) che restituisce immediatamente e riporta il risultato tramite OnResponse.

QPACK e Alt-Svc

QPACK comprime le intestazioni di richiesta e risposta utilizzando una tabella dinamica trasportata su flussi encoder e decoder dedicati. Puoi ottimizzarla tramite Settings:

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

Molti server rispondono ancora alla prima richiesta su HTTP/1.1 o HTTP/2 e annunciano HTTP/3 in un'intestazione Alt-Svc (RFC 7838). L'evento OnAltSvc espone tale annuncio, così un client può scoprire l'endpoint HTTP/3 e passare a esso alla richiesta successiva.

Il server HTTP/3

Il server eredita il proprio listener QUIC e le opzioni del certificato dal livello QUIC, quindi si configura allo stesso modo, con una porta e un certificato e una chiave PEM. Ogni richiesta genera OnH3Request, dove compili l'oggetto risposta.

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, tunnel e WebTransport

I componenti implementano anche l'insieme più ampio di funzionalità HTTP/3. Un server può inviare una risorsa prima che il client la richieda con PushPromise e il client la riceve tramite OnPushPromise. CONNECT esteso (RFC 9220) apre tunnel su un flusso HTTP/3 e WebTransport si basa sullo stesso meccanismo per offrire flussi bidirezionali e datagrammi per applicazioni in tempo reale.

Disponibilità

sgcQUIC è un pacchetto separato, concesso in licenza come componente aggiuntivo di sgcWebSockets Enterprise, e include sia i componenti QUIC che HTTP/3. Ogni licenza include il codice sorgente Pascal completo e un anno di aggiornamenti. I componenti si installano nella palette SGC QUIC e supportano Delphi e C++ Builder da 7 a 13, oltre a un port .NET con gli stessi nomi di classe Tsgc.

Scarica la versione di prova e leggi il riferimento completo nella pagina del prodotto sgcQUIC.

Domande o commenti? Contattaci, riceverai una risposta dalle persone che hanno scritto il codice.