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 не используется. Ваш код не увидит исключение во время выполнения. Но ваш отладчик будет.

Другие вопросы по тегам