aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLoïc Hoguin <[email protected]>2018-07-04 12:58:51 +0200
committerLoïc Hoguin <[email protected]>2018-07-04 13:01:47 +0200
commitad7efea77cdad5bba83529a7494b49d1e9a19ca0 (patch)
tree3e7de543a431e7c057cf964cdcd086365b49a8d1
parenta767abb47e6d9a0817d37413e1b5c1d338b362d8 (diff)
downloadranch-ad7efea77cdad5bba83529a7494b49d1e9a19ca0.tar.gz
ranch-ad7efea77cdad5bba83529a7494b49d1e9a19ca0.tar.bz2
ranch-ad7efea77cdad5bba83529a7494b49d1e9a19ca0.zip
Return errors from Transport:handshake
The "normal" errors are still silenced when calling ranch:handshake.
-rw-r--r--src/ranch.erl23
-rw-r--r--src/ranch_ssl.erl15
-rw-r--r--src/ranch_transport.erl2
3 files changed, 22 insertions, 18 deletions
diff --git a/src/ranch.erl b/src/ranch.erl
index cab6e8f..9352ccc 100644
--- a/src/ranch.erl
+++ b/src/ranch.erl
@@ -228,9 +228,8 @@ child_spec(Ref, NumAcceptors, Transport, TransOpts0, Protocol, ProtoOpts)
-spec accept_ack(ref()) -> ok.
accept_ack(Ref) ->
- receive {handshake, Ref, Transport, Socket, HandshakeTimeout} ->
- Transport:accept_ack(Socket, HandshakeTimeout)
- end.
+ {ok, _} = handshake(Ref),
+ ok.
-spec handshake(ref()) -> {ok, ranch_transport:socket()}.
handshake(Ref) ->
@@ -238,8 +237,22 @@ handshake(Ref) ->
-spec handshake(ref(), any()) -> {ok, ranch_transport:socket()}.
handshake(Ref, Opts) ->
- receive {handshake, Ref, Transport, Socket, HandshakeTimeout} ->
- Transport:handshake(Socket, Opts, HandshakeTimeout)
+ receive {handshake, Ref, Transport, CSocket, HandshakeTimeout} ->
+ case Transport:handshake(CSocket, Opts, HandshakeTimeout) of
+ OK = {ok, _} ->
+ OK;
+ %% Garbage was most likely sent to the socket, don't error out.
+ {error, {tls_alert, _}} ->
+ ok = Transport:close(CSocket),
+ exit(normal);
+ %% Socket most likely stopped responding, don't error out.
+ {error, Reason} when Reason =:= timeout; Reason =:= closed ->
+ ok = Transport:close(CSocket),
+ exit(normal);
+ {error, Reason} ->
+ ok = Transport:close(CSocket),
+ error(Reason)
+ end
end.
-spec remove_connection(ref()) -> ok.
diff --git a/src/ranch_ssl.erl b/src/ranch_ssl.erl
index f9203e6..e1e6532 100644
--- a/src/ranch_ssl.erl
+++ b/src/ranch_ssl.erl
@@ -136,24 +136,15 @@ accept_ack(CSocket, Timeout) ->
ok.
-spec handshake(inet:socket() | ssl:sslsocket(), opts(), timeout())
- -> {ok, ssl:sslsocket()}.
+ -> {ok, ssl:sslsocket()} | {error, any()}.
handshake(CSocket, Opts, Timeout) ->
case ssl:ssl_accept(CSocket, Opts, Timeout) of
ok ->
{ok, CSocket};
{ok, NewSocket} ->
{ok, NewSocket};
- %% Garbage was most likely sent to the socket, don't error out.
- {error, {tls_alert, _}} ->
- ok = close(CSocket),
- exit(normal);
- %% Socket most likely stopped responding, don't error out.
- {error, Reason} when Reason =:= timeout; Reason =:= closed ->
- ok = close(CSocket),
- exit(normal);
- {error, Reason} ->
- ok = close(CSocket),
- error(Reason)
+ Error = {error, _} ->
+ Error
end.
%% @todo Probably filter Opts?
diff --git a/src/ranch_transport.erl b/src/ranch_transport.erl
index 9d3083f..e2a0fd4 100644
--- a/src/ranch_transport.erl
+++ b/src/ranch_transport.erl
@@ -30,7 +30,7 @@
-callback listen(opts()) -> {ok, socket()} | {error, atom()}.
-callback accept(socket(), timeout())
-> {ok, socket()} | {error, closed | timeout | atom()}.
--callback handshake(socket(), opts(), timeout()) -> {ok, socket()}.
+-callback handshake(socket(), opts(), timeout()) -> {ok, socket()} | {error, any()}.
-callback connect(string(), inet:port_number(), opts())
-> {ok, socket()} | {error, atom()}.
-callback connect(string(), inet:port_number(), opts(), timeout())