From 4ab69f402e38f77b7612ecf30f3defe9c6a76d24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Hoguin?= Date: Sat, 4 Apr 2020 20:15:23 +0200 Subject: Fix active mode and flow control during pipelining We could get stuck in passive mode under certain conditions (fast and non-busy machine and perhaps other environment factors). --- src/cowboy_http.erl | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/cowboy_http.erl b/src/cowboy_http.erl index 13d07b7..e7a28da 100644 --- a/src/cowboy_http.erl +++ b/src/cowboy_http.erl @@ -1307,14 +1307,21 @@ stream_terminate(State0=#state{opts=Opts, in_streamid=InStreamID, in_state=InSta stream_next(State) end. -stream_next(State=#state{out_streamid=OutStreamID, streams=Streams}) -> +stream_next(State0=#state{opts=Opts, active=Active, out_streamid=OutStreamID, streams=Streams}) -> NextOutStreamID = OutStreamID + 1, case lists:keyfind(NextOutStreamID, #stream.id, Streams) of false -> - State#state{out_streamid=NextOutStreamID, out_state=wait}; + State0#state{out_streamid=NextOutStreamID, out_state=wait}; #stream{queue=Commands} -> + State = case Active of + true -> State0; + false -> active(State0) + end, %% @todo Remove queue from the stream. - commands(State#state{out_streamid=NextOutStreamID, out_state=wait}, + %% We set the flow to the initial flow size even though + %% we might have sent some data through already due to pipelining. + Flow = maps:get(initial_stream_flow_size, Opts, 65535), + commands(State#state{flow=Flow, out_streamid=NextOutStreamID, out_state=wait}, NextOutStreamID, Commands) end. -- cgit v1.2.3