0
Fork 0
mirror of https://github.com/ninenines/cowboy.git synced 2025-07-15 12:40:25 +00:00

Fix a bug preventing 'onresponse' from being called on errors

This commit is contained in:
Loïc Hoguin 2012-05-21 15:17:24 +02:00
parent ca9278bc27
commit cc6c4e39de
2 changed files with 12 additions and 2 deletions

View file

@ -438,12 +438,13 @@ ensure_response(#http_req{socket=Socket, transport=Transport,
%% Only send an error reply if there is no resp_sent message. %% Only send an error reply if there is no resp_sent message.
-spec error_terminate(cowboy_http:status(), #state{}) -> ok. -spec error_terminate(cowboy_http:status(), #state{}) -> ok.
error_terminate(Code, State=#state{socket=Socket, transport=Transport}) -> error_terminate(Code, State=#state{socket=Socket, transport=Transport,
onresponse=OnResponse}) ->
receive receive
{cowboy_http_req, resp_sent} -> ok {cowboy_http_req, resp_sent} -> ok
after 0 -> after 0 ->
_ = cowboy_http_req:reply(Code, #http_req{ _ = cowboy_http_req:reply(Code, #http_req{
socket=Socket, transport=Transport, socket=Socket, transport=Transport, onresponse=OnResponse,
connection=close, pid=self(), resp_state=waiting}), connection=close, pid=self(), resp_state=waiting}),
ok ok
end, end,

View file

@ -45,6 +45,7 @@
-export([nc_zero/1]). -export([nc_zero/1]).
-export([onrequest/1]). -export([onrequest/1]).
-export([onrequest_reply/1]). -export([onrequest_reply/1]).
-export([onresponse_crash/1]).
-export([onresponse_reply/1]). -export([onresponse_reply/1]).
-export([pipeline/1]). -export([pipeline/1]).
-export([rest_keepalive/1]). -export([rest_keepalive/1]).
@ -116,6 +117,7 @@ groups() ->
onrequest_reply onrequest_reply
]}, ]},
{onresponse, [], [ {onresponse, [], [
onresponse_crash,
onresponse_reply onresponse_reply
]} ]}
]. ].
@ -604,6 +606,13 @@ onrequest_hook(Req) ->
Req3 Req3
end. end.
onresponse_crash(Config) ->
Client = ?config(client, Config),
{ok, Client2} = cowboy_client:request(<<"GET">>,
build_url("/handler_errors?case=init_before_reply", Config), Client),
{ok, 777, Headers, Client3} = cowboy_client:response(Client2),
{<<"x-hook">>, <<"onresponse">>} = lists:keyfind(<<"x-hook">>, 1, Headers).
onresponse_reply(Config) -> onresponse_reply(Config) ->
Client = ?config(client, Config), Client = ?config(client, Config),
{ok, Client2} = cowboy_client:request(<<"GET">>, {ok, Client2} = cowboy_client:request(<<"GET">>,