Просмотр исходного кода

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 лет назад
Родитель
Сommit
d2205d9ea6
2 измененных файлов с 7 добавлено и 2 удалено
  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),