Delphi および C++ Builder 向けの HTTP/3 クライアントおよびサーバーコンポーネント | eSeGeCe ブログ

Delphi および C++ Builder 向けの HTTP/3 クライアントおよびサーバーコンポーネント

· コンポーネント
sgcQUIC HTTP/3 クライアントおよびサーバーコンポーネント

昨日の投稿では、sgcQUIC の素の QUIC トランスポートを紹介しました。今日はその上に位置するレイヤー、HTTP/3 (RFC 9114) を取り上げます。TsgcHTTP3ClientTsgcHTTP3Server という 2 つのコンポーネントが、この最新の Web トランスポートを Delphi、C++ Builder、.NET にもたらします。

HTTP/3 は、HTTP/1.1 や HTTP/2 でおなじみのリクエストとレスポンスのセマンティクスを維持しつつ、それらを TCP ではなく QUIC 上で実行します。ヘッダーは QPACK (RFC 9204) で圧縮され、QUIC はストリームを独立して多重化するため、パケットが 1 つ失われても、接続上のすべてのリクエストが停止することはなくなります。

HTTP/3 クライアント

ホストに接続し、いずれかのメソッドを呼び出します。Get は本文を文字列として返し、ステータスコードとヘッダーを含む完全なレスポンスは 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;

すべての HTTP メソッドが利用できます。GetHeadPostPutDeletePatchOptionsTraceConnectQuery です。それぞれに非同期版 (GetAsyncPostAsync など) があり、すぐに戻って結果を OnResponse を通じて報告します。

QPACK と Alt-Svc

QPACK は、専用のエンコーダーおよびデコーダーストリームで運ばれる動的テーブルを使って、リクエストとレスポンスのヘッダーを圧縮します。Settings を通じて調整できます。

oClient.Settings.QPACKMaxTableCapacity := 4096;
oClient.Settings.MaxFieldSectionSize   := 65536;

多くのサーバーは、最初のリクエストにはいまだに HTTP/1.1 または HTTP/2 で応答し、Alt-Svc ヘッダー (RFC 7838) で HTTP/3 をアドバタイズします。OnAltSvc イベントがそのアドバタイズを表面化させるため、クライアントは HTTP/3 のエンドポイントを検出し、次のリクエストでアップグレードできます。

HTTP/3 サーバー

サーバーは QUIC レイヤーから QUIC リスナーと証明書のオプションを継承するため、ポートと PEM 証明書およびキーを指定して、同じ方法で構成します。各リクエストは OnH3Request を発生させ、そこでレスポンスオブジェクトを埋めます。

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;

サーバープッシュ、トンネル、WebTransport

これらのコンポーネントは、より広範な HTTP/3 の機能セットも実装しています。サーバーは PushPromise を使って、クライアントが要求する前にリソースをプッシュでき、クライアントは OnPushPromise を通じてそれを受け取ります。拡張 CONNECT (RFC 9220) は HTTP/3 ストリーム上でトンネルを開き、WebTransport は同じ仕組みの上に構築され、リアルタイムアプリケーション向けに双方向ストリームとデータグラムを提供します。

提供状況

sgcQUIC は独立したパッケージで、sgcWebSockets Enterprise のアドオンとしてライセンスされ、QUIC と HTTP/3 の両方のコンポーネントを含みます。すべてのライセンスには、完全な Pascal ソースコードと 1 年間のアップデートが付属します。これらのコンポーネントは SGC QUIC パレットにインストールされ、Delphi および C++ Builder 7 から 13 までに対応するほか、同じ Tsgc クラス名を持つ .NET ポートも用意されています。

トライアルをダウンロードし、sgcQUIC 製品ページで完全なリファレンスをお読みください。

ご質問やご意見はありますか?お問い合わせください。コードを書いた本人から返信が届きます。