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;
| 名前 | 説明 |
|---|---|
| Port | HTTP/3 サーバーがリッスンする UDP ポート。 |
| QUICOptions | 証明書、秘密鍵および接続制限を含む QUIC トランスポートオプション。 |
| H3Settings | ピアに通知される HTTP/3 プロトコル設定(QPACK およびフィールドセクションの制限)。 |
| 名前 | 説明 |
|---|---|
| Start | QUIC リスナーを起動し、HTTP/3 接続の受け入れを開始します。 |
| Stop | リスナーを停止し、すべてのアクティブな接続を閉じます。 |
| SendResponse | リクエストストリーム上で HTTP/3 レスポンスを送信します。 |
| 名前 | 説明 |
|---|---|
| OnH3Request | 完全な HTTP/3 リクエストが受信されると、アプリケーションがレスポンスを設定できるように発生します。 |
| OnH3Connect | クライアントが HTTP/3 接続を確立したときに発生します。 |
| OnH3Disconnect | HTTP/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;
SGC_HTTP3 を有効にしてコンパイルします。sgcHTTP3_Server を uses 句に追加します。QUICOptions.SSLOptions.IOHandler = iohOpenSSL の場合は OpenSSL 3.5 以降が必要です。旧バージョンへのフォールバックはありません。iohNativeTLS を使用すれば OpenSSL は不要です。