Delphi HTTP/2-client & -server — Multiplexed, Streaming, Push

Een native Pascal-implementatie van RFC 9113 HTTP/2 — stream-multiplexing, HPACK header compression, flow control, server push en de WebSocket-over-HTTP/2-extensie (RFC 8441). Zelfde component, client of server, van Delphi 7 t/m Delphi 13.

Een pure-Pascal HTTP/2-stack

Geen dunne wrapper rondom WinHTTP of libcurl — een from-scratch-implementatie die je frame-niveau-controle geeft.

Een Delphi HTTP/2-client is niet langer optioneel: HTTP/2 is het wire-format dat het hele moderne web spreekt. Apple Push Notifications vereisen HTTP/2. Google API’s onderhandelen HTTP/2. AWS, Azure en CloudFront gebruiken HTTP/2 als standaard. En de winst is reeel: een enkele TCP/TLS-verbinding multiplexet tientallen in-flight requests, header-sets worden gecomprimeerd met HPACK, en de server kan resources pushen waarvoor de client nog niet heeft gevraagd. sgcWebSockets levert TsgcHTTP2Client (client) en HTTP/2-ondersteuning binnen TsgcWebSocketHTTPServer (server) — beide pure Pascal, beide draaiend op elk platform dat de Delphi-compiler target.

Een Delphi HTTP/2-server in dezelfde bibliotheek kan REST-API’s hosten, events naar langlevende clients pushen en WebSocket-upgrades over HTTP/2 (RFC 8441) accepteren — de standaardmanier waarop moderne infrastructuur WebSocket bovenop HTTP/2 / HTTP/3 laagt.

Client

TsgcHTTP2Client

Server

TsgcWebSocketHTTPServer met HTTP/2 ingeschakeld

Standaarden

RFC 9113 (HTTP/2), RFC 7541 (HPACK), RFC 8441 (WS-over-H2)

TLS

OpenSSL, SChannel, HTTP.sys — ALPN-onderhandeld

Waarom HTTP/2 telt

De vier grote winsten boven HTTP/1.1 — en de operationele details die ze laten werken.

Stream-multiplexing

Tot SETTINGS_MAX_CONCURRENT_STREAMS in-flight requests over een enkele TCP+TLS-verbinding — geen head-of-line blocking, geen connection pool te tunen.

HPACK-compressie

Per-verbinding statische + dynamische header-tabel elimineert de kilobytes herhaalde headers (cookies, user-agent, accept) die HTTP/1.1-verkeer opblazen.

Server push

Server kan preemptief resources sturen die de client nodig zal hebben (CSS, JS, JSON-sub-resources) voor de client erom vraagt — bespaar een request-round-trip.

Stream-prioriteiten

Per-stream-gewicht en dependency tree laten je de server vertellen het indexdocument te leveren voor de analytics-blob.

Flow control

Per-stream en per-verbinding WINDOW_UPDATE voorkomt dat een trage consumer de zender verzuipt — back-pressure ingebouwd in het wire-format.

ALPN-onderhandeling

TLS-laag ALPN onderhandelt h2 automatisch — de client en server zijn het eens over HTTP/2 voor de eerste request, met HTTP/1.1-fallback als de peer het niet spreekt.

WebSocket-over-HTTP/2

RFC 8441: tunnel een WebSocket-sessie binnen een HTTP/2-stream — loopt door elke HTTP/2-bewuste load balancer (Envoy, nginx, ALB, GCLB).

Trailers & gRPC-vriendelijk

HTTP-trailers (per RFC 7230) zijn first-class — het fundament voor gRPC’s status- / message-metadata.

Multiplexed GET-requests

Vuur 10 gelijktijdige GET’s op een enkele verbinding — HPACK en multiplexing maken dit routine.

uses
  sgcHTTP2_Client, sgcHTTP_Classes;

var
  HTTP2: TsgcHTTP2Client;
  i: Integer;
begin
  HTTP2 := TsgcHTTP2Client.Create(nil);
  HTTP2.Host := 'api.example.com';
  HTTP2.Port := 443;
  HTTP2.TLS  := True;
  HTTP2.TLSOptions.ALPNProtocols.Add('h2');
  HTTP2.OnResponse := DoResponse;

  HTTP2.Connect;

  // 10 concurrent GETs on ONE connection, ONE TLS handshake
  for i := 1 to 10 do
    HTTP2.Get(Format('/items/%d', [i]));
end;

procedure TForm1.DoResponse(Sender: TObject;
  const aStreamId: Cardinal;
  aHeaders: TsgcHTTP2Headers;
  aData: TBytes);
begin
  Memo1.Lines.Add(Format('stream %d  status %s  bytes %d',
    [aStreamId, aHeaders.Status, Length(aData)]));
end;

Push een sub-resource voordat de client erom vraagt

Roep binnen een OnCommandGet-handler PushPromise aan om preemptief /style.css naast /index.html te sturen.

uses
  sgcWebSocket, sgcHTTP_Classes;

procedure TForm1.WSServerCommandGet(Sender: TObject;
  aContext: TsgcWSConnection;
  ARequestInfo: TsgcWSRequestInfo;
  AResponseInfo: TsgcWSResponseInfo);
begin
  if ARequestInfo.URI = '/index.html' then
  begin
    // Push the CSS so the browser doesn’t round-trip for it
    AResponseInfo.PushPromise('/style.css');
    AResponseInfo.PushPromise('/app.js');

    AResponseInfo.ContentType := 'text/html; charset=utf-8';
    AResponseInfo.ContentText :=
      '<!doctype html><link rel="stylesheet" href="/style.css">' +
      '<script src="/app.js" defer></script>' +
      '<h1>HTTP/2 from Delphi</h1>';
  end;
end;

Waar HTTP/2 vereist is, niet optioneel

Apple Push Notifications

APNs accepteert alleen HTTP/2 — een persistente verbinding, duizenden streams per seconde, JWT- of certificaat-gebaseerde auth. Zie de Apple Push-pagina.

Google FCM v1

De HTTP v1 FCM-API draait op HTTP/2. Zie de Google FCM-pagina.

gRPC-services

gRPC is HTTP/2 met protobuf en trailers. De HTTP/2-stack hier is het fundament waarop een Pascal gRPC-client wordt gebouwd.

WebSocket-over-HTTP/2

De schoonste manier om WebSocket te deployen door moderne load balancers en CDN’s die HTTP/2 upstream verkiezen.

High-throughput REST-clients

Een verbinding, honderden in-flight requests — ideaal voor crawlers, marktdata-ingesters en fan-out-workers.

Long-poll-vervanger

Stream een JSON-lines- of SSE-stijl-response over een enkele HTTP/2-stream — back-pressure inbegrepen.

Diepere duiken

HTTP/2-referentie

Volledige componentreferentie voor de HTTP/2-client en -server.

HTTP/2-client

Speciale client-componentpagina.

HTTP/2-server

Speciale server-componentpagina.

WebSocket-component

WebSocket over HTTP/2 (RFC 8441) en over HTTP/1.1 (RFC 6455).

Blog: HTTP/2 initial server support

Oorspronkelijke aankondiging en ontwerpnotes.

Blog: HTTP/2 vs HTTP/1-prestaties

Benchmark-getallen voor multiplexing- en HPACK-winst.

Blog: HTTP/2-conformance-tests

De h2spec-suite tegen de server draaien.

Blog: APNs over HTTP/2

Praktisch HTTP/2-voorbeeld: APNs-notificaties.

Multiplex je requests vandaag

Download de proefversie — zowel de HTTP/2-client- als server-demo’s compileren out-of-the-box.