我正在使用TIDHTTP从非https网址下载zip文件,例如以下代码:
IdHTTPProgress.DownloadFile('http://www.myurl.com/myfile.zip','c:\myfile.zip');
尽管如此,我却收到异常消息“无法加载SSL库”。会发生例外,但之后仍然进行下载。
如何避免这种例外情况?
谢谢
答案 0 :(得分:1)
发生异常的唯一方法是:
您已将TIdSSLIOHandlerSocketOpenSSL
属性分配给TIdHTTP.IOHandler
属性。
即使您正在发出HTTP请求,它也会尝试初始化OpenSSL,因为任何HTTP请求都有可能重定向到HTTPS,因此Indy在建立TCP连接时准备OpenSSL,以防万一。
您尚未在应用中部署OpenSSL DLL(libeay32.dll
和ssleay32.dll
,或与目标平台相当的DLL)-或-您部署了错误的 与您的Indy版本不兼容的DLL版本。
如果要使用TIdSSLIOHandlerSocketOpenSSL
,则需要适当的DLL。 Indy当前最多支持OpenSSL 1.0.2,但不支持OpenSSL 1.1.0或更高版本(至今-即on the TODO list)。
当Indy引发“无法加载SSL库”异常时,您可以在WhichFailedToLoad()
单元中调用Indy的IdSSLOpenSSLHeaders
函数,以查找失败是否是因为DLL无法加载到内存中,或者是因为DLL缺少Indy所需的导出。
OpenSSLVersion()
单元中还有一个IdSSLOpenSSL
函数,用于报告已将哪个版本的OpenSSL加载到内存中。
在您的情况下,不会发生从HTTP到HTTPS的重定向,但是该错误仍然在内部发生,由于未使用HTTPS,TIdHTTP
会将该错误吞没。您的代码在运行时将看不到异常。但是您的调试器会。