TsgcHTTP1Client é um componente não visual que herda do componente indy TIdHTTP e adiciona algumas novas propriedades.
Este componente está localizado na unit sgcHTTP.
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
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.
Permite que você se autentique utilizando OAuth2 ou JWT.
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.
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.
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);
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;
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.