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

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).
Loïc Hoguin 5 лет назад
Родитель
Сommit
4ab69f402e
1 измененных файлов с 10 добавлено и 3 удалено
  1. 10 3
      src/cowboy_http.erl

+ 10 - 3
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.