diff options
author | Loïc Hoguin <[email protected]> | 2015-03-06 18:47:33 +0100 |
---|---|---|
committer | Loïc Hoguin <[email protected]> | 2015-03-06 18:47:33 +0100 |
commit | 02ff6533bbbc5dae95959c4979765d532d9e0af6 (patch) | |
tree | a1caf5f4ce58a99cce0f81662ba14b79f7770e05 /src/ranch_conns_sup.erl | |
parent | 3d713aefd4600ec3f6b2c9d6e25943af94f90972 (diff) | |
download | ranch-02ff6533bbbc5dae95959c4979765d532d9e0af6.tar.gz ranch-02ff6533bbbc5dae95959c4979765d532d9e0af6.tar.bz2 ranch-02ff6533bbbc5dae95959c4979765d532d9e0af6.zip |
Handle Transport:controlling_socket/2 errors and close the socket
Diffstat (limited to 'src/ranch_conns_sup.erl')
-rw-r--r-- | src/ranch_conns_sup.erl | 28 |
1 files changed, 17 insertions, 11 deletions
diff --git a/src/ranch_conns_sup.erl b/src/ranch_conns_sup.erl index d287c02..e6b6382 100644 --- a/src/ranch_conns_sup.erl +++ b/src/ranch_conns_sup.erl @@ -114,17 +114,23 @@ loop(State=#state{parent=Parent, ref=Ref, conn_type=ConnType, {?MODULE, start_protocol, To, Socket} -> case Protocol:start_link(Ref, Socket, Transport, Opts) of {ok, Pid} -> - Transport:controlling_process(Socket, Pid), - Pid ! {shoot, Ref, Transport, Socket, AckTimeout}, - put(Pid, true), - CurConns2 = CurConns + 1, - if CurConns2 < MaxConns -> - To ! self(), - loop(State, CurConns2, NbChildren + 1, - Sleepers); - true -> - loop(State, CurConns2, NbChildren + 1, - [To|Sleepers]) + case Transport:controlling_process(Socket, Pid) of + ok -> + Pid ! {shoot, Ref, Transport, Socket, AckTimeout}, + put(Pid, true), + CurConns2 = CurConns + 1, + if CurConns2 < MaxConns -> + To ! self(), + loop(State, CurConns2, NbChildren + 1, + Sleepers); + true -> + loop(State, CurConns2, NbChildren + 1, + [To|Sleepers]) + end; + {error, _} -> + Transport:close(Socket), + exit(Pid, kill), + loop(State, CurConns, NbChildren, Sleepers) end; Ret -> To ! self(), |