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

Remove logic to always send a response in cowboy_loop

This is taken care of at the protocol level now.
This commit is contained in:
Loïc Hoguin 2016-08-10 13:55:35 +02:00
parent 3a057683af
commit 00f3ae7d20

View file

@ -48,46 +48,21 @@
buffer_size = 0 :: non_neg_integer(), buffer_size = 0 :: non_neg_integer(),
max_buffer = 5000 :: non_neg_integer() | infinity, max_buffer = 5000 :: non_neg_integer() | infinity,
timeout = infinity :: timeout(), timeout = infinity :: timeout(),
timeout_ref = undefined :: undefined | reference(), timeout_ref = undefined :: undefined | reference()
resp_sent = false :: boolean()
}). }).
-spec upgrade(Req, Env, module(), any(), timeout(), run | hibernate) -spec upgrade(Req, Env, module(), any(), timeout(), run | hibernate)
-> {ok, Req, Env} | {suspend, module(), atom(), [any()]} -> {ok, Req, Env} | {suspend, module(), atom(), [any()]}
when Req::cowboy_req:req(), Env::cowboy_middleware:env(). when Req::cowboy_req:req(), Env::cowboy_middleware:env().
upgrade(Req, Env, Handler, HandlerState, Timeout, run) -> upgrade(Req, Env, Handler, HandlerState, Timeout, Hibernate) ->
State = #state{env=Env, max_buffer=get_max_buffer(Env), timeout=Timeout}, State = #state{env=Env, max_buffer=get_max_buffer(Env), timeout=Timeout,
hibernate=Hibernate =:= hibernate},
State2 = timeout(State), State2 = timeout(State),
after_call(Req, State2, Handler, HandlerState); before_loop(Req, State2, Handler, HandlerState).
upgrade(Req, Env, Handler, HandlerState, Timeout, hibernate) ->
% dbg:start(),
% dbg:tracer(),
% dbg:tpl(?MODULE, []),
% dbg:tpl(long_polling_h, []),
% dbg:tpl(loop_handler_body_h, []),
% dbg:tpl(cowboy_req, []),
% dbg:p(all, c),
State = #state{env=Env, max_buffer=get_max_buffer(Env), hibernate=true, timeout=Timeout},
State2 = timeout(State),
after_call(Req, State2, Handler, HandlerState).
get_max_buffer(#{loop_max_buffer := MaxBuffer}) -> MaxBuffer; get_max_buffer(#{loop_max_buffer := MaxBuffer}) -> MaxBuffer;
get_max_buffer(_) -> 5000. get_max_buffer(_) -> 5000.
%% Update the state if the response was sent in the callback.
after_call(Req, State=#state{resp_sent=false}, Handler,
HandlerState) ->
receive
{cowboy_req, resp_sent} ->
before_loop(Req, State#state{resp_sent=true}, Handler, HandlerState)
after 0 ->
before_loop(Req, State, Handler, HandlerState)
end;
after_call(Req, State, Handler, HandlerState) ->
before_loop(Req, State, Handler, HandlerState).
before_loop(Req, State=#state{hibernate=true}, Handler, HandlerState) -> before_loop(Req, State=#state{hibernate=true}, Handler, HandlerState) ->
%% @todo Yeah we can't get the socket anymore. %% @todo Yeah we can't get the socket anymore.
@ -131,20 +106,16 @@ loop(Req, State=#state{timeout_ref=TRef}, Handler, HandlerState) ->
call(Req, State, Handler, HandlerState, Message) call(Req, State, Handler, HandlerState, Message)
end. end.
call(Req, State=#state{resp_sent=RespSent}, call(Req, State, Handler, HandlerState, Message) ->
Handler, HandlerState, Message) ->
try Handler:info(Message, Req, HandlerState) of try Handler:info(Message, Req, HandlerState) of
{ok, Req2, HandlerState2} -> {ok, Req2, HandlerState2} ->
after_call(Req2, State, Handler, HandlerState2); before_loop(Req2, State, Handler, HandlerState2);
{ok, Req2, HandlerState2, hibernate} -> {ok, Req2, HandlerState2, hibernate} ->
after_call(Req2, State#state{hibernate=true}, Handler, HandlerState2); before_loop(Req2, State#state{hibernate=true}, Handler, HandlerState2);
{stop, Req2, HandlerState2} -> {stop, Req2, HandlerState2} ->
terminate(Req2, State, Handler, HandlerState2, stop) terminate(Req2, State, Handler, HandlerState2, stop)
catch Class:Reason -> catch Class:Reason ->
Stacktrace = erlang:get_stacktrace(), Stacktrace = erlang:get_stacktrace(),
if RespSent -> ok; true ->
cowboy_req:maybe_reply(Stacktrace, Req)
end,
cowboy_handler:terminate({crash, Class, Reason}, Req, HandlerState, Handler), cowboy_handler:terminate({crash, Class, Reason}, Req, HandlerState, Handler),
exit({cowboy_handler, [ exit({cowboy_handler, [
{class, Class}, {class, Class},