mirror of
https://github.com/ninenines/cowboy.git
synced 2025-07-14 04:10:24 +00:00
Bind erlang:get_stacktrace prior to making other calls
If we bind too late there might be an exception triggered in the terminate function and we will not get the correct stacktrace as a result.
This commit is contained in:
parent
cd9b04792c
commit
bfee20e61e
4 changed files with 8 additions and 4 deletions
|
@ -47,8 +47,9 @@ execute(Req, Env=#{handler := Handler, handler_opts := HandlerOpts}) ->
|
|||
{Mod, Req2, State, Opts} ->
|
||||
Mod:upgrade(Req2, Env, Handler, State, Opts)
|
||||
catch Class:Reason ->
|
||||
StackTrace = erlang:get_stacktrace(),
|
||||
terminate({crash, Class, Reason}, Req, HandlerOpts, Handler),
|
||||
erlang:raise(Class, Reason, erlang:get_stacktrace())
|
||||
erlang:raise(Class, Reason, StackTrace)
|
||||
end.
|
||||
|
||||
-spec terminate(any(), Req | undefined, any(), module()) -> ok when Req::cowboy_req:req().
|
||||
|
|
|
@ -82,8 +82,9 @@ call(Req0, Env, Handler, HandlerState0, Message) ->
|
|||
{stop, Req, HandlerState} ->
|
||||
terminate(Req, Env, Handler, HandlerState, stop)
|
||||
catch Class:Reason ->
|
||||
StackTrace = erlang:get_stacktrace(),
|
||||
cowboy_handler:terminate({crash, Class, Reason}, Req0, HandlerState0, Handler),
|
||||
erlang:raise(Class, Reason, erlang:get_stacktrace())
|
||||
erlang:raise(Class, Reason, StackTrace)
|
||||
end.
|
||||
|
||||
suspend(Req, Env, Handler, HandlerState) ->
|
||||
|
|
|
@ -1622,8 +1622,9 @@ switch_handler({switch_handler, Mod, Opts}, Req, #state{handler_state=HandlerSta
|
|||
|
||||
-spec error_terminate(cowboy_req:req(), #state{}, atom(), any()) -> no_return().
|
||||
error_terminate(Req, #state{handler=Handler, handler_state=HandlerState}, Class, Reason) ->
|
||||
StackTrace = erlang:get_stacktrace(),
|
||||
cowboy_handler:terminate({crash, Class, Reason}, Req, HandlerState, Handler),
|
||||
erlang:raise(Class, Reason, erlang:get_stacktrace()).
|
||||
erlang:raise(Class, Reason, StackTrace).
|
||||
|
||||
terminate(Req, #state{handler=Handler, handler_state=HandlerState}) ->
|
||||
Result = cowboy_handler:terminate(normal, Req, HandlerState, Handler),
|
||||
|
|
|
@ -503,9 +503,10 @@ handler_call(State=#state{handler=Handler}, HandlerState,
|
|||
{stop, HandlerState2} ->
|
||||
websocket_close(State, HandlerState2, stop)
|
||||
catch Class:Reason ->
|
||||
StackTrace = erlang:get_stacktrace(),
|
||||
websocket_send_close(State, {crash, Class, Reason}),
|
||||
handler_terminate(State, HandlerState, {crash, Class, Reason}),
|
||||
erlang:raise(Class, Reason, erlang:get_stacktrace())
|
||||
erlang:raise(Class, Reason, StackTrace)
|
||||
end.
|
||||
|
||||
-spec handler_call_result(#state{}, any(), parse_state(), fun(), commands()) -> no_return().
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue