Browse Source

Do not send empty chunks

User code may sometimes send an empty value which gets understood
by the client as being the end of the stream while this was not
intended. Ignoring empty values allow making sure the stream isn't
ended by mistake.
Loïc Hoguin 10 years ago
parent
commit
d2205d9ea6
2 changed files with 7 additions and 2 deletions
  1. 5 2
      src/cowboy_req.erl
  2. 2 0
      test/http_SUITE_data/http_chunked.erl

+ 5 - 2
src/cowboy_req.erl

@@ -823,8 +823,11 @@ chunk(Data, #http_req{socket=Socket, transport=Transport,
 	ok = Transport:send(Socket, Data);
 chunk(Data, #http_req{socket=Socket, transport=Transport,
 		resp_state=chunks}) ->
-	ok = Transport:send(Socket, [integer_to_list(iolist_size(Data), 16),
-		<<"\r\n">>, Data, <<"\r\n">>]).
+	case iolist_size(Data) of
+		0 -> ok;
+		Size -> Transport:send(Socket, [integer_to_list(Size, 16),
+			<<"\r\n">>, Data, <<"\r\n">>])
+	end.
 
 %% If ever made public, need to send nothing if HEAD.
 -spec last_chunk(Req) -> Req when Req::req().

+ 2 - 0
test/http_SUITE_data/http_chunked.erl

@@ -6,6 +6,8 @@
 
 init(Req, Opts) ->
 	Req2 = cowboy_req:chunked_reply(200, Req),
+	%% Try an empty chunk to make sure the stream doesn't get closed.
+	cowboy_req:chunk([<<>>], Req2),
 	timer:sleep(100),
 	cowboy_req:chunk("chunked_handler\r\n", Req2),
 	timer:sleep(100),