HTTP/1

TsgcHTTP1Client é um componente não visual que herda do componente indy TIdHTTP e adiciona algumas novas propriedades.

Este componente está localizado na unit sgcHTTP.

TLSOptions

Permite que você configure como conectar a servidores SSL/TLS seguros utilizando o protocolo HTTP/1.

 

ALPNProtocols: lista dos protocolos ALPN que serão enviados ao servidor.

RootCertFile: caminho para o arquivo de certificado raiz.

CertFile: caminho para o arquivo de certificado.

KeyFile: caminho para o arquivo de chave do certificado.

Password: se o certificado estiver protegido por senha, defina-a aqui.

VerifyCertificate: se o certificado deve ser verificado, habilite esta propriedade. Utilize o evento OnSSLVerifyPeer para personalizar a verificação SSL.

VerifyDepth: é uma propriedade Integer que representa o número máximo de links permitidos quando a verificação é realizada para o certificado X.509.

Version: por padrão utiliza TLS 1.0. Se o servidor exigir uma versão TLS superior, ela pode ser selecionada aqui.

Proxy: aqui você pode definir se deseja conectar através de um servidor proxy; você pode conectar aos seguintes servidores proxy:

pxyHTTP: Servidor HTTP Proxy.

pxySocks4: SOCKS4 Proxy Server.

pxySocks4A: Servidor Proxy SOCKS4A.

pxySocks5: Servidor SOCKS5 Proxy.

IOHandler: selecione qual biblioteca você utilizará para conectar usando TLS.

iohOpenSSL: usa a biblioteca OpenSSL e é o padrão para os componentes Indy. Requer a implantação das bibliotecas OpenSSL para win32/win64.

iohSChannel: utiliza o Secure Channel, que é um protocolo de segurança implementado pela Microsoft para Windows. Não requer a implantação das bibliotecas OpenSSL. Funciona somente no Windows 32/64 bits.

OpenSSL_Options: configuração das bibliotecas openSSL.

APIVersion: permite definir qual API OpenSSL será usada.

oslAPI_1_0: usa a API 1.0 do OpenSSL, é a mais recente suportada pelo Indy

oslAPI_1_1: usa a API 1.1 do OpenSSL, requer nossa biblioteca Indy personalizada e permite usar as bibliotecas OpenSSL 1.1.1 (com suporte a TLS 1.3).

oslAPI_3_0: utiliza a API 3.0 do OpenSSL, requer nossa biblioteca Indy personalizada e permite utilizar as bibliotecas OpenSSL 3.0.0 (com suporte a TLS 1.3).

LibPath: aqui você pode configurar onde as bibliotecas OpenSSL estão localizadas

oslpNone: este é o padrão. As bibliotecas OpenSSL devem estar na mesma pasta do binário ou em um caminho conhecido.

oslpDefaultFolder: define automaticamente o caminho do OpenSSL onde as bibliotecas devem estar localizadas para todas as personalidades da IDE.

oslpCustomFolder: se esta for a opção selecionada, defina o caminho completo na propriedade LibPathCustom.

LibPathCustom: quando LibPath = oslpCustomFolder, defina aqui o caminho completo onde as bibliotecas OpenSSL estão localizadas.

UnixSymLinks: habilita ou desabilita o carregamento de SymLinks em sistemas Unix (por padrão está habilitado, exceto no OSX64):

oslsSymLinksDefault: por padrão, os symlinks são habilitados, exceto em OSX64 (o macOS Monterey e posteriores falham ao tentar carregar a biblioteca sem uma versão).

oslsSymLinksLoadFirst: carrega os symlinks primeiro, antes de tentar carregar as bibliotecas versionadas.

oslsSymLinksLoad: carrega os symlinks após tentar carregar as bibliotecas versionadas.

oslsSymLinksDontLoad: não carrega os SymLinks.

MinVersion: defina aqui a versão mínima que o cliente utilizará para se conectar a um servidor seguro. Por padrão, o valor é tlsUndefined, o que significa que a versão mínima é a mesma definida na propriedade Version. Exemplo: se você quiser que o cliente conecte apenas utilizando TLS 1.2 ou TLS 1.3, defina os seguintes valores.

 

SSLOptions.Version := tls1_3;

SSLOptions.OpenSSL_Options.MinVersion := tls1_2;

X509Checks: utilize esta propriedade para habilitar validações adicionais de certificado X509:

Mode: selecione quais opções serão validadas

oslx509chHostName: verifica o hostname do certificado.

oslx509chIPAddress: verifica o endereço ip do certificado.

HostName: define o hostname se ele for diferente do da requisição.

IPAddress: defina o endereço ip se for diferente do da requisição.

 

SChannel_Options: permite que você utilize um certificado do Windows Certificate Store.

CertHash: é o Hash do certificado. Você pode encontrar o Hash do certificado executando um comando dir no powershell.

CipherList: aqui você pode definir quais Ciphers serão usados (separados por ":"). Exemplo: CALG_AES_256:CALG_AES_128

CertStoreName: o nome do store onde o certificado está armazenado. Selecione um dos seguintes:

scsnMY (o padrão)

scsnCA

scsnRoot

scsnTrust

CertStorePath: o caminho de armazenamento onde o certificado está armazenado. Selecione um dos seguintes:

scspStoreCurrentUser (o padrão)

scspStoreLocalMachine

 

Log

Se a propriedade Log estiver habilitada, salva as mensagens do socket em um arquivo de log especificado, útil para depuração.

 

LogOptions.FileName: caminho completo para o nome do arquivo.

 

Autenticação

Permite que você se autentique utilizando OAuth2 ou JWT.

 

 

Requisições Assíncronas

Por padrão, o HTTP1Client utiliza requisições bloqueantes, portanto, após chamar um método de requisição HTTP, o cliente aguarda a resposta do servidor. Alternativamente, você pode utilizar métodos assíncronos para executar essas requisições HTTP em uma thread secundária, evitando bloquear a thread onde a requisição é chamada. Os seguintes métodos assíncronos estão implementados:

 

 

Após chamar estes métodos, em vez de aguardar a resposta, o código continua para a próxima linha, e a resposta pode ser tratada utilizando o evento OnAsyncResponse.

 


procedure OnAsyncResultEvent(Sender: TObject; const aRequest:
    TsgcHTTPAsyncRequest; const aResponse: TIdHTTPResponse);

Se houver qualquer erro ao processar a requisição assíncrona, a exceção será gerada no evento OnAsyncException.

 

Exemplos

Solicita um método GET a um servidor HTTPs usando TLS 1.2


oHTTP := TsgcHTTP1Client.Create(nil);
Try
  oHTTP.TLSOptions.Version := tls1_2;
  ShowMessage(oHTTP.Get('https://www.google.es'));
Finally
  oHTTP.Free;
End;

Requisita um método GET a um servidor HTTPs usando openSSL 1.1 e TLS 1.3


oHTTP := TsgcHTTP1Client.Create(nil);
Try
  oHTTP.TLSOptions.OpenSSL_Options.APIVersion := oslAPI_1_1;
  oHTTP.TLSOptions.Version := tls1_3;
  ShowMessage(oHTTP.Get('https://www.google.es'));
Finally
  oHTTP.Free;
End;

Solicite um método POST assíncrono e leia a resposta utilizando o OnAsyncResultEvent.

 


procedure OnAsyncExceptionEvent(Sender: TObject; const aThread:
    TsgcThread; const E: Exception);
begin
  Log(E.Message);
end;
procedure OnAsyncResultEvent(Sender: TObject; const aRequest:
    TsgcHTTPAsyncRequest; const aResponse: TIdHTTPResponse);
begin
  if aResponse.ResponseCode = 200 then
    Log('ok', aRequest.Response)
  else 
    Log('error', aRequest.Response);
end;
oHTTP := TsgcHTTP1Client.Create(nil);
oHTTP.OnAsyncResult := OnAsyncResultEvent;
oHTTP.OnAsyncException := OnAsyncResultEvent;
oRequest := TStringStream.Create('body');
oResponse := TStringStream.Create('');
oHTTP.PostAsync('https://localhost/test', oRequest, oResponse);

 

Faça uma requisição com o método GET a um servidor HTTPs usando SChannel para Windows.


oHTTP := TsgcHTTP1Client.Create(nil);
Try
  oHTTP.TLSOptions.IOHandler := iohSChannel;
  oHTTP.TLSOptions.Version := tls1_2;
  ShowMessage(oHTTP.Get('https://www.google.es'));
Finally
  oHTTP.Free;
End;

Solicite o método SSE para obter eventos de dados

 


oHTTP := TsgcHTTP1Client.Create(nil);
oHTTP.OnSSEMessage := OnSSEMessageEvent;
oHTTP.GetSSE('https://www.yoursite.com/sse');
 
procedure OnSSEMessageEvent(Sender: TObject; const aMessage: string; var Cancel: Boolean);
begin
  ShowMessage(aMessage);
end;

 

Eventos

OnSSEMessage

 

O evento é chamado quando uma nova mensagem SSE é recebida.

 

OnSSLVerifyPeer

 

Se a verificação de certificado estiver habilitada, neste evento você pode verificar e decidir se aceita o certificado do servidor.

 

OnSSLGetHandler

 

Este evento é gerado antes da criação do handler SSL. Você pode criar seu próprio handler SSL aqui (ele precisa ser herdado de TIdServerIOHandlerSSLBase ou TIdIOHandlerSSLBase) e definir as propriedades necessárias.

 

OnSSLAfterCreateHandler

 

Se nenhum objeto SSL personalizado foi criado, um padrão é criado usando o handler OpenSSL. Você pode acessar as propriedades do handler SSL e modificá-las se necessário.

 

OnAsyncResult

 

O evento é chamado após solicitar um método assíncrono (utilizando os métodos GetAsync, PutAsync...). Utilize o parâmetro Response para saber o resultado da requisição.

 

OnAsyncException

 

Se houver algum erro ao processar uma requisição assíncrona, este evento é chamado com a exceção gerada.