From 77ed10274c3a640c996dc05bcd002fe0b25f402c Mon Sep 17 00:00:00 2001 From: Maas-Maarten Zeeman Date: Sat, 16 Nov 2013 11:28:43 +0100 Subject: [PATCH] Pass handler state from init to handle --- src/elli_example_callback_handover.erl | 4 ++-- src/elli_http.erl | 22 ++++++++++++---------- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/src/elli_example_callback_handover.erl b/src/elli_example_callback_handover.erl index f8c684a..4b2329a 100644 --- a/src/elli_example_callback_handover.erl +++ b/src/elli_example_callback_handover.erl @@ -1,7 +1,7 @@ -module(elli_example_callback_handover). -export([init/2, handle/2, handle_event/3]). -init(Req, Args) -> +init(Req, _Args) -> case elli_request:path(Req) of [<<"hello">>, <<"world">>] -> {ok, handover}; @@ -9,7 +9,7 @@ init(Req, Args) -> ignore end. -handle(Req, Args) -> +handle(Req, _Args) -> handle(elli_request:method(Req), elli_request:path(Req), Req). diff --git a/src/elli_http.erl b/src/elli_http.erl index 921bf38..6a3594f 100644 --- a/src/elli_http.erl +++ b/src/elli_http.erl @@ -65,31 +65,31 @@ keepalive_loop(Socket, NumRequests, Buffer, Options, Callback) -> %% @doc: Handle a HTTP request that will possibly come on the %% socket. Returns the appropriate connection token and any buffer %% containing (parts of) the next request. -handle_request(S, PrevB, Opts, {Mod, Args} = Callback) -> +handle_request(S, PrevB, Opts, {Mod, _} = Callback) -> {Method, RawPath, V, B0} = get_request(S, PrevB, Opts, Callback), t(request_start), {RequestHeaders, B1} = get_headers(S, V, B0, Opts, Callback), t(headers_end), Req = mk_req(Method, RawPath, RequestHeaders, <<>>, V, S, Callback), case init(Req) of - {ok, standard} -> + {ok, standard, Req1} -> {RequestBody, B2} = get_body(S, RequestHeaders, B1, Opts, Callback), t(body_end), - Req1 = Req#req{body = RequestBody}, + Req1 = Req1#req{body = RequestBody}, t(user_start), Response = execute_callback(Req1), t(user_end), handle_response(Req1, B2, Response); - {ok, handover} -> - Req1 = Req#req{body = B1}, + {ok, handover, #req{callback = {_,State}}=Req1} -> + Req2 = Req1#req{body = B1}, t(user_start), - Response = Mod:handle(Req1, Args), + Response = Mod:handle(Req2, State), t(user_end), t(request_end), - handle_event(Mod, request_complete, [Req1, handover, [], <<>>, get_timings()], Args), + handle_event(Mod, request_complete, [Req2, handover, [], <<>>, get_timings()], State), Response end. @@ -568,12 +568,14 @@ init(#req{callback = {Mod, Args}} = Req) -> true -> case Mod:init(Req, Args) of ignore -> - {ok, standard}; + {ok, standard, Req}; {ok, Behaviour} -> - {ok, Behaviour} + {ok, Behaviour, Req}; + {ok, Behaviour, HandlerState} -> + {ok, Behaviour, Req#req{callback={Mod, HandlerState}}} end; false -> - {ok, standard} + {ok, standard, Req} end. handle_event(Mod, Name, EventArgs, ElliArgs) ->