簡體   English   中英

如何在 Indy SSL 中設置 ConnectTimeout/ReadTimeout

[英]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 本身上手動設置ConnectTimeoutReadTimeout ,只需在客戶端組件(在本例中為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM