TLSサーバー(デフォルトのIndy、IOCPまたはEPOLL IOHandlerを使用する TsgcWebSocketServer、TsgcWebSocketHTTPServer、TsgcHTTPServer)は、TLSに使用しているものと同じポートでプレーンHTTPおよびWebSocket接続も受け付けることができます。このオプションを有効にすると、サーバーは新しい接続ごとに最初の1バイトを先読みします。$16 バイト(TLSハンドシェイクレコード)はクライアントがTLSハンドシェイクを開始することを意味し、それ以外のバイトの場合、その接続はプレーンテキストとして処理されます。PlainTextTimeout の間にバイトが届かない場合、その接続はTLSとして扱われます。これは従来の動作です。IOCPおよびEPOLL IOHandlerでは、判定はブロックせずに最初に受信したデータで行われ、PlainTextTimeout は使用されません。
典型的な用途は、公開済みの既存のプレーンHTTPポートを、クライアント側に設定されたポートを変更せずにHTTPSへ移行することです。クライアントを更新している間は AllowPlainText を有効にし、すべてのクライアントがTLSを使用するようになったら再び無効にしてください。
Boolean、デフォルトは False。True の場合、TLSリスナーは同じポートでプレーン接続も受け付けます。ptpServe(デフォルト): プレーンなリクエストを通常どおり処理します。ptpRedirect: サーバーは https://<Host><path> へ 308 Permanent Redirect を返すため、クライアントはメソッドとボディを維持します。リクエストにHostヘッダーがない場合、サーバーは 400 Bad Request を返します。ptpReject: サーバーは 400 Bad Request を返し、接続を閉じます。Integer、ミリ秒、デフォルトは 5000。接続をTLSとして扱う前に、クライアントからの最初のバイトを待機する時間です。デフォルトのIndy IOHandlerにのみ適用されます。TsgcWSConnectionServer)の読み取り専用の Boolean で、接続がTLSを使用している場合は True です。サーバーメソッド IsTLS(AContext) は、リクエストの TIdContext から同じ値を返します。列挙型 TsgcSSLPlainTextPolicy はユニット sgcWebSocket_Types で宣言されています。
TLS接続とプレーン接続の両方を受け付けて処理する、ポート443のサーバーを起動します。
oServer := TsgcWebSocketHTTPServer.Create(nil);
oServer.SSL := True;
oServer.Port := 443;
oServer.SSLOptions.Port := 443;
oServer.SSLOptions.CertFile := 'c:\certificates\mycert.pem';
oServer.SSLOptions.KeyFile := 'c:\certificates\mycert.pem';
oServer.SSLOptions.RootCertFile := 'c:\certificates\mycert.pem';
oServer.SSLOptions.AllowPlainText := True;
oServer.SSLOptions.PlainTextPolicy := ptpServe;
oServer.Active := True;
リクエストがTLSを使用しているかどうかを知るには、サーバーメソッド IsTLS(AContext) を呼び出します。たとえば OnCommandGet または OnCommandOther イベントで使用できます。接続(TsgcWSConnectionServer)の TLS プロパティも利用できます。
procedure OnCommandGet(AContext: TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
begin
if TsgcWebSocketHTTPServer1.IsTLS(AContext) then
AResponseInfo.ContentText := 'Secure connection'
else
AResponseInfo.ContentText := 'Plain connection, please use https://';
end;
TLS の値はまだ信頼できません。最初のリクエスト以降は正しい値になります。SecurityOptions を参照)はTLS接続でのみ送信され、プレーン接続では送信されません。