From 1c474af8ee4c61c9cbbf6ef4e121d1d82af75151 Mon Sep 17 00:00:00 2001 From: James Fish Date: Mon, 18 Nov 2013 20:32:47 +0000 Subject: Fix loop handler keepalive race condition Previously if a loop handler received the timeout message from a previous request on the same connection the socket would be set to {active, once} incorrectly - when a socket packet was already in the message queue. This second packet would not be added to the buffer before a Handler:info/3 call if a user message was in the message queue before both socket packets. --- test/http_SUITE_data/http_loop_stream_recv.erl | 41 ++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 test/http_SUITE_data/http_loop_stream_recv.erl (limited to 'test/http_SUITE_data') diff --git a/test/http_SUITE_data/http_loop_stream_recv.erl b/test/http_SUITE_data/http_loop_stream_recv.erl new file mode 100644 index 0000000..87113c6 --- /dev/null +++ b/test/http_SUITE_data/http_loop_stream_recv.erl @@ -0,0 +1,41 @@ +%% Feel free to use, reuse and abuse the code in this file. + +-module(http_loop_stream_recv). +-export([init/3]). +-export([info/3]). +-export([terminate/3]). + +init({_, http}, Req, _) -> + receive after 100 -> ok end, + self() ! stream, + {loop, Req, 1, 100}. + +info(stream, Req, Id) -> + case stream_next(Req) of + {ok, Id, Req2} -> + info(stream, Req2, Id+1); + {done, Req2} -> + {ok, Req3} = cowboy_req:reply(200, Req2), + {ok, Req3, Id} + end. + +terminate({normal, shutdown}, _, _) -> + ok. + +stream_next(Req) -> + stream_next(<<>>, Req). + +stream_next(Buffer, Req) -> + case cowboy_req:stream_body(Req) of + {ok, Packet, Req2} -> + case <> of + <> -> + {ok, Id, Req2}; + Buffer2 when byte_size(Buffer2) < 4 -> + stream_next(Buffer2, Req2); + _InvalidBuffer -> + {error, invalid_chunk} + end; + Other -> + Other + end. -- cgit v1.2.3