aboutsummaryrefslogtreecommitdiffstats
path: root/src/ranch_conns_sup.erl
diff options
context:
space:
mode:
authorLoïc Hoguin <[email protected]>2015-03-06 18:47:33 +0100
committerLoïc Hoguin <[email protected]>2015-03-06 18:47:33 +0100
commit02ff6533bbbc5dae95959c4979765d532d9e0af6 (patch)
treea1caf5f4ce58a99cce0f81662ba14b79f7770e05 /src/ranch_conns_sup.erl
parent3d713aefd4600ec3f6b2c9d6e25943af94f90972 (diff)
downloadranch-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.erl28
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(),