0
Fork 0
mirror of https://github.com/ninenines/cowboy.git synced 2025-07-16 13:10:24 +00:00

Skip the request body if it hasn't been read by the handler.

This commit is contained in:
Loïc Hoguin 2011-03-21 17:26:00 +01:00
parent e40001a884
commit 8b02992e6a
3 changed files with 47 additions and 7 deletions

View file

@ -154,16 +154,34 @@ handler_loop(HandlerState, Req, State=#state{handler={Handler, _Opts}}) ->
-spec handler_terminate(HandlerState::term(), Req::#http_req{},
State::#state{}) -> ok.
handler_terminate(HandlerState, Req, State=#state{handler={Handler, _Opts}}) ->
Res = (catch Handler:terminate(
HandlerRes = (catch Handler:terminate(
Req#http_req{resp_state=locked}, HandlerState)),
%% @todo We must skip any body data from the request
%% before processing another.
BodyRes = ensure_body_processed(Req),
ensure_response(Req, State),
case {Res, State#state.connection} of
{ok, keepalive} -> next_request(State);
case {HandlerRes, BodyRes, State#state.connection} of
{ok, ok, keepalive} -> next_request(State);
_Closed -> terminate(State)
end.
-spec ensure_body_processed(Req::#http_req{}) -> ok | close.
ensure_body_processed(#http_req{body_state=done}) ->
ok;
ensure_body_processed(Req=#http_req{body_state=waiting}) ->
{Length, Req2} = cowboy_http_req:header('Content-Length', Req),
case Length of
"" -> ok;
_Any ->
Length2 = list_to_integer(Length),
skip_body(Length2, Req2)
end.
-spec skip_body(Length::non_neg_integer(), Req::#http_req{}) -> ok | close.
skip_body(Length, Req) ->
case cowboy_http_req:body(Length, Req) of
{error, _Reason} -> close;
_Any -> ok
end.
%% No response has been sent but everything apparently went fine.
%% Reply with 204 No Content to indicate this.
ensure_response(#http_req{resp_state=waiting}, State) ->