TsgcHTTP3Server

TsgcHTTP3Server は QUIC 上で HTTP リクエストを処理する HTTP/3 サーバー(RFC 9114)を実装しています。

はじめに

TsgcHTTP3Server は RFC 9114 で定義された HTTP/3 サーバーを実装しています。HTTP/3 は QUIC(TLS 1.3 を内蔵した UDP ベースのトランスポート)上で HTTP リクエストとレスポンスを運ぶため、すべての接続が暗号化され、ヘッドオブラインブロッキングなしに多重化されます。サーバーはデフォルトで OpenSSL 3.5 以降が提供するネイティブ QUIC リスナー上で動作し、そのリスナーが利用できない場合は sgc QUIC エンジンにフォールバックします(QUICMode を参照)。そのため、外部の HTTP/3 ライブラリは不要です。

このコンポーネントの設定手順に従います:

1. TsgcHTTP3Server の新しいインスタンスを作成し、サーバーがリッスンする Port を設定します(HTTP/3 は UDP を使用します)。

2. QUICOptions.SSLOptions に証明書と秘密鍵を設定します。QUIC は TLS を必須とするため、証明書が必要です。

3. OnH3Request イベントを処理し、レスポンスを設定して Start を呼び出します。aResponse パラメータはサーバーが作成します(ステータスコードのデフォルトは 200)。StatusCode、ContentType およびボディを設定すると、ハンドラが返ったときにサーバーが自動的に送信します。使用例:


    oServer := TsgcHTTP3Server.Create(nil);
    oServer.Port := 443;
    oServer.QUICOptions.SSLOptions.CertFile := 'cert.pem';
    oServer.QUICOptions.SSLOptions.KeyFile := 'key.pem';
    oServer.OnH3Request := OnH3RequestEvent;
    oServer.Start;

    procedure OnH3RequestEvent(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 HTTP/3');
    end;

リファレンス

主なプロパティ

名前説明
PortHTTP/3 サーバーがリッスンする UDP ポート。
QUICOptions証明書、秘密鍵および接続制限を含む QUIC トランスポートオプション。
H3Settingsピアに通知される HTTP/3 プロトコル設定(QPACK およびフィールドセクションの制限)。

主なメソッド

名前説明
StartQUIC リスナーを起動し、HTTP/3 接続の受け入れを開始します。
Stopリスナーを停止し、すべてのアクティブな接続を閉じます。
SendResponseリクエストストリーム上で HTTP/3 レスポンスを送信します。

主なイベント

名前説明
OnH3Request完全な HTTP/3 リクエストが受信されると、アプリケーションがレスポンスを設定できるように発生します。
OnH3Connectクライアントが HTTP/3 接続を確立したときに発生します。
OnH3DisconnectHTTP/3 接続が閉じられたときに発生します。

完全な使用例

次の使用例は、いくつかのパスをルーティングして JSON またはプレーンテキストボディを返す HTTP/3 サーバーを起動します。レスポンスは OnH3Request 内で設定され、サーバーによって自動的に送信されます。


oServer := TsgcHTTP3Server.Create(nil);
oServer.Port := 443;
oServer.QUICOptions.SSLOptions.CertFile := 'cert.pem';
oServer.QUICOptions.SSLOptions.KeyFile := 'key.pem';
oServer.OnH3Request := OnH3RequestEvent;
oServer.OnH3Connect := OnH3ConnectEvent;
oServer.OnH3Disconnect := OnH3DisconnectEvent;
oServer.Start;

procedure OnH3ConnectEvent(Sender: TObject; const aConnection:
    TsgcQUICServerConnection);
begin
  Log('HTTP/3 client connected: ' + aConnection.PeerIP);
end;

procedure OnH3DisconnectEvent(Sender: TObject; const aConnection:
    TsgcQUICServerConnection; aCode: Int64; const aReason: string);
begin
  Log('HTTP/3 client disconnected');
end;

procedure OnH3RequestEvent(Sender: TObject; const aConnection:
    TsgcQUICServerConnection; const aRequest: TsgcHTTP3Request;
    const aResponse: TsgcHTTP3Response);
begin
  if aRequest.Path = '/api/time' then
  begin
    aResponse.StatusCode := 200;
    aResponse.ContentType := 'application/json';
    aResponse.Data := TEncoding.UTF8.GetBytes(
      '{"time":"' + DateTimeToStr(Now) + '"}');
  end
  else
  begin
    aResponse.StatusCode := 404;
    aResponse.ContentType := 'text/plain';
    aResponse.Data := TEncoding.UTF8.GetBytes('Not Found');
  end;
end;

要件