0
Fork 0
mirror of https://github.com/ninenines/cowboy.git synced 2025-07-14 12:20:24 +00:00

Call Handler:terminate/2 even on error in Handler:handle/2

This ensures we can cleanup what we did in Handler:init/3.
This commit is contained in:
Loïc Hoguin 2011-07-07 17:23:53 +02:00
parent aa0a66749e
commit 474f4e0bfa

View file

@ -209,21 +209,21 @@ handler_init(Req, State=#state{
handler_loop(HandlerState, Req, State=#state{handler={Handler, Opts}}) -> handler_loop(HandlerState, Req, State=#state{handler={Handler, Opts}}) ->
try Handler:handle(Req#http_req{resp_state=waiting}, HandlerState) of try Handler:handle(Req#http_req{resp_state=waiting}, HandlerState) of
{ok, Req2, HandlerState2} -> {ok, Req2, HandlerState2} ->
handler_terminate(HandlerState2, Req2, State) next_request(HandlerState2, Req2, State)
catch Class:Reason -> catch Class:Reason ->
terminate(State),
error_logger:error_msg( error_logger:error_msg(
"** Handler ~p terminating in handle/2 for the reason ~p:~p~n" "** Handler ~p terminating in handle/2 for the reason ~p:~p~n"
"** Options were ~p~n** Handler state was ~p~n" "** Options were ~p~n** Handler state was ~p~n"
"** Request was ~p~n** Stacktrace: ~p~n~n", "** Request was ~p~n** Stacktrace: ~p~n~n",
[Handler, Class, Reason, Opts, [Handler, Class, Reason, Opts,
HandlerState, Req, erlang:get_stacktrace()]) HandlerState, Req, erlang:get_stacktrace()]),
handler_terminate(HandlerState, Req, State),
terminate(State)
end. end.
-spec handler_terminate(any(), #http_req{}, #state{}) -> ok. -spec handler_terminate(any(), #http_req{}, #state{}) -> ok | error.
handler_terminate(HandlerState, Req=#http_req{buffer=Buffer}, handler_terminate(HandlerState, Req, #state{handler={Handler, Opts}}) ->
State=#state{handler={Handler, Opts}}) -> try
HandlerRes = try
Handler:terminate(Req#http_req{resp_state=locked}, HandlerState) Handler:terminate(Req#http_req{resp_state=locked}, HandlerState)
catch Class:Reason -> catch Class:Reason ->
error_logger:error_msg( error_logger:error_msg(
@ -233,7 +233,11 @@ handler_terminate(HandlerState, Req=#http_req{buffer=Buffer},
[Handler, Class, Reason, Opts, [Handler, Class, Reason, Opts,
HandlerState, Req, erlang:get_stacktrace()]), HandlerState, Req, erlang:get_stacktrace()]),
error error
end, end.
-spec next_request(any(), #http_req{}, #state{}) -> ok.
next_request(HandlerState, Req=#http_req{buffer=Buffer}, State) ->
HandlerRes = handler_terminate(HandlerState, Req, State),
BodyRes = ensure_body_processed(Req), BodyRes = ensure_body_processed(Req),
RespRes = ensure_response(Req, State), RespRes = ensure_response(Req, State),
case {HandlerRes, BodyRes, RespRes, State#state.connection} of case {HandlerRes, BodyRes, RespRes, State#state.connection} of