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

Exit with exit/1 on handler exception and include class in reason

This commit is contained in:
James Fish 2015-05-06 16:21:14 +01:00
parent 1f5b19a0b7
commit 2718698895
4 changed files with 15 additions and 10 deletions

View file

@ -52,13 +52,14 @@ execute(Req, Env) ->
Stacktrace = erlang:get_stacktrace(),
cowboy_req:maybe_reply(Stacktrace, Req),
terminate({crash, Class, Reason}, Req, HandlerOpts, Handler),
erlang:Class([
exit({cowboy_handler, [
{class, Class},
{reason, Reason},
{mfa, {Handler, init, 2}},
{stacktrace, Stacktrace},
{req, cowboy_req:to_list(Req)},
{opts, HandlerOpts}
])
]})
end.
-spec terminate(any(), Req, any(), module()) -> ok when Req::cowboy_req:req().
@ -68,14 +69,15 @@ terminate(Reason, Req, State, Handler) ->
try
Handler:terminate(Reason, cowboy_req:lock(Req), State)
catch Class:Reason2 ->
erlang:Class([
exit({cowboy_handler, [
{class, Class},
{reason, Reason2},
{mfa, {Handler, terminate, 3}},
{stacktrace, erlang:get_stacktrace()},
{req, cowboy_req:to_list(Req)},
{state, State},
{terminate_reason, Reason}
])
]})
end;
false ->
ok

View file

@ -161,13 +161,14 @@ call(Req, State=#state{resp_sent=RespSent},
cowboy_req:maybe_reply(Stacktrace, Req)
end,
cowboy_handler:terminate({crash, Class, Reason}, Req, HandlerState, Handler),
erlang:Class([
exit({cowboy_handler, [
{class, Class},
{reason, Reason},
{mfa, {Handler, info, 3}},
{stacktrace, Stacktrace},
{req, cowboy_req:to_list(Req)},
{state, HandlerState}
])
]})
end.
%% It is sometimes important to make a socket passive as it was initially

View file

@ -977,13 +977,14 @@ error_terminate(Req, #state{handler=Handler, handler_state=HandlerState},
Stacktrace = erlang:get_stacktrace(),
cowboy_req:maybe_reply(Stacktrace, Req),
cowboy_handler:terminate({crash, Class, Reason}, Req, HandlerState, Handler),
erlang:Class([
exit({cowboy_handler, [
{class, Class},
{reason, Reason},
{mfa, {Handler, Callback, 2}},
{stacktrace, Stacktrace},
{req, cowboy_req:to_list(Req)},
{state, HandlerState}
]).
]}).
terminate(Req, #state{env=Env, handler=Handler, handler_state=HandlerState}) ->
Result = cowboy_handler:terminate(normal, Req, HandlerState, Handler),

View file

@ -350,14 +350,15 @@ handler_call(State=#state{handler=Handler}, Req, HandlerState,
websocket_close(State, Req2, HandlerState2, stop)
catch Class:Reason ->
_ = websocket_close(State, Req, HandlerState, {crash, Class, Reason}),
erlang:Class([
exit({cowboy_handler, [
{class, Class},
{reason, Reason},
{mfa, {Handler, Callback, 3}},
{stacktrace, erlang:get_stacktrace()},
{msg, Message},
{req, cowboy_req:to_list(Req)},
{state, HandlerState}
])
]})
end.
-spec websocket_send(cow_ws:frame(), #state{}) -> ok | stop | {error, atom()}.