我有以下任务:使用HTTPS和身份验证下载文件。 Indy似乎要走了,但由于某种原因它到目前为止还不起作用。我有以下内容:
该网站还需要身份验证,我在URL中包含了用户/传递,如下例所示。简而言之,这就是代码:
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);
使用此代码,我可以非常快速地获得“读取超时”EIdReadTimeout异常。在浏览器中测试URL可以正常工作。关于什么缺失或我做错了什么的想法?
答案 0 :(得分:10)
我最终放弃了Indy和OpenSSL并使用WinInet进行下载。这是对我有用的代码:
function Download(URL, User, Pass, FileName: string): Boolean;
const
BufferSize = 1024;
var
hSession, hURL: HInternet;
Buffer: array[1..BufferSize] of Byte;
BufferLen: DWORD;
F: File;
begin
Result := False;
hSession := InternetOpen('', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0) ;
// Establish the secure connection
InternetConnect (
hSession,
PChar(FullURL),
INTERNET_DEFAULT_HTTPS_PORT,
PChar(User),
PChar(Pass),
INTERNET_SERVICE_HTTP,
0,
0
);
try
hURL := InternetOpenURL(hSession, PChar(URL), nil, 0, 0, 0) ;
try
AssignFile(f, FileName);
Rewrite(f,1);
try
repeat
InternetReadFile(hURL, @Buffer, SizeOf(Buffer), BufferLen) ;
BlockWrite(f, Buffer, BufferLen)
until BufferLen = 0;
finally
CloseFile(f) ;
Result := True;
end;
finally
InternetCloseHandle(hURL)
end
finally
InternetCloseHandle(hSession)
end;
end;
答案 1 :(得分:1)
我见过同样的事情。将TIdHTTP.ReadTimeout设置为零可以解决我的问题。
...
HTTP.IOHandler := IOHandler;
HTTP.ReadTimeout := 0;
答案 2 :(得分:0)
除非正确安装了一些其他库,否则所有用于安全连接的SSL相关功能都将失败。
2.。)将两个DLL解压缩并复制到项目文件夹(或系统PATH中的某个位置)
因为你的问题代码对我来说很好。
- 莱因哈德