Skip to content

Commit

Permalink
Properly handle external exits of request processes
Browse files Browse the repository at this point in the history
Because the exit reason doesn't include the stacktrace they
were ignored. Now they are properly handled. The error message
was changed slightly to accomodate.
  • Loading branch information
essen committed Feb 8, 2025
1 parent cc97c77 commit fbd680f
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 4 deletions.
7 changes: 3 additions & 4 deletions src/cowboy_stream_h.erl
Original file line number Diff line number Diff line change
Expand Up @@ -138,17 +138,16 @@ info(StreamID, Info={'EXIT', Pid, {{request_error, Reason, _HumanReadable}, _}},
{error_response, Status, #{<<"content-length">> => <<"0">>}, <<>>},
stop
], State);
info(StreamID, Exit={'EXIT', Pid, {Reason, Stacktrace}}, State=#state{ref=Ref, pid=Pid}) ->
info(StreamID, Exit={'EXIT', Pid, Reason}, State=#state{ref=Ref, pid=Pid}) ->
Commands0 = [{internal_error, Exit, 'Stream process crashed.'}],
Commands = case Reason of
normal -> Commands0;
shutdown -> Commands0;
{shutdown, _} -> Commands0;
_ -> [{log, error,
"Ranch listener ~p, connection process ~p, stream ~p "
"had its request process ~p exit with reason "
"~999999p and stacktrace ~999999p~n",
[Ref, self(), StreamID, Pid, Reason, Stacktrace]}
"had its request process ~p exit with reason ~0p~n",
[Ref, self(), StreamID, Pid, Reason]}
|Commands0]
end,
%% @todo We are trying to send a 500 response before resetting
Expand Down
3 changes: 3 additions & 0 deletions test/handlers/crash_h.erl
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@
-export([init/2]).

-spec init(_, _) -> no_return().
init(_, external_exit) ->
ct_helper:ignore(?MODULE, init, 2),
exit(self(), ct_helper_ignore);
init(_, no_reply) ->
ct_helper:ignore(?MODULE, init, 2),
error(crash);
Expand Down
11 changes: 11 additions & 0 deletions test/plain_handler_SUITE.erl
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ end_per_group(Name, _) ->

init_dispatch(_) ->
cowboy_router:compile([{"localhost", [
{"/crash/external_exit", crash_h, external_exit},
{"/crash/no_reply", crash_h, no_reply},
{"/crash/reply", crash_h, reply}
]}]).
Expand Down Expand Up @@ -78,3 +79,13 @@ crash_before_reply(Config) ->
]),
{response, fin, 500, _} = gun:await(ConnPid, Ref),
gun:close(ConnPid).

external_exit_before_reply(Config) ->
doc("A plain handler exits externally before a response was sent "
"results in a 500 response."),
ConnPid = gun_open(Config),
Ref = gun:get(ConnPid, "/crash/external_exit", [
{<<"accept-encoding">>, <<"gzip">>}
]),
{response, fin, 500, _} = gun:await(ConnPid, Ref),
gun:close(ConnPid).

0 comments on commit fbd680f

Please sign in to comment.