From b665d3fb9cdeccb4dbb57369a4c9a0059dfebfa6 Mon Sep 17 00:00:00 2001 From: Benoit Chesneau Date: Thu, 24 Jul 2025 16:01:49 +0200 Subject: [PATCH] fix: respect connect timeout in ssl:connect Measure elapsed time during TCP connection and pass remaining timeout to SSL handshake. Handle infinity timeout case and close socket on timeout. Closes #776 --- src/hackney_ssl.erl | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/hackney_ssl.erl b/src/hackney_ssl.erl index c1296637..b6add36f 100644 --- a/src/hackney_ssl.erl +++ b/src/hackney_ssl.erl @@ -130,9 +130,22 @@ connect(Host, Port, Opts0, Timeout) when is_list(Host), is_integer(Port), SSLOpts = proplists:get_value(ssl_options, Opts0), BaseOpts = [binary, {active, false}, {packet, raw}], Opts1 = hackney_util:merge_opts(BaseOpts, proplists:delete(ssl_options, Opts0)), + Now = erlang:monotonic_time(millisecond), case hackney_happy:connect(Host, Port, Opts1, Timeout) of {ok, Sock} -> - ssl:connect(Sock, SSLOpts); + case Timeout of + infinity -> + ssl:connect(Sock, SSLOpts); + _ -> + Elapsed = erlang:monotonic_time(millisecond) - Now, + case Timeout - Elapsed of + TimeoutLeft when TimeoutLeft > 0 -> + ssl:connect(Sock, SSLOpts, TimeoutLeft); + _ -> + gen_tcp:close(Sock), + {error, timeout} + end + end; Error -> Error end.