使用SSL时如何在Indy中设置ConnectTimeout / ReadTimeout?
MCVE:
program mcve;
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,{$ENDIF}{$ENDIF}SysUtils,IdHTTP,IdSSLOpenSSL,DateUtils;
var
HTTP : TIdHTTP;
SSL : TIdSSLIOHandlerSocketOpenSSL;
Started : TDateTime;
begin
HTTP := TIdHTTP.Create();
try
HTTP.ReadTimeout := 1000;
HTTP.ConnectTimeout := 2000;
SSL := TIdSSLIOHandlerSocketOpenSSL.Create(HTTP);
SSL.ConnectTimeout := HTTP.ConnectTimeout;
SSL.ReadTimeout := HTTP.ReadTimeout;
SSL.SSLOptions.SSLVersions := [sslvTLSv1,sslvTLSv1_1,sslvTLSv1_2];
HTTP.IOHandler := SSL;
Started := Now;
try
HTTP.Get(ParamStr(1));
except
On E: Exception do WriteLn(E.Message);
end;
Writeln(FormatDateTime('hh:nn:ss',SecondsBetween(Started,Now) / SecsPerDay));
finally
HTTP.Free;
end;
end.
仅在使用http
时,使用https
的ConnectTimeout / ReadTimeout才能解决问题:
:~$ ./mcve http://x.x.x.x
Read timed out.
00:00:01 <-- Correct.
:~$ ./mcve https://x.x.x.x
Socket Error # 0
00:03:38 <-- NOT Correct / More than SSL.ReadTimeout value.
从OPM版本10.6.2.5494安装的Lazarus 2.0.6 Indy。
注意:在Windows上使用Delphi和出厂的Indy 10.6.2.5366的相同代码,结果按预期工作