diff options
author | Loïc Hoguin <[email protected]> | 2018-07-04 12:58:51 +0200 |
---|---|---|
committer | Loïc Hoguin <[email protected]> | 2018-07-04 13:01:47 +0200 |
commit | ad7efea77cdad5bba83529a7494b49d1e9a19ca0 (patch) | |
tree | 3e7de543a431e7c057cf964cdcd086365b49a8d1 | |
parent | a767abb47e6d9a0817d37413e1b5c1d338b362d8 (diff) | |
download | ranch-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.erl | 23 | ||||
-rw-r--r-- | src/ranch_ssl.erl | 15 | ||||
-rw-r--r-- | src/ranch_transport.erl | 2 |
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()) |