diff options
author | Loïc Hoguin <[email protected]> | 2011-03-18 00:15:46 +0100 |
---|---|---|
committer | Loïc Hoguin <[email protected]> | 2011-03-18 00:15:46 +0100 |
commit | f53235549d7d15a6ceeb105530d93786af1f0d57 (patch) | |
tree | 4b9508e27e05d32c68e25cbfbf2e2e51480d4bd3 | |
parent | a77b906b9f753b7ca30f4979551af0ac699b34ad (diff) | |
download | cowboy-f53235549d7d15a6ceeb105530d93786af1f0d57.tar.gz cowboy-f53235549d7d15a6ceeb105530d93786af1f0d57.tar.bz2 cowboy-f53235549d7d15a6ceeb105530d93786af1f0d57.zip |
Introduce Handler:init/2 for initializing the handler state.
We need an init function in order to process upgrade instructions
for protocols like WebSockets, but also to request an active receive
mode for long-polling connections, both of which will be implemented
at a later time.
-rw-r--r-- | README.md | 7 | ||||
-rw-r--r-- | src/cowboy_http_protocol.erl | 20 |
2 files changed, 20 insertions, 7 deletions
@@ -63,7 +63,10 @@ use one of the predefined handlers or write your own. An hello world HTTP handler could be written like this: -module(my_handler). - -export([handle/2]). + -export([init/2, handle/2]). - handle(Opts, Req) -> + init(Req, Opts) -> + {ok, undefined}. + + handle(Req, State) -> {reply, 200, [], "Hello World!"}. diff --git a/src/cowboy_http_protocol.erl b/src/cowboy_http_protocol.erl index d3d41f9..da10411 100644 --- a/src/cowboy_http_protocol.erl +++ b/src/cowboy_http_protocol.erl @@ -106,14 +106,24 @@ header({http_header, _I, Field, _R, Value}, Req, State) -> header(http_eoh, #http_req{host=undefined}, State) -> error_terminate(400, State); header(http_eoh, Req, State) -> - handler_loop(Req, State). + handler_init(Req, State). + +-spec handler_init(Req::#http_req{}, State::#state{}) -> ok. +handler_init(Req, State=#state{handler={Handler, Opts}}) -> + case Handler:init(Req, Opts) of + {ok, HandlerState} -> + handler_loop(HandlerState, Req, State) + %% @todo {mode, active}; {upgrade_protocol, Module}; {error, Reason} + end. --spec handler_loop(Req::#http_req{}, State::#state{}) -> ok. -handler_loop(Req, State=#state{handler={Handler, Opts}}) -> - case Handler:handle(Opts, Req) of +-spec handler_loop(HandlerState::term(), Req::#http_req{}, + State::#state{}) -> ok. +handler_loop(HandlerState, Req, State=#state{handler={Handler, _Opts}}) -> + case Handler:handle(Req, HandlerState) of + %% @todo {ok, HandlerState}; {mode, active} + %% @todo Move the reply code to the cowboy_http_req module. {reply, RCode, RHeaders, RBody} -> reply(RCode, RHeaders, RBody, State) - %% @todo stream_reply, request_body, stream_request_body... end. -spec error_terminate(Code::http_status(), State::#state{}) -> ok. |