File 1404-inets-re-use-connect_timeout-option-in-TLS-upgrade.patch of Package erlang
From 98123fc35f868187f085d2e74f2079f2a7237dac Mon Sep 17 00:00:00 2001
From: Jakub Witczak <kuba@erlang.org>
Date: Fri, 25 Mar 2022 15:49:55 +0100
Subject: [PATCH] inets: re-use connect_timeout option in TLS upgrade
- re-use connect_timeout during TLS upgrade of connection over proxy
- connect_timeout test in inets
- TLS upgrade client timeout test in ssl
---
lib/inets/src/http_client/httpc_handler.erl | 6 ++--
lib/inets/test/httpc_proxy_SUITE.erl | 22 +++++++++++--
lib/ssl/test/ssl_test_lib.erl | 21 +++++++++++++
lib/ssl/test/tls_api_SUITE.erl | 34 +++++++++++++++++++++
4 files changed, 77 insertions(+), 6 deletions(-)
diff --git a/lib/inets/src/http_client/httpc_handler.erl b/lib/inets/src/http_client/httpc_handler.erl
index c5993cc37c..b7f79a5ed3 100644
--- a/lib/inets/src/http_client/httpc_handler.erl
+++ b/lib/inets/src/http_client/httpc_handler.erl
@@ -1637,14 +1637,14 @@ host_header(_, URI) ->
tls_upgrade(#state{status =
{ssl_tunnel,
#request{settings =
- #http_options{ssl = {_, TLSOptions0} = SocketType},
+ #http_options{ssl = {_, TLSOptions0} = SocketType,
+ connect_timeout = ConnectTimeout},
address = {Host, _} = Address} = Request},
session = #session{socket = TCPSocket} = Session0,
options = Options} = State) ->
TLSOptions = maybe_add_sni(Host, TLSOptions0),
-
- case ssl:connect(TCPSocket, TLSOptions) of
+ case ssl:connect(TCPSocket, TLSOptions, ConnectTimeout) of
{ok, TLSSocket} ->
ClientClose = httpc_request:is_client_closing(Request#request.headers),
SessionType = httpc_manager:session_type(Options),
diff --git a/lib/inets/test/httpc_proxy_SUITE.erl b/lib/inets/test/httpc_proxy_SUITE.erl
index a962867ce1..d47d340b45 100644
--- a/lib/inets/test/httpc_proxy_SUITE.erl
+++ b/lib/inets/test/httpc_proxy_SUITE.erl
@@ -78,7 +78,8 @@ local_proxy_cases() ->
http_not_modified_otp_6821].
local_proxy_https_cases() ->
- [https_connect_error].
+ [https_connect_error,
+ http_timeout].
%%--------------------------------------------------------------------
@@ -445,6 +446,21 @@ https_connect_error(Config) when is_list(Config) ->
httpc:request(Method, Request, HttpOpts, Opts).
%%--------------------------------------------------------------------
+http_timeout(doc) ->
+ ["Test http/https connect and upgrade timeouts."];
+http_timeout(Config) when is_list(Config) ->
+ Method = get,
+ URL = url("/index.html", Config),
+ Request = {URL,[]},
+ Timeout = timer:seconds(1),
+ HttpOpts1 = [{timeout, Timeout}, {connect_timeout, 0}],
+ {error,
+ {failed_connect,
+ [{to_address,{"localhost",8000}},
+ {inet,[inet],timeout}]}}
+ = httpc:request(Method, Request, HttpOpts1, []),
+ ok.
+%%--------------------------------------------------------------------
%% Internal Functions ------------------------------------------------
%%--------------------------------------------------------------------
diff --git a/lib/ssl/test/ssl_test_lib.erl b/lib/ssl/test/ssl_test_lib.erl
index d5899d9711..2f7314adb8 100644
--- a/lib/ssl/test/ssl_test_lib.erl
+++ b/lib/ssl/test/ssl_test_lib.erl
@@ -1990,6 +1992,25 @@ run_upgrade_client(Opts) ->
rpc:call(Node, ssl, close, [SslSocket])
end.
+start_upgrade_client_error(Args) ->
+ Node = proplists:get_value(node, Args),
+ spawn_link(Node, ?MODULE, run_upgrade_client_error, [Args]).
+
+run_upgrade_client_error(Opts) ->
+ Host = proplists:get_value(host, Opts),
+ Port = proplists:get_value(port, Opts),
+ Pid = proplists:get_value(from, Opts),
+ Timeout = proplists:get_value(timeout, Opts, infinity),
+ TcpOptions = proplists:get_value(tcp_options, Opts),
+ SslOptions = proplists:get_value(ssl_options, Opts),
+ ?LOG("gen_tcp:connect(~p, ~p, ~p)",
+ [Host, Port, TcpOptions]),
+ {ok, Socket} = gen_tcp:connect(Host, Port, TcpOptions),
+ send_selected_port(Pid, Port, Socket),
+ ?LOG("ssl:connect(~p, ~p)", [Socket, SslOptions]),
+ Error = ssl:connect(Socket, SslOptions, Timeout),
+ Pid ! {self(), Error}.
+
start_upgrade_server_error(Args) ->
Result = spawn_link(?MODULE, run_upgrade_server_error, [Args]),
receive
--
2.34.1