aboutsummaryrefslogtreecommitdiffstats
path: root/src/cowboy_handler.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/cowboy_handler.erl')
-rw-r--r--src/cowboy_handler.erl62
1 files changed, 21 insertions, 41 deletions
diff --git a/src/cowboy_handler.erl b/src/cowboy_handler.erl
index a666714..e3faf66 100644
--- a/src/cowboy_handler.erl
+++ b/src/cowboy_handler.erl
@@ -21,7 +21,15 @@
-behaviour(cowboy_middleware).
-export([execute/2]).
--export([terminate/5]).
+-export([terminate/4]).
+
+-callback init(Req, any())
+ -> {ok | module(), Req, any()}
+ | {module(), Req, any(), hibernate}
+ | {module(), Req, any(), timeout()}
+ | {module(), Req, any(), timeout(), hibernate}
+ when Req::cowboy_req:req().
+%% @todo optional -callback terminate(terminate_reason(), cowboy_req:req(), state()) -> ok.
-spec execute(Req, Env) -> {ok, Req, Env}
when Req::cowboy_req:req(), Env::cowboy_middleware:env().
@@ -29,21 +37,21 @@ execute(Req, Env) ->
{_, Handler} = lists:keyfind(handler, 1, Env),
{_, HandlerOpts} = lists:keyfind(handler_opts, 1, Env),
try Handler:init(Req, HandlerOpts) of
- {http, Req2, State} ->
- handle(Req2, Env, Handler, State);
- {shutdown, Req2, State} ->
- terminate(Req2, Env, Handler, State, {normal, shutdown});
+ {ok, Req2, State} ->
+ Result = terminate(normal, Req2, State, Handler),
+ {ok, Req2, [{result, Result}|Env]};
{Mod, Req2, State} ->
- upgrade(Req2, Env, Handler, State, infinity, run, Mod);
+ Mod:upgrade(Req2, Env, Handler, State, infinity, run);
{Mod, Req2, State, hibernate} ->
- upgrade(Req2, Env, Handler, State, infinity, hibernate, Mod);
+ Mod:upgrade(Req2, Env, Handler, State, infinity, hibernate);
{Mod, Req2, State, Timeout} ->
- upgrade(Req2, Env, Handler, State, Timeout, run, Mod);
+ Mod:upgrade(Req2, Env, Handler, State, Timeout, run);
{Mod, Req2, State, Timeout, hibernate} ->
- upgrade(Req2, Env, Handler, State, Timeout, hibernate, Mod)
+ Mod:upgrade(Req2, Env, Handler, State, Timeout, hibernate)
catch Class:Reason ->
Stacktrace = erlang:get_stacktrace(),
cowboy_req:maybe_reply(Stacktrace, Req),
+ terminate({crash, Class, Reason}, Req, HandlerOpts, Handler),
erlang:Class([
{reason, Reason},
{mfa, {Handler, init, 2}},
@@ -53,36 +61,9 @@ execute(Req, Env) ->
])
end.
-handle(Req, Env, Handler, State) ->
- try Handler:handle(Req, State) of
- {ok, Req2, State2} ->
- terminate(Req2, Env, Handler, State2, {normal, shutdown})
- catch Class:Reason ->
- Stacktrace = erlang:get_stacktrace(),
- cowboy_req:maybe_reply(Stacktrace, Req),
- _ = terminate(Req, Env, Handler, State, Reason),
- erlang:Class([
- {reason, Reason},
- {mfa, {Handler, handle, 2}},
- {stacktrace, Stacktrace},
- {req, cowboy_req:to_list(Req)},
- {state, State}
- ])
- end.
-
-upgrade(Req, Env, Handler, State, Timeout, Hibernate, Mod) ->
- Mod2 = case Mod of
- long_polling -> cowboy_long_polling;
- rest -> cowboy_rest;
- ws -> cowboy_websocket;
- _ when Mod =/= http -> Mod
- end,
- Mod2:upgrade(Req, Env, Handler, State, Timeout, Hibernate).
-
--spec terminate(Req, Env, module(), any(), {normal, shutdown} | {error, atom()} | any())
- -> {ok, Req, Env} when Req::cowboy_req:req(), Env::cowboy_middleware:env().
-terminate(Req, Env, Handler, State, Reason) ->
- Result = case erlang:function_exported(Handler, terminate, 3) of
+-spec terminate(any(), Req, any(), module()) -> ok when Req::cowboy_req:req().
+terminate(Reason, Req, State, Handler) ->
+ case erlang:function_exported(Handler, terminate, 3) of
true ->
try
Handler:terminate(Reason, cowboy_req:lock(Req), State)
@@ -98,5 +79,4 @@ terminate(Req, Env, Handler, State, Reason) ->
end;
false ->
ok
- end,
- {ok, Req, [{result, Result}|Env]}.
+ end.