支持者
*需要自定义 Indy 版本。
应用层协议协商(ALPN)是传输层安全(TLS)的一个扩展,用于应用层协议协商。ALPN 允许应用层以避免额外往返的方式协商在安全连接上使用哪种协议,且独立于应用层协议。安全 HTTP/2 连接需要它,因为 HTTP/2 相比 HTTP/1.x 改善了网页压缩并降低了延迟。
您可以在 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;