aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJan Uhlig <[email protected]>2024-11-07 08:23:17 +0100
committerLoïc Hoguin <[email protected]>2024-11-12 14:56:27 +0100
commitb0f008d64cde4593d881aba7b4eb90a875919a46 (patch)
tree63f5f7e47a3b42c9b610acab57dc912a0fc22342 /src
parent42d7f3d3585a7f956d87ed53407e517a44f8f98b (diff)
downloadranch-b0f008d64cde4593d881aba7b4eb90a875919a46.tar.gz
ranch-b0f008d64cde4593d881aba7b4eb90a875919a46.tar.bz2
ranch-b0f008d64cde4593d881aba7b4eb90a875919a46.zip
Improve peer info detection for extended error reason
Diffstat (limited to 'src')
-rw-r--r--src/ranch.erl19
1 files changed, 12 insertions, 7 deletions
diff --git a/src/ranch.erl b/src/ranch.erl
index ce0c047..e52f0e7 100644
--- a/src/ranch.erl
+++ b/src/ranch.erl
@@ -301,8 +301,9 @@ handshake(Ref, Opts) ->
handshake1(Ref, Opts) ->
receive {handshake, Ref, Transport, CSocket, Timeout} ->
+ PeerInfo = get_peer_info(Transport, CSocket, undefined),
Handshake = handshake_transport(Transport, handshake, CSocket, Opts, Timeout),
- handshake_result(Handshake, Ref, Transport, CSocket, Timeout)
+ handshake_result(Handshake, Ref, Transport, CSocket, PeerInfo, Timeout)
end.
-spec handshake_continue(ref()) -> {ok, ranch_transport:socket()}.
@@ -315,8 +316,9 @@ handshake_continue(Ref, Opts) ->
handshake_continue1(Ref, Opts) ->
receive {handshake_continue, Ref, Transport, CSocket, Timeout} ->
+ PeerInfo = get_peer_info(Transport, CSocket, undefined),
Handshake = handshake_transport(Transport, handshake_continue, CSocket, Opts, Timeout),
- handshake_result(Handshake, Ref, Transport, CSocket, Timeout)
+ handshake_result(Handshake, Ref, Transport, CSocket, PeerInfo, Timeout)
end.
handshake_transport(Transport, Fun, CSocket, undefined, Timeout) ->
@@ -324,7 +326,7 @@ handshake_transport(Transport, Fun, CSocket, undefined, Timeout) ->
handshake_transport(Transport, Fun, CSocket, {opts, Opts}, Timeout) ->
Transport:Fun(CSocket, Opts, Timeout).
-handshake_result(Result, Ref, Transport, CSocket, Timeout) ->
+handshake_result(Result, Ref, Transport, CSocket, PeerInfo0, Timeout) ->
case Result of
OK = {ok, _} ->
OK;
@@ -332,10 +334,7 @@ handshake_result(Result, Ref, Transport, CSocket, Timeout) ->
self() ! {handshake_continue, Ref, Transport, CSocket2, Timeout},
{continue, Info};
{error, Reason} ->
- PeerInfo = case Transport:peername(CSocket) of
- {ok, Peer} -> Peer;
- {error, _} -> undefined
- end,
+ PeerInfo = get_peer_info(Transport, CSocket, PeerInfo0),
ok = Transport:close(CSocket),
exit({shutdown, {Reason, PeerInfo}})
end.
@@ -346,6 +345,12 @@ handshake_cancel(Ref) ->
Transport:handshake_cancel(CSocket)
end.
+get_peer_info(Transport, Socket, Default) ->
+ case Transport:peername(Socket) of
+ {ok, Peer} -> Peer;
+ {error, _} -> Default
+ end.
+
%% Unlike handshake/2 this function always return errors because
%% the communication between the proxy and the server are expected
%% to be reliable. If there is a problem while receiving the proxy