From d2205d9ea6aa71ff256c48667755676d0e6c2377 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Hoguin?= Date: Mon, 16 Feb 2015 19:49:01 +0100 Subject: [PATCH] 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. --- src/cowboy_req.erl | 7 +++++-- test/http_SUITE_data/http_chunked.erl | 2 ++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/cowboy_req.erl b/src/cowboy_req.erl index 5e23a7ba..feac388b 100644 --- a/src/cowboy_req.erl +++ b/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(). diff --git a/test/http_SUITE_data/http_chunked.erl b/test/http_SUITE_data/http_chunked.erl index 87a6852c..6433f663 100644 --- a/test/http_SUITE_data/http_chunked.erl +++ b/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),