Comment télécharger un fichier sur HTTPS à l'aide d'Indy 10 et OpenSSL?
J'ai la tâche suivante: téléchargement d'un fichier à l'aide de HTTPS et d'authentification. Indy semble la voie à suivre, mais pour quelque raison il ne fonctionne pas si loin. J'ai le texte suivant à la place:
- un TIdHTTP composant que j'utilise pour le téléchargement
- un TIdURI composant utilisé pour créer l'URL
- un TIdSSLIOHandlerSocketOpenSSL composant qui doivent assurer la sécurité de la connexion. Les Dll requises sont dans le dossier binaire.
Le site nécessite une authentification et je l'ai inclus le user/pass dans l'URL comme dans l'exemple ci-dessous. En bref voici le code:
URI := TIdURI.Create('https://test.example.com/');
URI.Username := ParamUserName;
URI.Password := ParamPassword;
HTTP := TIdHTTP.Create(nil);
if URI.Protocol = 'https' then
begin
IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
IOHandler.SSLOptions.Method := sslvSSLv3;
HTTP.IOHandler := IOHandler;
end;
HTTP.Get(URI.GetFullURI([ofAuthInfo]), FileStream);
L'aide de ce code j'obtiens un "Délai d'attente" EIdReadTimeout exception très rapide. Test de l'URL dans un navigateur fonctionne sans problème. Toutes les idées sur ce qu'il manque ou ce que j'ai fait de mal?
Est-il un pare-feu / proxy entre l'application et le serveur? Navigateur des œuvres " ne veut pas dire qu'il ya une connexion directe à Internet.
Si je regarde dans les paramètres du navigateur il n'y a pas de proxy défini. Aussi, le fait que le WinInet approche fonctionne sans proxy me dit que ce n'est pas le problème.
N'utilisez pas le TIdURI.Nom d'utilisateur/mot de passe de propriétés dans cette situation. Vous devez utiliser le TIdHTTP.Nom d'utilisateur/Mot de passe de propriétés à la place.
Si je regarde dans les paramètres du navigateur il n'y a pas de proxy défini. Aussi, le fait que le WinInet approche fonctionne sans proxy me dit que ce n'est pas le problème.
N'utilisez pas le TIdURI.Nom d'utilisateur/mot de passe de propriétés dans cette situation. Vous devez utiliser le TIdHTTP.Nom d'utilisateur/Mot de passe de propriétés à la place.
OriginalL'auteur Tihauan | 2010-02-11
Vous devez vous connecter pour publier un commentaire.
J'ai finalement abandonné Indy et OpenSSL et utilisé WinInet pour le téléchargement. C'est le code qui a fonctionné pour moi:
OriginalL'auteur Tihauan
J'ai vu la même chose. Réglage de la TIdHTTP.ReadTimeout à zéro corrige le problème pour moi.
Oui, mais la définition dans le code après la fixation de l'IOHandler semble arrêter le EIdReadTimeout exception d'être jeté. (Au moins dans mon expérience, avec l'Indy versions qui sont fournis avec Delphi)
OriginalL'auteur jasonpenny
Tous les certificats SSL, les fonctions liées pour les connexions sécurisées échouera à moins que des bibliothèques supplémentaires sont installés correctement.
1.) Télécharger la bibliothèque
2.) décompressez et copiez les deux Dll dans votre dossier de projet (ou quelque part dans le CHEMIN d'accès de votre système)
avec votre code à partir de la question fonctionne très bien pour moi.
--reinhard
OriginalL'auteur pastacool