サポート対象
*カスタム Indy バージョンが必要です。
Application-Layer Protocol Negotiation(ALPN)は、アプリケーション層のプロトコルネゴシエーションのためのTransport Layer Security (TLS)拡張です。ALPNを使用すると、 アプリケーション層は、追加のラウンドトリップを回避し、 アプリケーション層プロトコルから独立した方法で、セキュアな接続上で実行すべきプロトコルをネゴシエートできます。 これは、Webページの圧縮を改善し、HTTP/1.xと比較してレイテンシを削減する セキュアなHTTP/2接続に必要です。
TLSOptions.ALPNProtocolsで、クライアントがサポートするプロトコルを構成できます。 クライアントがサーバーに接続すると、これらのプロトコルは初期TLSハンドシェイクの「Client Hello」で送信され、 クライアントがサポートするプロトコルがリストされます。サーバーは、 どのプロトコルを使用するかを選択します(存在する場合)。
TsgcWSConnectionClient の ALPNProtocol プロパティにアクセスすることで、サーバーによって選択されたプロトコルを取得できます。
Server新しい TLS 接続がある場合、OnSSLALPNSelect イベントが呼び出されます。ここでクライアントがサポートするプロトコルのリストにアクセスでき、サーバーはその中からサポートするプロトコルを選択できます。
プロトコルのサポートがない場合、aProtocol は空にできます。
// Client
procedure OnClientConnect(Connection: TsgcWSConnection);
var
vProtocol: string;
begin
vProtocol := TsgcWSConnectionClient(Connection).ALPNProtocol;
end;
// Server
procedure OnSSLALPNSelect(Sender: TObject; aProtocols: TStringList; var aProtocol: string);
var
i: integer;
begin
for i := 0 to aProtocols.count - 1 do
begin
if aProtocols[i] = 'h2' then
begin
aProtocol := 'h2';
break;
end;
end;
end;