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:
parent
8452df0617
commit
d143235a79
2 changed files with 10 additions and 6 deletions
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue