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

openSUSE Build Service is sponsored by