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:
parent
e40001a884
commit
8b02992e6a
3 changed files with 47 additions and 7 deletions
|
@ -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) ->
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue