diff options
author | Loïc Hoguin <[email protected]> | 2012-02-20 09:31:22 +0100 |
---|---|---|
committer | Loïc Hoguin <[email protected]> | 2012-02-20 09:31:22 +0100 |
commit | db382d4d392930c9b4e9789605afda51fa710d42 (patch) | |
tree | 6f5b255b99b16c9c3a62948124d5e176fe409c21 | |
parent | 811d11a1a28e9d044cb328d62e3c01bb3c536fb5 (diff) | |
download | cowboy-db382d4d392930c9b4e9789605afda51fa710d42.tar.gz cowboy-db382d4d392930c9b4e9789605afda51fa710d42.tar.bz2 cowboy-db382d4d392930c9b4e9789605afda51fa710d42.zip |
Check for upgrades on accept timeout
Otherwise acceptors will not be upgraded properly until after the
next request comes in.
Thanks to DeadZen for pointing it out.
-rw-r--r-- | src/cowboy_acceptor.erl | 2 | ||||
-rw-r--r-- | src/cowboy_listener.erl | 15 |
2 files changed, 15 insertions, 2 deletions
diff --git a/src/cowboy_acceptor.erl b/src/cowboy_acceptor.erl index 29f7c09..b2a1ef0 100644 --- a/src/cowboy_acceptor.erl +++ b/src/cowboy_acceptor.erl @@ -41,7 +41,7 @@ acceptor(LSocket, Transport, Protocol, Opts, OptsVsn, ListenerPid, ReqsSup) -> cowboy_listener:add_connection(ListenerPid, default, Pid, OptsVsn); {error, timeout} -> - ok; + cowboy_listener:check_upgrades(ListenerPid, OptsVsn); {error, _Reason} -> %% @todo Probably do something here. If the socket was closed, %% we may want to try and listen again on the port? diff --git a/src/cowboy_listener.erl b/src/cowboy_listener.erl index ad54941..4b2c2fb 100644 --- a/src/cowboy_listener.erl +++ b/src/cowboy_listener.erl @@ -17,7 +17,7 @@ -behaviour(gen_server). -export([start_link/2, stop/1, - add_connection/4, move_connection/3, remove_connection/2, + add_connection/4, move_connection/3, remove_connection/2, check_upgrades/2, get_protocol_options/1, set_protocol_options/2]). %% API. -export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]). %% gen_server. @@ -84,6 +84,12 @@ move_connection(ServerPid, DestPool, ConnPid) -> remove_connection(ServerPid, ConnPid) -> gen_server:cast(ServerPid, {remove_connection, ConnPid}). +%% @doc Return whether a protocol upgrade is required. +-spec check_upgrades(pid(), non_neg_integer()) + -> ok | {upgrade, any(), non_neg_integer()}. +check_upgrades(ServerPid, OptsVsn) -> + gen_server:call(ServerPid, {check_upgrades, OptsVsn}). + %% @doc Return the current protocol options. -spec get_protocol_options(pid()) -> {ok, any()}. get_protocol_options(ServerPid) -> @@ -121,6 +127,13 @@ handle_call({add_connection, Pool, ConnPid, AccOptsVsn}, From, State=#state{ true -> {reply, ok, State2} end; +handle_call({check_upgrades, AccOptsVsn}, _From, State=#state{ + proto_opts=ProtoOpts, proto_opts_vsn=LisOptsVsn}) -> + if AccOptsVsn =/= LisOptsVsn -> + {reply, {upgrade, ProtoOpts, LisOptsVsn}, State}; + true -> + {reply, ok, State} + end; handle_call(get_protocol_options, _From, State=#state{proto_opts=ProtoOpts}) -> {reply, {ok, ProtoOpts}, State}; handle_call({set_protocol_options, ProtoOpts}, _From, |