Browse Source

Return errors from Transport:handshake

The "normal" errors are still silenced when calling ranch:handshake.
Loïc Hoguin 7 years ago
parent
commit
ad7efea77c
3 changed files with 22 additions and 18 deletions
  1. 18 5
      src/ranch.erl
  2. 3 12
      src/ranch_ssl.erl
  3. 1 1
      src/ranch_transport.erl

+ 18 - 5
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.

+ 3 - 12
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?

+ 1 - 1
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())