[英]How to set ConnectTimeout/ReadTimeout in Indy SSL
使用 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
ConnectTimeout/ReadTimeout 時,僅在使用https
時才能正常工作,請參見下文:
:~$ ./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 相同的代碼,結果按預期工作
您無需在 IOHandler 本身上手動設置ConnectTimeout
和ReadTimeout
,只需在客戶端組件(在本例中為TIdHTTP
)。 TIdTCPClient.Connect()
將為您將值分配給 IOHandler。
ConnectTimeout
適用於底層套接字連接到服務器時,在創建任何 SSL/TLS session 之前,因此無論您是否使用 SSL/TLS,它的操作都相同。
當 Indy 嘗試從 IOHandler 的內部連接讀取字節時, ReadTimeout
應用。 當不使用 SSL/TLS 時,這意味着它直接進入套接字,因此當沒有字節到達套接字時超時。 但是在使用 SSL/TLS 時,Indy 使用 OpenSSL 的舊版SSL_...()
API,而不是較新的BIO_...()
API,這意味着 OpenSSL 代表 Indy 進行自己的套接字讀取和緩沖,因此 Indy 超時當 OpenSSL 不提供任何解密的應用程序字節時。
One difference in how TIdSSLIOHandlerSocketOpenSSL
operates on Windows vs other platforms is that on Windows Vista+ only, TIdSSLIOHandlerSocketOpenSSL
does apply the ReadTimeout
to the underlying socket's SO_RCVTIMEO
and SO_SNDTIMEO
timeouts via the IOHandler's Binding.SetSockOpt()
method, as a workaround to an OpenSSL bug on Windows . 對於其他平台,Indy 目前沒有設置這兩個套接字超時。
手動設置這些超時的好地方是在 IOHandler 的OnBeforeConnect
事件中,該事件在套接字連接到服務器之后和創建任何 SSL/TLS session 之前觸發。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.