TsgcHTTP1Client est un composant non visuel qui hérite du composant Indy TIdHTTP et ajoute quelques nouvelles propriétés.
Ce composant se trouve dans l'unité sgcHTTP.
Vous permet de configurer la façon de se connecter aux serveurs SSL/TLS sécurisés en utilisant le protocole HTTP/1.
ALPNProtocols : liste des protocoles ALPN qui seront envoyés au serveur.
RootCertFile : chemin vers le fichier de certificat racine.
CertFile : chemin vers le fichier de certificat.
KeyFile : chemin vers le fichier de clé du certificat.
Password : si le certificat est sécurisé par un mot de passe, définissez-le ici.
VerifyCertificate : si le certificat doit être vérifié, activez cette propriété. Utilisez l'événement OnSSLVerifyPeer pour personnaliser la vérification SSL.
VerifyDepth : est une propriété Integer représentant le nombre maximum de liens autorisés lors de la vérification du certificat X.509.
Version : par défaut utilise TLS 1.0. Si le serveur nécessite une version TLS plus élevée, elle peut être sélectionnée ici.
Preset: applique un ensemble de valeurs par défaut sécurisées en une seule affectation. Avec tlspCustom (valeur par défaut), chaque option conserve la valeur configurée manuellement. Définir tlspSecureDefaults active VerifyCertificate, élève Version à au moins TLS 1.2 (lorsqu'une version inférieure ou non définie était configurée) et active la vérification du nom d'hôte du certificat du serveur.
Proxy : ici vous pouvez définir si vous souhaitez vous connecter via un serveur proxy ; les serveurs proxy suivants sont disponibles :
pxyHTTP : serveur proxy HTTP.
pxySocks4 : Serveur Proxy SOCKS4.
pxySocks4A : Serveur Proxy SOCKS4A.
pxySocks5 : serveur proxy SOCKS5.
IOHandler : sélectionnez la bibliothèque que vous utiliserez pour vous connecter via TLS.
iohOpenSSL : utilise la bibliothèque OpenSSL et est la valeur par défaut pour les composants Indy. Nécessite le déploiement des bibliothèques OpenSSL pour win32/win64.
iohSChannel : utilise Secure Channel, un protocole de sécurité implémenté par Microsoft pour Windows. Il ne nécessite pas le déploiement de bibliothèques OpenSSL. Fonctionne uniquement sous Windows 32/64 bits.
OpenSSL_Options : configuration des bibliothèques openSSL.
APIVersion : permet de définir quelle API OpenSSL sera utilisée.
oslAPI_1_0 : utilise l'API 1.0 OpenSSL, la dernière version prise en charge par Indy
oslAPI_1_1 : utilise l'API 1.1 OpenSSL, nécessite notre bibliothèque Indy personnalisée et permet d'utiliser les bibliothèques OpenSSL 1.1.1 (avec prise en charge de TLS 1.3).
oslAPI_3_0 : utilise l'API OpenSSL 3.0, nécessite notre bibliothèque Indy personnalisée et permet d'utiliser les bibliothèques OpenSSL 3.0.0 (avec prise en charge de TLS 1.3).
LibPath : ici vous pouvez configurer l'emplacement des bibliothèques OpenSSL
oslpNone : c'est la valeur par défaut. Les bibliothèques OpenSSL doivent se trouver dans le même dossier que le binaire ou dans un chemin connu.
oslpDefaultFolder : définit automatiquement le chemin OpenSSL où les bibliothèques doivent être situées pour toutes les personnalités IDE.
oslpCustomFolder : si cette option est sélectionnée, définissez le chemin complet dans la propriété LibPathCustom.
LibPathCustom : lorsque LibPath = oslpCustomFolder, définissez ici le chemin complet où se trouvent les bibliothèques OpenSSL.
UnixSymLinks : activer ou désactiver le chargement des liens symboliques sous les systèmes Unix (activé par défaut, sauf sous OSX64) :
oslsSymLinksDefault : par défaut, les liens symboliques sont activés sauf sous OSX64 (macOS Monterey et versions ultérieures échouent lors du chargement de la bibliothèque sans version).
oslsSymLinksLoadFirst : charger les liens symboliques en premier, avant d'essayer de charger les bibliothèques versionnées.
oslsSymLinksLoad : charger les liens symboliques après avoir tenté de charger les bibliothèques versionnées.
oslsSymLinksDontLoad : ne pas charger les SymLinks.
MinVersion : définissez ici la version minimale que le client utilisera pour se connecter à un serveur sécurisé. Par défaut, la valeur est tlsUndefined, ce qui signifie que la version minimale est la même que celle définie dans la propriété Version. Exemple : si vous souhaitez que le client se connecte uniquement en TLS 1.2 ou TLS 1.3, définissez les valeurs suivantes.
SSLOptions.Version := tls1_3;
SSLOptions.OpenSSL_Options.MinVersion := tls1_2;
X509Checks : utilisez cette propriété pour activer des validations de certificat X509 supplémentaires :
Mode : sélectionner quelles options seront validées
oslx509chHostName : vérifie le certificat du nom d'hôte.
oslx509chIPAddress : vérifie l'adresse IP du certificat.
HostName : définissez le nom d'hôte s'il est différent de la requête.
IPAddress : définissez l'adresse IP si elle est différente de celle de la requête.
SChannel_Options : vous permet d'utiliser un certificat depuis le magasin de certificats Windows.
CertHash : il s'agit du hachage du certificat. Vous pouvez trouver le hachage du certificat en exécutant une commande dir dans PowerShell.
CipherList : vous pouvez définir ici les chiffrements à utiliser (séparés par ":"). Exemple : CALG_AES_256:CALG_AES_128
CertStoreName : le nom du magasin où le certificat est stocké. Sélectionnez l'une des options suivantes :
scsnMY (la valeur par défaut)
scsnCA
scsnRoot
scsnTrust
CertStorePath : le chemin du magasin où le certificat est stocké. Sélectionnez l'une des options suivantes :
scspStoreCurrentUser (valeur par défaut)
scspStoreLocalMachine
Si la propriété Log est activée, elle enregistre les messages socket dans un fichier journal spécifié, ce qui est utile pour le débogage.
LogOptions.FileName : chemin complet vers le fichier.
Vous permet de vous authentifier en utilisant OAuth2 ou JWT.
Relance automatiquement les requêtes HTTP échouées en utilisant un backoff exponentiel avec jitter optionnel. Les relances sont désactivées par défaut, le comportement reste donc inchangé sauf si Enabled est défini à true. Une requête est relancée lorsque le code d'état de la réponse figure dans StatusCodes ou lorsqu'une erreur réseau transitoire se produit (connexion fermée, erreur de socket, délai de connexion ou de lecture dépassé).
Enabled: active la relance automatique des requêtes échouées. Par défaut false.
MaxRetries: nombre maximal de nouvelles tentatives après la requête initiale. Par défaut 3.
InitialInterval: délai en millisecondes avant la première nouvelle tentative. Par défaut 500.
MaxInterval: délai maximal en millisecondes entre les nouvelles tentatives. Par défaut 30000.
Multiplier: facteur appliqué au délai après chaque tentative. Par défaut 2.0, ce qui double le délai à chaque nouvelle tentative : 500, 1000, 2000...
Jitter: facteur aléatoire entre 0 et 1 appliqué à chaque délai (0.2 fait varier chaque délai jusqu'à 20%), ce qui évite que de nombreux clients ne réessaient exactement au même moment. Par défaut 0.2.
HonorRetryAfter: lorsque le serveur répond avec un en-tête Retry-After (en secondes ou sous forme de date HTTP, généralement avec une réponse 429 ou 503), le client attend le temps demandé par le serveur au lieu du délai de backoff calculé. Par défaut true.
StatusCodes: liste de codes d'état HTTP séparés par des virgules qui déclenchent une nouvelle tentative. Par défaut "429,502,503,504".
Exemple : réessayer jusqu'à 5 fois, en commençant avec 1 seconde entre les tentatives.
oHTTP := TsgcHTTP1Client.Create(nil);
oHTTP.RetryOptions.Enabled := True;
oHTTP.RetryOptions.MaxRetries := 5;
oHTTP.RetryOptions.InitialInterval := 1000;
ShowMessage(oHTTP.Get('https://www.esegece.com'));
Les clients de fournisseurs d'IA (OpenAI, Anthropic, Gemini et les autres clients d'API LLM) utilisent ce même moteur de relance via la propriété RetryOptions de leurs Options.
Par défaut, HTTP1Client utilise des requêtes bloquantes, donc après avoir appelé une méthode de requête HTTP, le client attend la réponse du serveur. Alternativement, vous pouvez utiliser des méthodes asynchrones pour exécuter ces requêtes HTTP dans un thread secondaire, évitant ainsi de bloquer le thread où la requête est appelée. Les méthodes asynchrones suivantes sont implémentées :
Après avoir appelé ces méthodes, au lieu d'attendre la réponse, le code continue à la ligne suivante, et la réponse peut être gérée à l'aide de l'événement OnAsyncResponse.
procedure OnAsyncResultEvent(Sender: TObject; const aRequest:
TsgcHTTPAsyncRequest; const aResponse: TIdHTTPResponse);
S'il y a une erreur lors du traitement de la requête asynchrone, l'exception sera levée dans l'événement OnAsyncException.
Dans Delphi 2010 et versions ultérieures, le client implémente également des requêtes asynchrones de style future qui ne nécessitent aucun gestionnaire d'événements :
function GetFuture(const AURL: string): IsgcFuture<string>;
function PostFuture(const AURL: string; aData: TStream): IsgcFuture<string>;
La requête s'exécute dans un thread d'arrière-plan et le future renvoyé se résout avec le corps de la réponse : appelez Await pour bloquer jusqu'à l'arrivée de la réponse, ThenProc pour la consommer dans une continuation et OnError pour gérer les échecs. Appeler Cancel abandonne la requête HTTP sous-jacente au lieu de la laisser s'exécuter jusqu'au bout.
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);
Effectuer une requête GET vers un serveur HTTPS en utilisant TLS 1.2
oHTTP := TsgcHTTP1Client.Create(nil);
Try
oHTTP.TLSOptions.Version := tls1_2;
ShowMessage(oHTTP.Get('https://www.google.es'));
Finally
oHTTP.Free;
End;
Effectuer une requête GET vers un serveur HTTPs en utilisant openSSL 1.1 et 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;
Demandez une méthode POST asynchrone et lisez la réponse à l'aide de l'événement 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);
Effectuez une requête GET vers un serveur HTTPs en utilisant SChannel pour 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;
Demander la méthode SSE pour obtenir des événements de données
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
L'événement est appelé lorsqu'un nouveau message SSE est reçu.
OnSSLVerifyPeer
Si la vérification du certificat est activée, dans cet événement vous pouvez vérifier et décider d'accepter ou non le certificat du serveur.
OnSSLGetHandler
Cet événement est déclenché avant la création du gestionnaire SSL. Vous pouvez créer votre propre gestionnaire SSL ici (il doit hériter de TIdServerIOHandlerSSLBase ou TIdIOHandlerSSLBase) et définir les propriétés nécessaires.
OnSSLAfterCreateHandler
Si aucun objet SSL personnalisé n'a été créé, un objet par défaut est créé à l'aide du gestionnaire OpenSSL. Vous pouvez accéder aux propriétés du gestionnaire SSL et les modifier si nécessaire.
OnAsyncResult
L'événement est appelé après la requête d'une méthode Async (en utilisant les méthodes GetAsync, PutAsync...). Utilisez le paramètre Response pour connaître le résultat de la requête.
OnAsyncException
Si une erreur survient lors du traitement d'une requête asynchrone, cet événement est appelé avec l'exception levée.