TIDHTTP: не удалось загрузить библиотеку SSL по URL-адресам, отличным от https
Я использую TIDHTTP для загрузки zip-файла с URL-адреса, отличного от https, как показано ниже:
IdHTTPProgress.DownloadFile('http://www.myurl.com/myfile.zip','c:\myfile.zip');
Тем не менее я получаю исключение "Не удалось загрузить библиотеку SSL". Исключение происходит, но после этого загрузка все равно производится.
Как я могу избежать этого исключения?
Спасибо
1 ответ
Единственный способ, которым может произойти исключение, - это когда:
Вы назначили
TIdSSLIOHandlerSocketOpenSSL
компонент кTIdHTTP.IOHandler
имущество.Он попытается инициализировать OpenSSL, даже если вы делаете HTTP-запрос, поскольку существует вероятность перенаправления любого HTTP-запроса на HTTPS, поэтому Indy подготавливает OpenSSL при установлении TCP-соединения, на всякий случай.
вы не развернули библиотеки OpenSSL (
libeay32.dll
а такжеssleay32.dll
или эквивалент для вашей целевой платформы) с вашим приложением - ИЛИ - вы развернули неверную версию DLL, которые не совместимы с вашей версией Indy.Если вы собираетесь использовать
TIdSSLIOHandlerSocketOpenSSL
, вам нужны правильные библиотеки DLL. Indy в настоящее время поддерживает до OpenSSL 1.0.2, но не OpenSSL 1.1.0 или новее (пока - это в списке TODO).
Когда Indy вызывает исключение "Не удалось загрузить библиотеку SSL", вы можете вызвать Indy WhichFailedToLoad()
функция в IdSSLOpenSSLHeaders
блок, чтобы выяснить, произошел ли сбой из-за того, что DLL не удалось загрузить в память, или потому что в DLL отсутствует экспорт, который требуется Indy.
Также есть OpenSSLVersion()
функция в IdSSLOpenSSL
модуль, чтобы сообщить, какая версия OpenSSL была загружена в память.
В вашем случае не происходит перенаправление с HTTP на HTTPS, но ошибка все равно происходит внутри, что TIdHTTP
глотает, так как HTTPS не используется. Ваш код не увидит исключение во время выполнения. Но ваш отладчик будет.