diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/ranch_acceptor.erl | 18 | ||||
-rw-r--r-- | src/ranch_ssl.erl | 6 |
2 files changed, 17 insertions, 7 deletions
diff --git a/src/ranch_acceptor.erl b/src/ranch_acceptor.erl index e03cde9..d208a7f 100644 --- a/src/ranch_acceptor.erl +++ b/src/ranch_acceptor.erl @@ -46,6 +46,11 @@ init(LSocket, Transport, Protocol, MaxConns, Opts, ListenerPid, ConnsSup) -> non_neg_integer(), any(), pid(), pid()) -> no_return(). loop(LSocket, Transport, Protocol, MaxConns, Opts, ListenerPid, ConnsSup) -> receive + %% We couldn't accept the socket but it's safe to continue. + {accept, continue} -> + ?MODULE:init(LSocket, Transport, Protocol, + MaxConns, Opts, ListenerPid, ConnsSup); + %% Found my sockets! {accept, CSocket} -> {ok, ConnPid} = supervisor:start_child(ConnsSup, [ListenerPid, CSocket, Transport, Protocol, Opts]), @@ -55,6 +60,7 @@ loop(LSocket, Transport, Protocol, MaxConns, Opts, ListenerPid, ConnsSup) -> maybe_wait(ListenerPid, MaxConns, NbConns), ?MODULE:init(LSocket, Transport, Protocol, MaxConns, Opts, ListenerPid, ConnsSup); + %% Upgrade the protocol options. {set_opts, Opts2} -> ?MODULE:loop(LSocket, Transport, Protocol, MaxConns, Opts2, ListenerPid, ConnsSup) @@ -72,9 +78,13 @@ maybe_wait(ListenerPid, MaxConns, _) -> async_accept(LSocket, Transport) -> AcceptorPid = self(), _ = spawn_link(fun() -> - %% @todo {error, closed} must be handled and other errors ignored. - {ok, CSocket} = Transport:accept(LSocket, infinity), - Transport:controlling_process(CSocket, AcceptorPid), - AcceptorPid ! {accept, CSocket} + case Transport:accept(LSocket, infinity) of + {ok, CSocket} -> + Transport:controlling_process(CSocket, AcceptorPid), + AcceptorPid ! {accept, CSocket}; + %% We want to crash if the listening socket got closed. + {error, Reason} when Reason =/= closed -> + AcceptorPid ! {accept, continue} + end end), ok. diff --git a/src/ranch_ssl.erl b/src/ranch_ssl.erl index 51ea128..d85c05f 100644 --- a/src/ranch_ssl.erl +++ b/src/ranch_ssl.erl @@ -111,7 +111,7 @@ listen(Opts) -> %% @see ssl:transport_accept/2 %% @see ssl:ssl_accept/2 -spec accept(ssl:sslsocket(), timeout()) - -> {ok, ssl:sslsocket()} | {error, closed | timeout | atom()}. + -> {ok, ssl:sslsocket()} | {error, closed | timeout | atom() | tuple()}. accept(LSocket, Timeout) -> case ssl:transport_accept(LSocket, Timeout) of {ok, CSocket} -> @@ -179,11 +179,11 @@ require([App|Tail]) -> require(Tail). -spec ssl_accept(ssl:sslsocket(), timeout()) - -> {ok, ssl:sslsocket()} | {error, closed | timeout | atom()}. + -> {ok, ssl:sslsocket()} | {error, {ssl_accept, atom()}}. ssl_accept(Socket, Timeout) -> case ssl:ssl_accept(Socket, Timeout) of ok -> {ok, Socket}; {error, Reason} -> - {error, Reason} + {error, {ssl_accept, Reason}} end. |