Delphi HTTP/3 クライアント | QUIC & WebTransport コンポーネント | eSeGeCe

Delphi HTTP/3 クライアント — Pascal のための QUIC と WebTransport

Delphi と C++Builder のための実働 HTTP/3 スタック。TsgcHTTP3Client は、QPACK ヘッダー圧縮、Alt-Svc 検出、サーバープッシュ、Extended CONNECT トンネルを備えて QUIC 上で RFC 9114 リクエストを送信します。生の QUIC トランスポートコンポーネントと WebTransport セッションも同じパッケージの一部で、HTTP/3 サーバーが全体像を完成させます。

同じ HTTP セマンティクス、新しいトランスポート

HTTP/3(RFC 9114)は、すでにおなじみのメソッド、ステータスコード、ヘッダーをそのままに、TCP を TLS 1.3 内蔵の UDP ベーストランスポートである QUIC に置き換えます。

Delphi HTTP/3 クライアントは、モダンウェブが移行しつつあるトランスポートをアプリケーションにもたらします。QUIC(RFC 9000)はトランスポートと TLS のハンドシェイクを単一のフライトに統合し、トランスポートレベルの head-of-line ブロッキングを排除し(失われたパケットは、そのデータを運んでいたストリームだけを停止させます)、コネクション ID によってネットワーク変更を生き延びるため、接続はデバイスの Wi-Fi からモバイルデータへの移動に追従できます。ヘッダーは、HPACK の HTTP/3 版後継である QPACK(RFC 9204)で圧縮されます。

sgcWebSockets は OpenSSL 3.5 のネイティブ QUIC サポートを通じて QUIC を駆動します。エンジンは OpenSSL ライブラリのロード時に自動検出されます: 同梱の OpenSSL 3.5 バイナリでは qmBuiltin エンジンが得られ、これは接続あたり複数ストリームをサポートし、コンポーネントがその中心に据えて構築されているエンジンです。quictls スタイルの OpenSSL ビルド向けには qmCustom パスが存在し、接続あたり単一ストリームに制限されます。

HTTP/3 クライアント

TsgcHTTP3Client: ブロッキングおよび非同期リクエスト、Alt-Svc、プッシュ、トンネル

HTTP/3 サーバー

TsgcHTTP3Server: QUIC 上でリクエストを処理し、TsgcQUICServer から派生

生 QUIC

TsgcQUICClient / TsgcQUICServer: HTTP セマンティクスなしの QUIC ストリーム

標準

RFC 9000(QUIC)、RFC 9114(HTTP/3)、RFC 9204(QPACK)、RFC 9220(Extended CONNECT)

HTTP/3 クライアントにできること

10 の HTTP メソッドに加え、HTTP/3 固有の機構がイベントとメソッドとして公開されます。

すべての動詞

GET、HEAD、POST、PUT、DELETE、PATCH、OPTIONS、TRACE、CONNECT、そして新しい IETF QUERY メソッド。それぞれブロッキング呼び出しとして、ほとんどは非同期バリアントも用意。

Alt-Svc 検出

サーバーは Alt-Svc ヘッダー(RFC 7838)で HTTP/3 の利用可能性を広告します。クライアントはそれをパースして OnAltSvc で表面化させるので、いつ切り替えるかはアプリケーションが決められます。

サーバープッシュ

プッシュされたレスポンスの制御はクライアントが握り続けます: SetMaxPushId で上限を広告し、OnPushPromise で通知を受け、CancelPush で拒否。

Extended CONNECT

RFC 9220 はリクエストストリームを通じて別のプロトコルをトンネルします。サーバーがサポートを広告すると ExtendedConnect がトンネルを開き、あとは TunnelSendOnTunnelData がバイトを運びます。

WebTransport

Extended CONNECT 上でネゴシエートされ、アプリケーションに QUIC ストリームを直接手渡すセッション。低レイテンシの双方向トラフィックのために構築。ストリームベースで、出荷版 QUIC エンジンではデータグラムは運ばれません。

QPACK 圧縮

QUIC の順序外配送のために設計された RFC 9204 ヘッダー圧縮。動的テーブル更新は専用のエンコーダー/デコーダーストリームで運ばれます。

0-RTT 対応ハンドシェイク

QUIC はトランスポートと TLS 1.3 を 1 フライトに統合します。新規接続は単一のラウンドトリップで完了し、再開セッションは最初のフライトで 0-RTT データを運べます。

コネクションマイグレーション

QUIC 接続はアドレス 4 タプルではなくコネクション ID で識別されるため、クライアントのネットワーク変更を生き延びます。

複数ストリーム

ビルトインエンジンでは、EnableMultiStreamOpenStream が 1 つの接続に複数の独立した QUIC ストリームを載せます。これは WebTransport が立脚する基盤です。

HTTP/3 上の GET リクエスト

ホストとポートに接続し、リクエストを発行します。デフォルトポートは 443。

var
  oClient: TsgcHTTP3Client;
  vBody: string;
begin
  oClient := TsgcHTTP3Client.Create(nil);
  oClient.OnResponse := OnResponseHandler;
  oClient.OnAltSvc   := OnAltSvcHandler;

  oClient.Connect('www.example.com', 443);
  vBody := oClient.Get('https://www.example.com/');
  oClient.Disconnect;
end;
TsgcHTTP3Client* oClient = new TsgcHTTP3Client(NULL);
oClient->OnResponse = OnResponseHandler;
oClient->OnAltSvc   = OnAltSvcHandler;

oClient->Connect("www.example.com", 443);
String vBody = oClient->Get("https://www.example.com/");
oClient->Disconnect();
var oClient = new TsgcHTTP3Client();
oClient.OnResponse += OnResponseHandler;
oClient.OnAltSvc   += OnAltSvcHandler;

oClient.Connect("www.example.com", 443);
var vBody = oClient.Get("https://www.example.com/");
oClient.Disconnect();

Delphi での HTTP/3 サーバー

サーバーは UDP ポートをバインドし、証明書と鍵を読み込み、リクエストごとにイベントを発生させます。HTTP/3 サポートはライブラリの HTTP サーバー側でも利用できます。

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 := OnH3RequestHandler;
end;

エディションとランタイム要件

HTTP/3、QUIC、WebTransport は All-Access エディション専用です。コンポーネントには Indy ベースのライブラリコアと、それらが立脚するネイティブ QUIC サポートを提供する OpenSSL 3.5 以降が必要です。

WebTransport はさらにビルトイン OpenSSL QUIC エンジン(qmBuiltin)を必要とします。セッションが 1 つの QUIC 接続上に複数のストリームを必要とするためです。サーバーコンポーネントもビルトインエンジンでのみ動作します。クライアントはサーバーが HTTP/3 を話すと仮定できないため、h2 しか広告しないオリジンのために HTTP/2 クライアントを手元に置いておいてください。HTTP/3 が利用可能になったことは Alt-Svc イベントが教えてくれます。

さらに深く

Delphi HTTP/2 クライアント & サーバー

TCP ベースの兄弟: 多重化ストリーム、HPACK、サーバープッシュ、WebSocket-over-HTTP/2。

HTTP コンポーネント

HTTP ファミリーの全容: HTTP/2、OAuth2、JWT、gRPC、プッシュサービスほか。

Delphi 比較ガイド

sgcWebSockets が他の Delphi ネットワークライブラリとどう比較されるか、出典付きで。

WebSocket コンポーネント

HTTP/3 と QUIC(RFC 9220)、HTTP/2(RFC 8441)、HTTP/1.1(RFC 6455)上の WebSocket。

ブログ: HTTP QUERY メソッド

HTTP/1.1、HTTP/2、HTTP/3 クライアントを横断する新しい IETF 動詞をコード付きで。

エディション

Standard から All-Access まで、sgcWebSockets 各エディションに含まれるもの。

Best value: All-AccessEvery eSeGeCe product, Premium Support included, from €1,059/year.
See All-Access pricing

今日、Delphi から HTTP/3 を試す

トライアルをダウンロードし、自前のサーバーや任意の HTTP/3 対応オリジンに対して HTTP/3 クライアントを実行してください。