Browse Source

Fix closing of connection on response_body_too_small

Loïc Hoguin 5 years ago
parent
commit
d143235a79
2 changed files with 10 additions and 6 deletions
  1. 1 1
      src/cowboy_http.erl
  2. 9 5
      test/req_SUITE.erl

+ 1 - 1
src/cowboy_http.erl

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

+ 9 - 5
test/req_SUITE.erl

@@ -151,7 +151,6 @@ do_get_error(Path, Headers, Config) ->
 		nofin -> gun:await_body(ConnPid, Ref);
 		fin -> {ok, <<>>}
 	end,
-	gun:close(ConnPid),
 	case Result of
 		{ok, RespBody} -> {Status, RespHeaders, do_decode(RespHeaders, RespBody)};
 		_ -> Result
@@ -953,16 +952,21 @@ stream_body_content_length_nofin(Config) ->
 	ok.
 
 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
 		http ->
 			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">>} ->
 					{_, <<"gzip">>} = lists:keyfind(<<"content-encoding">>, 1, Headers);
+				%% The server closes the connection when the body couldn't be sent fully.
 				{error, {stream_error, closed}} ->
-					ok;
-				{error, timeout} ->
-					ok
+					receive
+						{gun_down, ConnPid, _, _, _, _} ->
+							gun:close(ConnPid)
+					after 1000 ->
+						error(timeout)
+					end
 			end;
 		http2 ->
 			%% @todo HTTP2 should have the same content-length checks