Suportado por
*Requer versão personalizada do Indy.
Application-Layer Protocol Negotiation (ALPN) é uma extensão do Transport Layer Security (TLS) para negociação de protocolo de camada de aplicação. O ALPN permite que a camada de aplicação negocie qual protocolo deve ser executado sobre uma conexão segura de uma maneira que evita round trips adicionais e que é independente dos protocolos de camada de aplicação. É necessário por conexões HTTP/2 seguras, que melhoram a compressão de páginas web e reduzem sua latência em comparação com o HTTP/1.x.
Você pode configurar em TLSOptions.ALPNProtocols quais protocolos são suportados pelo cliente. Quando o cliente conecta ao servidor, esses protocolos são enviados no 'Client Hello' inicial do handshake TLS, listando os protocolos que o cliente suporta, e o servidor seleciona qual protocolo será utilizado, se algum.
Você pode obter qual protocolo foi selecionado pelo servidor acessando a propriedade ALPNProtocol do TsgcWSConnectionClient.
ServerQuando
há uma nova conexão TLS, o evento OnSSLALPNSelect é chamado, aqui você
pode acessar uma lista de protocolos que são suportados pelo cliente e o servidor
pode selecionar qual deles é suportado.
Se não houver suporte para
nenhum protocolo, aProtocol pode ser deixado vazio.
// 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;