Klient i serwer HTTP/2 dla Delphi — Multipleksowany, strumieniowy, push

Natywna implementacja Pascala RFC 9113 HTTP/2 — multipleksowanie strumieni, kompresja nagłówków HPACK, kontrola przepływu, server push i rozszerzenie WebSocket-over-HTTP/2 (RFC 8441). Ten sam komponent, klient lub serwer, od Delphi 7 do Delphi 13.

Czysto pascalowy stos HTTP/2

Nie cienki wrapper wokół WinHTTP czy libcurl — implementacja od podstaw, która daje Ci kontrolę na poziomie ramki.

Klient HTTP/2 dla Delphi nie jest już opcjonalny: HTTP/2 to format wire, którym mówi cały nowoczesny web. Apple Push Notifications wymagają HTTP/2. API Google negocjują HTTP/2. AWS, Azure i CloudFront używają HTTP/2 jako domyślnego. A zyski są realne: pojedyncze połączenie TCP/TLS multipleksuje dziesiątki żądań w locie, zestawy nagłówków są kompresowane z HPACK, a serwer może pchać zasoby, o które klient jeszcze nie zapytał. sgcWebSockets dostarcza TsgcHTTP2Client (klient) i wsparcie HTTP/2 wewnątrz TsgcWebSocketHTTPServer (serwer) — oba czysto pascalowe, oba działające na każdej platformie, do której kompiluje się Delphi.

Serwer HTTP/2 dla Delphi w tej samej bibliotece może hostować API REST, pchać zdarzenia długotrwałym klientom i akceptować upgrade WebSocket nad HTTP/2 (RFC 8441) — standardowy sposób, w jaki nowoczesna infrastruktura nakłada WebSocket na wierzch HTTP/2 / HTTP/3.

Klient

TsgcHTTP2Client

Serwer

TsgcWebSocketHTTPServer z włączonym HTTP/2

Standardy

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

TLS

OpenSSL, SChannel, HTTP.sys — negocjowane ALPN

Dlaczego HTTP/2 ma znaczenie

Cztery duże wygrane nad HTTP/1.1 — i operacyjne szczegóły, które sprawiają, że działają.

Multipleksowanie strumieni

Do SETTINGS_MAX_CONCURRENT_STREAMS żądań w locie nad pojedynczym połączeniem TCP+TLS — bez head-of-line blocking, bez puli połączeń do strojenia.

Kompresja HPACK

Per-połączeniowa statyczna + dynamiczna tabela nagłówków eliminuje kilobajty powtarzających się nagłówków (ciasteczka, user-agent, accept), które rozdymają ruch HTTP/1.1.

Server push

Serwer może prewencyjnie wysłać zasoby, których klient będzie potrzebował (CSS, JS, subzasoby JSON), zanim klient o nie poprosi — tnij round-trip żądania.

Priorytety strumieni

Waga per-strumień i drzewo zależności pozwalają Ci powiedzieć serwerowi, by dostarczył dokument indeksu przed blobem analityki.

Kontrola przepływu

Per-strumień i per-połączenie WINDOW_UPDATE zapobiega zatopieniu nadawcy przez wolnego konsumenta — back-pressure wbudowana w format wire.

Negocjacja ALPN

ALPN warstwy TLS automatycznie negocjuje h2 — klient i serwer zgadzają się na HTTP/2 przed pierwszym żądaniem, z fallbackiem na HTTP/1.1, jeśli peer nim nie mówi.

WebSocket-over-HTTP/2

RFC 8441: tuneluj sesję WebSocket wewnątrz jednego strumienia HTTP/2 — przechodzi przez każdy load balancer świadomy HTTP/2 (Envoy, nginx, ALB, GCLB).

Trailery i przyjazne gRPC

Trailery HTTP (według RFC 7230) są pierwszą klasą — fundament metadanych status / message gRPC.

Multipleksowane żądania GET

Wystrzel 10 jednoczesnych GET na pojedynczym połączeniu — HPACK i multipleksowanie sprawiają, że to rutyna.

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 subzasobu, zanim klient zapyta

Wewnątrz handlera OnCommandGet wywołaj PushPromise, aby prewencyjnie wysłać /style.css obok /index.html.

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;

Gdzie HTTP/2 jest wymagane, nie opcjonalne

Apple Push Notifications

APNs akceptuje tylko HTTP/2 — jedno trwałe połączenie, tysiące strumieni na sekundę, auth oparty na JWT lub certyfikacie. Zobacz stronę Apple Push.

Google FCM v1

API HTTP v1 FCM działa na HTTP/2. Zobacz stronę Google FCM.

Usługi gRPC

gRPC to HTTP/2 z protobuf i trailerami. Stos HTTP/2 tutaj jest fundamentem, na którym buduje się klient gRPC dla Pascala.

WebSocket-over-HTTP/2

Najczystszy sposób wdrożenia WebSocket przez nowoczesne load balancery i CDN, które preferują HTTP/2 upstream.

Klienci REST o wysokiej przepustowości

Jedno połączenie, setki żądań w locie — idealne dla crawlerów, ingesterów danych rynkowych i pracowników fan-out.

Zastąpienie long-poll

Strumieniuj odpowiedź w stylu JSON-lines lub SSE nad pojedynczym strumieniem HTTP/2 — back-pressure wliczona.

Głębsze zanurzenia

Referencja HTTP/2

Pełna referencja komponentu dla klienta i serwera HTTP/2.

Klient HTTP/2

Dedykowana strona komponentu klienta.

Serwer HTTP/2

Dedykowana strona komponentu serwera.

Komponent WebSocket

WebSocket nad HTTP/2 (RFC 8441) i nad HTTP/1.1 (RFC 6455).

Blog: Początkowe wsparcie serwera HTTP/2

Oryginalne ogłoszenie i notatki projektowe.

Blog: Wydajność HTTP/2 vs HTTP/1

Liczby benchmarków dla zysków multipleksowania i HPACK.

Blog: Testy zgodności HTTP/2

Uruchamianie pakietu h2spec wobec serwera.

Blog: APNs nad HTTP/2

Praktyczny przykład HTTP/2: powiadomienia APNs.

Multipleksuj swoje żądania już dziś

Pobierz wersję próbną — oba dema klienta i serwera HTTP/2 kompilują się od razu po instalacji.