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.

Preset: aplica um conjunto de padrões seguros em uma única atribuição. Com tlspCustom (o padrão), cada opção mantém o valor configurado manualmente. Definir tlspSecureDefaults habilita VerifyCertificate, eleva Version para pelo menos TLS 1.2 (quando uma versão inferior ou indefinida estava configurada) e habilita a verificação do nome do host do certificado do servidor.

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.

 

 

RetryOptions

Repete automaticamente requisições HTTP com falha usando backoff exponencial com jitter opcional. As repetições estão desabilitadas por padrão, então o comportamento permanece inalterado a menos que Enabled seja definido como true. Uma requisição é repetida quando o código de status da resposta está em StatusCodes ou quando ocorre um erro de rede transitório (conexão fechada, erro de socket, tempo limite de conexão ou de leitura).

Enabled: habilita a repetição automática de requisições com falha. Por padrão, false.

MaxRetries: número máximo de novas tentativas após a requisição inicial. Por padrão, 3.

InitialInterval: atraso em milissegundos antes da primeira nova tentativa. Por padrão, 500.

MaxInterval: atraso máximo em milissegundos entre as novas tentativas. Por padrão, 30000.

Multiplier: fator aplicado ao atraso após cada tentativa. Por padrão, 2.0, o que dobra o atraso a cada nova tentativa: 500, 1000, 2000...

Jitter: fator aleatório entre 0 e 1 aplicado a cada atraso (0.2 varia cada atraso em até 20%), o que evita que muitos clientes repitam exatamente ao mesmo tempo. Por padrão, 0.2.

HonorRetryAfter: quando o servidor responde com um cabeçalho Retry-After (em segundos ou como uma data HTTP, normalmente com uma resposta 429 ou 503), o cliente aguarda o tempo solicitado pelo servidor em vez do atraso de backoff calculado. Por padrão, true.

StatusCodes: lista separada por vírgulas de códigos de status HTTP que acionam uma nova tentativa. Por padrão, "429,502,503,504".

Exemplo: repetir até 5 vezes, começando com 1 segundo entre as tentativas.


oHTTP := TsgcHTTP1Client.Create(nil);
oHTTP.RetryOptions.Enabled := True;
oHTTP.RetryOptions.MaxRetries := 5;
oHTTP.RetryOptions.InitialInterval := 1000;
ShowMessage(oHTTP.Get('https://www.esegece.com'));

Os clientes de provedores de IA (OpenAI, Anthropic, Gemini e os demais clientes de API de LLM) usam este mesmo mecanismo de repetição através da propriedade RetryOptions de suas Options.

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.

 

Futures

No Delphi 2010 e posteriores, o cliente também implementa requisições assíncronas no estilo future que não exigem nenhum manipulador de eventos:


function GetFuture(const AURL: string): IsgcFuture<string>;
function PostFuture(const AURL: string; aData: TStream): IsgcFuture<string>;

A requisição é executada em uma thread em segundo plano e o future retornado é resolvido com o corpo da resposta: chame Await para bloquear até a resposta chegar, ThenProc para consumi-la em uma continuação e OnError para tratar falhas. Chamar Cancel aborta a requisição HTTP subjacente em vez de deixá-la ser executada até o fim.


oHTTP := TsgcHTTP1Client.Create(nil);
oHTTP.GetFuture('https://www.esegece.com')
  .ThenProc(procedure(const aBody: string)
    begin
      Log(aBody);
    end)
  .OnError(procedure(E: Exception)
    begin
      Log(E.Message);
    end);

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.