Delphi HTTP/2 İstemcisi ve Sunucusu — Çoğullamalı, Akış, Push

RFC 9113 HTTP/2'nin yerel Pascal uygulaması: akış çoğullama, HPACK başlık sıkıştırma, akış kontrolü, sunucu push ve HTTP/2 üzerinden WebSocket uzantısı (RFC 8441). Delphi 7'den Delphi 13'e kadar aynı bileşen, istemci veya sunucu.

Saf Pascal bir HTTP/2 yığını

WinHTTP veya libcurl etrafında ince bir sarmalayıcı değil. Size çerçeve düzeyinde kontrol veren sıfırdan bir uygulama.

Bir Delphi HTTP/2 istemcisi artık isteğe bağlı değil: HTTP/2, tüm modern webin konuştuğu hat biçimidir. Apple Push Notifications HTTP/2 gerektirir. Google API'leri HTTP/2 üzerinde anlaşır. AWS, Azure ve CloudFront varsayılan olarak HTTP/2 kullanır. Kazanımlar da gerçek: tek bir TCP/TLS bağlantısı onlarca devam eden isteği çoğullar, başlık kümeleri HPACK ile sıkıştırılır ve sunucu istemcinin henüz istemediği kaynakları gönderebilir. sgcWebSockets, TsgcHTTP2Client (istemci) ve TsgcWebSocketHTTPServer (sunucu) içinde HTTP/2 desteği sunar. Her ikisi de saf Pascal, her ikisi de Delphi derleyicisinin hedeflediği her platformda çalışır.

Aynı kütüphanedeki bir Delphi HTTP/2 sunucusu, REST API'lerini barındırabilir, uzun ömürlü istemcilere olay gönderebilir ve HTTP/2 (RFC 8441) üzerinden WebSocket yükseltmelerini kabul edebilir. Bu, modern altyapının WebSocket'i HTTP/2 / HTTP/3 üzerine katmanlamasının standart yoludur.

İstemci

TsgcHTTP2Client

Sunucu

TsgcWebSocketHTTPServer with HTTP/2 enabled

Standartlar

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

TLS

OpenSSL, SChannel, HTTP.sys — ALPN ile anlaşılan

HTTP/2 neden önemli

HTTP/1.1'e göre dört büyük kazanım ve bunları işe yarayan operasyonel ayrıntılar.

Akış çoğullama

Tek bir TCP+TLS bağlantısı üzerinden SETTINGS_MAX_CONCURRENT_STREAMS'e kadar devam eden istek. Head-of-line engellemesi yok, ayarlanacak bağlantı havuzu yok.

HPACK sıkıştırma

Bağlantı başına statik + dinamik başlık tablosu, HTTP/1.1 trafiğini şişiren tekrarlanan başlıkların (çerezler, user-agent, accept) kilobaytlarını ortadan kaldırır.

Sunucu push

Sunucu, istemcinin ihtiyaç duyacağı kaynakları (CSS, JS, JSON alt kaynakları) istemci istemeden önce önceden gönderebilir. Bir istek gidiş-dönüşünü kısaltın.

Akış öncelikleri

Akış başına ağırlık ve bağımlılık ağacı, sunucuya analiz blob'undan önce dizin belgesini göndermesini söylemenizi sağlar.

Akış kontrolü

Akış başına ve bağlantı başına WINDOW_UPDATE, yavaş bir tüketicinin göndereni boğmasını önler. Hat biçimine yerleşik geri basınç.

ALPN anlaşması

TLS katmanı ALPN, h2 üzerinde otomatik olarak anlaşır. İstemci ve sunucu, ilk istekten önce HTTP/2 üzerinde anlaşır; eş konuşmuyorsa HTTP/1.1'e geri dönülür.

HTTP/2 üzerinden WebSocket

RFC 8441: bir WebSocket oturumunu tek bir HTTP/2 akışı içinde tünelleyin. HTTP/2 farkındalıklı her yük dengeleyiciden (Envoy, nginx, ALB, GCLB) geçer.

Trailer'lar ve gRPC dostu

HTTP trailer'ları (RFC 7230'a göre) birinci sınıftır. gRPC'nin durum / mesaj meta verilerinin temeli.

Çoğullamalı GET istekleri

Tek bir bağlantıda 10 eşzamanlı GET başlatın. HPACK ve çoğullama bunu rutin hâle getirir.

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;

İstemci istemeden önce bir alt kaynak gönderin

Bir OnCommandGet işleyicisi içinde, /index.html ile birlikte /style.css'yi önceden göndermek için PushPromise çağırın.

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;

HTTP/2'nin isteğe bağlı değil, zorunlu olduğu yerler

Apple Push Notifications

APNs yalnızca HTTP/2 kabul eder. Tek bir kalıcı bağlantı, saniyede binlerce akış, JWT veya sertifika tabanlı kimlik doğrulama. Apple Push sayfasına bakın.

Google FCM v1

HTTP v1 FCM API'si HTTP/2 üzerinde çalışır. Google FCM sayfasına bakın.

gRPC hizmetleri

gRPC, protobuf ve trailer'larla HTTP/2'dir. Buradaki HTTP/2 yığını, bir Pascal gRPC istemcisinin üzerine inşa edildiği temeldir.

HTTP/2 üzerinden WebSocket

HTTP/2 yukarı akışını tercih eden modern yük dengeleyiciler ve CDN'ler aracılığıyla WebSocket dağıtmanın en temiz yolu.

Yüksek aktarım hızlı REST istemcileri

Tek bir bağlantı, yüzlerce devam eden istek. Tarayıcılar, piyasa verisi alıcıları ve fan-out çalışanları için idealdir.

Long-poll yerine geçer

JSON satırlı veya SSE tarzı bir yanıtı tek bir HTTP/2 akışı üzerinden akıtın. Geri basınç dahildir.

Daha derin incelemeler

HTTP/2 referansı

HTTP/2 istemcisi ve sunucusu için tam bileşen referansı.

HTTP/2 istemcisi

Özel istemci bileşeni sayfası.

HTTP/2 sunucusu

Özel sunucu bileşeni sayfası.

WebSocket bileşeni

HTTP/2 (RFC 8441) ve HTTP/1.1 (RFC 6455) üzerinden WebSocket.

Blog: HTTP/2 ilk sunucu desteği

Orijinal duyuru ve tasarım notları.

Blog: HTTP/2 ile HTTP/1 performans karşılaştırması

Çoğullama ve HPACK kazanımları için kıyaslama sayıları.

Blog: HTTP/2 uygunluk testleri

h2spec paketini sunucuya karşı çalıştırma.

Blog: HTTP/2 üzerinden APNs

Pratik HTTP/2 örneği: APNs bildirimleri.

İsteklerinizi bugün çoğullayın

Denemeyi indirin. Hem HTTP/2 istemci hem de sunucu demoları kutudan çıkar çıkmaz derlenir.