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.
