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

Fix closing of connection on response_body_too_small

This commit is contained in:
Loïc Hoguin 2019-09-16 11:34:51 +02:00
parent 8452df0617
commit d143235a79
No known key found for this signature in database
GPG key ID: 8A9DF795F6FED764
2 changed files with 10 additions and 6 deletions

View file

@ -1215,7 +1215,7 @@ stream_terminate(State0=#state{opts=Opts, in_streamid=InStreamID, in_state=InSta
info(State0, StreamID, {response, 204, #{}, <<>>}); info(State0, StreamID, {response, 204, #{}, <<>>});
chunked when Version =:= 'HTTP/1.1' -> chunked when Version =:= 'HTTP/1.1' ->
info(State0, StreamID, {data, fin, <<>>}); info(State0, StreamID, {data, fin, <<>>});
streaming when ExpectedSize < SentSize -> streaming when SentSize < ExpectedSize ->
terminate(State0, response_body_too_small); terminate(State0, response_body_too_small);
_ -> %% done or Version =:= 'HTTP/1.0' _ -> %% done or Version =:= 'HTTP/1.0'
State0 State0

View file

@ -151,7 +151,6 @@ do_get_error(Path, Headers, Config) ->
nofin -> gun:await_body(ConnPid, Ref); nofin -> gun:await_body(ConnPid, Ref);
fin -> {ok, <<>>} fin -> {ok, <<>>}
end, end,
gun:close(ConnPid),
case Result of case Result of
{ok, RespBody} -> {Status, RespHeaders, do_decode(RespHeaders, RespBody)}; {ok, RespBody} -> {Status, RespHeaders, do_decode(RespHeaders, RespBody)};
_ -> Result _ -> Result
@ -953,16 +952,21 @@ stream_body_content_length_nofin(Config) ->
ok. ok.
stream_body_content_length_nofin_error(Config) -> stream_body_content_length_nofin_error(Config) ->
doc("Not all of body sent."), doc("Not all of the response body sent."),
case config(protocol, Config) of case config(protocol, Config) of
http -> http ->
case do_get_error("/resp/stream_body_content_length/nofin-error", Config) of case do_get_error("/resp/stream_body_content_length/nofin-error", Config) of
%% When compression is used content-length is not sent.
{200, Headers, <<"Hello">>} -> {200, Headers, <<"Hello">>} ->
{_, <<"gzip">>} = lists:keyfind(<<"content-encoding">>, 1, Headers); {_, <<"gzip">>} = lists:keyfind(<<"content-encoding">>, 1, Headers);
%% The server closes the connection when the body couldn't be sent fully.
{error, {stream_error, closed}} -> {error, {stream_error, closed}} ->
ok; receive
{error, timeout} -> {gun_down, ConnPid, _, _, _, _} ->
ok gun:close(ConnPid)
after 1000 ->
error(timeout)
end
end; end;
http2 -> http2 ->
%% @todo HTTP2 should have the same content-length checks %% @todo HTTP2 should have the same content-length checks