File 0936-inets-Handle-that-inet-ssl-setopt-can-return-error.patch of Package erlang
From 6881c9c532c7d9d19f039e2aa80c1d740295d220 Mon Sep 17 00:00:00 2001
From: Ingela Anderton Andin <ingela@erlang.org>
Date: Thu, 11 Jun 2020 09:53:30 +0200
Subject: [PATCH 3/3] inets: Handle that inet/ssl:setopt can return error
---
lib/ftp/src/ftp.erl | 4 +-
lib/inets/src/http_client/httpc_handler.erl | 18 ++++----
lib/inets/src/http_lib/http_transport.erl | 6 +++
.../src/http_server/httpd_request_handler.erl | 45 ++++++++++---------
4 files changed, 41 insertions(+), 32 deletions(-)
diff --git a/lib/inets/src/ftp/ftp.erl b/lib/inets/src/ftp/ftp.erl
index dac316fe0b..b94c535467 100644
--- a/lib/inets/src/ftp/ftp.erl
+++ b/lib/inets/src/ftp/ftp.erl
@@ -2274,8 +2274,8 @@ activate_connection(Socket) ->
activate_connection(ssl, ssl_closed, Socket)
end.
-activate_connection(API, CloseTag, Socket) ->
- Socket = unwrap_socket(Socket),
+activate_connection(API, CloseTag, Socket0) ->
+ Socket = unwrap_socket(Socket0),
case API:setopts(Socket, [{active, once}]) of
ok ->
ok;
diff --git a/lib/inets/src/http_client/httpc_handler.erl b/lib/inets/src/http_client/httpc_handler.erl
index 3f91ae062c..1f8806d1d8 100644
--- a/lib/inets/src/http_client/httpc_handler.erl
+++ b/lib/inets/src/http_client/httpc_handler.erl
@@ -831,8 +831,7 @@ connect_and_send_first_request(Address, Request, #state{options = Options0} = St
headers = undefined,
body = undefined,
status = new},
- http_transport:setopts(SocketType,
- Socket, [{active, once}]),
+ activate_once(Session),
NewState = activate_request_timeout(TmpState),
{ok, NewState};
{error, Reason} ->
@@ -1238,7 +1237,12 @@ case_insensitive_header(Str) ->
Str.
activate_once(#session{socket = Socket, socket_type = SocketType}) ->
- http_transport:setopts(SocketType, Socket, [{active, once}]).
+ case http_transport:setopts(SocketType, Socket, [{active, once}]) of
+ ok ->
+ ok;
+ {error, _} -> %% inet can return einval instead of closed
+ self() ! {http_transport:close_tag(SocketType), Socket}
+ end.
close_socket(#session{socket = {remote_close,_}}) ->
ok;
@@ -1581,8 +1585,7 @@ send_raw(SocketType, Socket, ProcessBody, Acc) ->
end
end.
-tls_tunnel(Address, Request, #state{session = #session{socket = Socket,
- socket_type = SocketType} = Session} = State,
+tls_tunnel(Address, Request, #state{session = #session{} = Session} = State,
ErrorHandler) ->
UpgradeRequest = tls_tunnel_request(Request),
case httpc_request:send(Address, Session, UpgradeRequest) of
@@ -1594,8 +1597,7 @@ tls_tunnel(Address, Request, #state{session = #session{socket = Socket,
init_status_line(UpgradeRequest),
headers = undefined,
body = undefined},
- http_transport:setopts(SocketType,
- Socket, [{active, once}]),
+ activate_once(Session),
NewState = activate_request_timeout(TmpState),
{ok, NewState#state{status = {ssl_tunnel, Request}}};
{error, Reason} ->
@@ -1661,7 +1663,7 @@ tls_upgrade(#state{status =
type = SessionType,
client_close = ClientClose},
httpc_request:send(Address, Session, Request),
- http_transport:setopts(SocketType, TLSSocket, [{active, once}]),
+ activate_once(Session),
NewState = State#state{session = Session,
request = Request,
mfa = init_mfa(Request, State),
diff --git a/lib/inets/src/http_lib/http_transport.erl b/lib/inets/src/http_lib/http_transport.erl
index d5e1d71336..d2148a3a8a 100644
--- a/lib/inets/src/http_lib/http_transport.erl
+++ b/lib/inets/src/http_lib/http_transport.erl
@@ -27,6 +27,7 @@
listen/4, listen/5,
accept/2, accept/3,
close/2,
+ close_tag/1,
send/3,
controlling_process/3,
setopts/3, getopts/2, getopts/3,
@@ -459,6 +460,11 @@ ipv6_name({A, B, C, D, E, F, G, H}) ->
http_util:integer_to_hexlist(H).
+close_tag(ip_comm) ->
+ tcp_closed;
+close_tag(_) ->
+ ssl_closed.
+
%%%========================================================================
%%% Internal functions
%%%========================================================================
--
2.26.2