diff options
author | Loïc Hoguin <[email protected]> | 2012-01-30 09:34:29 +0100 |
---|---|---|
committer | Loïc Hoguin <[email protected]> | 2012-01-31 08:49:15 +0100 |
commit | e5aef5c1d7be8cffedfedda77d035fa30d5513dc (patch) | |
tree | ae6d7e64779299ab6a26208d83f1c56d345c7587 /src/cowboy_acceptor.erl | |
parent | 830cfc002e992126a2c605594f25d40a5a193968 (diff) | |
download | cowboy-e5aef5c1d7be8cffedfedda77d035fa30d5513dc.tar.gz cowboy-e5aef5c1d7be8cffedfedda77d035fa30d5513dc.tar.bz2 cowboy-e5aef5c1d7be8cffedfedda77d035fa30d5513dc.zip |
Add cowboy:get_protocol_options/1 and cowboy_set_protocol_options/2
This allows any application to upgrade the protocol options without
having to restart the listener. This is most useful to update the
dispatch list of HTTP servers, for example.
The upgrade is done at the acceptor level, meaning only new connections
receive the new protocol options.
Diffstat (limited to 'src/cowboy_acceptor.erl')
-rw-r--r-- | src/cowboy_acceptor.erl | 28 |
1 files changed, 17 insertions, 11 deletions
diff --git a/src/cowboy_acceptor.erl b/src/cowboy_acceptor.erl index d46e212..29f7c09 100644 --- a/src/cowboy_acceptor.erl +++ b/src/cowboy_acceptor.erl @@ -16,7 +16,7 @@ -module(cowboy_acceptor). -export([start_link/6]). %% API. --export([acceptor/6]). %% Internal. +-export([acceptor/7]). %% Internal. %% API. @@ -25,27 +25,33 @@ start_link(LSocket, Transport, Protocol, Opts, ListenerPid, ReqsSup) -> Pid = spawn_link(?MODULE, acceptor, - [LSocket, Transport, Protocol, Opts, ListenerPid, ReqsSup]), + [LSocket, Transport, Protocol, Opts, 1, ListenerPid, ReqsSup]), {ok, Pid}. %% Internal. -spec acceptor(inet:socket(), module(), module(), any(), - pid(), pid()) -> no_return(). -acceptor(LSocket, Transport, Protocol, Opts, ListenerPid, ReqsSup) -> - case Transport:accept(LSocket, 2000) of + non_neg_integer(), pid(), pid()) -> no_return(). +acceptor(LSocket, Transport, Protocol, Opts, OptsVsn, ListenerPid, ReqsSup) -> + Res = case Transport:accept(LSocket, 2000) of {ok, CSocket} -> {ok, Pid} = supervisor:start_child(ReqsSup, [ListenerPid, CSocket, Transport, Protocol, Opts]), Transport:controlling_process(CSocket, Pid), - ok = cowboy_listener:add_connection(ListenerPid, - default, Pid); + cowboy_listener:add_connection(ListenerPid, + default, Pid, OptsVsn); {error, timeout} -> - ignore; + ok; {error, _Reason} -> %% @todo Probably do something here. If the socket was closed, %% we may want to try and listen again on the port? - ignore + ok end, - ?MODULE:acceptor(LSocket, Transport, Protocol, Opts, - ListenerPid, ReqsSup). + case Res of + ok -> + ?MODULE:acceptor(LSocket, Transport, Protocol, + Opts, OptsVsn, ListenerPid, ReqsSup); + {upgrade, Opts2, OptsVsn2} -> + ?MODULE:acceptor(LSocket, Transport, Protocol, + Opts2, OptsVsn2, ListenerPid, ReqsSup) + end. |