mirror of
https://github.com/ninenines/cowboy.git
synced 2025-07-14 20:30:23 +00:00
Exit with exit/1 on handler exception and include class in reason
This commit is contained in:
parent
1f5b19a0b7
commit
2718698895
4 changed files with 15 additions and 10 deletions
|
@ -52,13 +52,14 @@ execute(Req, Env) ->
|
||||||
Stacktrace = erlang:get_stacktrace(),
|
Stacktrace = erlang:get_stacktrace(),
|
||||||
cowboy_req:maybe_reply(Stacktrace, Req),
|
cowboy_req:maybe_reply(Stacktrace, Req),
|
||||||
terminate({crash, Class, Reason}, Req, HandlerOpts, Handler),
|
terminate({crash, Class, Reason}, Req, HandlerOpts, Handler),
|
||||||
erlang:Class([
|
exit({cowboy_handler, [
|
||||||
|
{class, Class},
|
||||||
{reason, Reason},
|
{reason, Reason},
|
||||||
{mfa, {Handler, init, 2}},
|
{mfa, {Handler, init, 2}},
|
||||||
{stacktrace, Stacktrace},
|
{stacktrace, Stacktrace},
|
||||||
{req, cowboy_req:to_list(Req)},
|
{req, cowboy_req:to_list(Req)},
|
||||||
{opts, HandlerOpts}
|
{opts, HandlerOpts}
|
||||||
])
|
]})
|
||||||
end.
|
end.
|
||||||
|
|
||||||
-spec terminate(any(), Req, any(), module()) -> ok when Req::cowboy_req:req().
|
-spec terminate(any(), Req, any(), module()) -> ok when Req::cowboy_req:req().
|
||||||
|
@ -68,14 +69,15 @@ terminate(Reason, Req, State, Handler) ->
|
||||||
try
|
try
|
||||||
Handler:terminate(Reason, cowboy_req:lock(Req), State)
|
Handler:terminate(Reason, cowboy_req:lock(Req), State)
|
||||||
catch Class:Reason2 ->
|
catch Class:Reason2 ->
|
||||||
erlang:Class([
|
exit({cowboy_handler, [
|
||||||
|
{class, Class},
|
||||||
{reason, Reason2},
|
{reason, Reason2},
|
||||||
{mfa, {Handler, terminate, 3}},
|
{mfa, {Handler, terminate, 3}},
|
||||||
{stacktrace, erlang:get_stacktrace()},
|
{stacktrace, erlang:get_stacktrace()},
|
||||||
{req, cowboy_req:to_list(Req)},
|
{req, cowboy_req:to_list(Req)},
|
||||||
{state, State},
|
{state, State},
|
||||||
{terminate_reason, Reason}
|
{terminate_reason, Reason}
|
||||||
])
|
]})
|
||||||
end;
|
end;
|
||||||
false ->
|
false ->
|
||||||
ok
|
ok
|
||||||
|
|
|
@ -161,13 +161,14 @@ call(Req, State=#state{resp_sent=RespSent},
|
||||||
cowboy_req:maybe_reply(Stacktrace, Req)
|
cowboy_req:maybe_reply(Stacktrace, Req)
|
||||||
end,
|
end,
|
||||||
cowboy_handler:terminate({crash, Class, Reason}, Req, HandlerState, Handler),
|
cowboy_handler:terminate({crash, Class, Reason}, Req, HandlerState, Handler),
|
||||||
erlang:Class([
|
exit({cowboy_handler, [
|
||||||
|
{class, Class},
|
||||||
{reason, Reason},
|
{reason, Reason},
|
||||||
{mfa, {Handler, info, 3}},
|
{mfa, {Handler, info, 3}},
|
||||||
{stacktrace, Stacktrace},
|
{stacktrace, Stacktrace},
|
||||||
{req, cowboy_req:to_list(Req)},
|
{req, cowboy_req:to_list(Req)},
|
||||||
{state, HandlerState}
|
{state, HandlerState}
|
||||||
])
|
]})
|
||||||
end.
|
end.
|
||||||
|
|
||||||
%% It is sometimes important to make a socket passive as it was initially
|
%% It is sometimes important to make a socket passive as it was initially
|
||||||
|
|
|
@ -977,13 +977,14 @@ error_terminate(Req, #state{handler=Handler, handler_state=HandlerState},
|
||||||
Stacktrace = erlang:get_stacktrace(),
|
Stacktrace = erlang:get_stacktrace(),
|
||||||
cowboy_req:maybe_reply(Stacktrace, Req),
|
cowboy_req:maybe_reply(Stacktrace, Req),
|
||||||
cowboy_handler:terminate({crash, Class, Reason}, Req, HandlerState, Handler),
|
cowboy_handler:terminate({crash, Class, Reason}, Req, HandlerState, Handler),
|
||||||
erlang:Class([
|
exit({cowboy_handler, [
|
||||||
|
{class, Class},
|
||||||
{reason, Reason},
|
{reason, Reason},
|
||||||
{mfa, {Handler, Callback, 2}},
|
{mfa, {Handler, Callback, 2}},
|
||||||
{stacktrace, Stacktrace},
|
{stacktrace, Stacktrace},
|
||||||
{req, cowboy_req:to_list(Req)},
|
{req, cowboy_req:to_list(Req)},
|
||||||
{state, HandlerState}
|
{state, HandlerState}
|
||||||
]).
|
]}).
|
||||||
|
|
||||||
terminate(Req, #state{env=Env, handler=Handler, handler_state=HandlerState}) ->
|
terminate(Req, #state{env=Env, handler=Handler, handler_state=HandlerState}) ->
|
||||||
Result = cowboy_handler:terminate(normal, Req, HandlerState, Handler),
|
Result = cowboy_handler:terminate(normal, Req, HandlerState, Handler),
|
||||||
|
|
|
@ -350,14 +350,15 @@ handler_call(State=#state{handler=Handler}, Req, HandlerState,
|
||||||
websocket_close(State, Req2, HandlerState2, stop)
|
websocket_close(State, Req2, HandlerState2, stop)
|
||||||
catch Class:Reason ->
|
catch Class:Reason ->
|
||||||
_ = websocket_close(State, Req, HandlerState, {crash, Class, Reason}),
|
_ = websocket_close(State, Req, HandlerState, {crash, Class, Reason}),
|
||||||
erlang:Class([
|
exit({cowboy_handler, [
|
||||||
|
{class, Class},
|
||||||
{reason, Reason},
|
{reason, Reason},
|
||||||
{mfa, {Handler, Callback, 3}},
|
{mfa, {Handler, Callback, 3}},
|
||||||
{stacktrace, erlang:get_stacktrace()},
|
{stacktrace, erlang:get_stacktrace()},
|
||||||
{msg, Message},
|
{msg, Message},
|
||||||
{req, cowboy_req:to_list(Req)},
|
{req, cowboy_req:to_list(Req)},
|
||||||
{state, HandlerState}
|
{state, HandlerState}
|
||||||
])
|
]})
|
||||||
end.
|
end.
|
||||||
|
|
||||||
-spec websocket_send(cow_ws:frame(), #state{}) -> ok | stop | {error, atom()}.
|
-spec websocket_send(cow_ws:frame(), #state{}) -> ok | stop | {error, atom()}.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue