aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/cowboy_http.erl23
-rw-r--r--src/cowboy_http2.erl5
2 files changed, 15 insertions, 13 deletions
diff --git a/src/cowboy_http.erl b/src/cowboy_http.erl
index bfbd290..9441700 100644
--- a/src/cowboy_http.erl
+++ b/src/cowboy_http.erl
@@ -932,9 +932,8 @@ stream_reset(State, StreamID, StreamError={internal_error, _, _}) ->
stream_terminate(State0=#state{socket=Socket, transport=Transport,
out_streamid=OutStreamID, out_state=OutState,
streams=Streams0, children=Children0}, StreamID, Reason) ->
- {value, #stream{state=StreamState, version=Version}, Streams}
- = lists:keytake(StreamID, #stream.id, Streams0),
- State1 = case OutState of
+ #stream{version=Version} = lists:keyfind(StreamID, #stream.id, Streams0),
+ State1 = #state{streams=Streams1} = case OutState of
wait when element(1, Reason) =:= internal_error ->
info(State0, StreamID, {response, 500, #{<<"content-length">> => <<"0">>}, <<>>});
wait ->
@@ -945,18 +944,20 @@ stream_terminate(State0=#state{socket=Socket, transport=Transport,
_ -> %% done or Version =:= 'HTTP/1.0'
State0
end,
+ %% Remove the stream from the state.
+ {value, #stream{state=StreamState}, Streams}
+ = lists:keytake(StreamID, #stream.id, Streams1),
+ State2 = State1#state{streams=Streams},
+ %% Stop the stream.
+ stream_call_terminate(StreamID, Reason, StreamState),
+ Children = cowboy_children:shutdown(Children0, StreamID),
%% We reset the timeout if there are no active streams anymore.
State = case Streams of
- [] -> set_timeout(State1);
- _ -> State1
+ [] -> set_timeout(State2);
+ _ -> State2
end,
-
- stream_call_terminate(StreamID, Reason, StreamState),
-
- Children = cowboy_children:shutdown(Children0, StreamID),
-
+ %% Move on to the next stream.
%% @todo Skip the body, if any, or drop the connection if too large.
-
%% @todo Only do this if Current =:= StreamID.
NextOutStreamID = OutStreamID + 1,
case lists:keyfind(NextOutStreamID, #stream.id, Streams) of
diff --git a/src/cowboy_http2.erl b/src/cowboy_http2.erl
index dbd67cb..2b189e2 100644
--- a/src/cowboy_http2.erl
+++ b/src/cowboy_http2.erl
@@ -777,8 +777,9 @@ stream_terminate(State=#state{socket=Socket, transport=Transport,
case lists:keytake(StreamID, #stream.id, Streams0) of
%% When the stream terminates normally (without sending RST_STREAM)
%% and no response was sent, we need to send a proper response back to the client.
- {value, #stream{state=StreamState, local=idle}, Streams} when Reason =:= normal ->
- State1 = info(State, StreamID, {response, 204, #{}, <<>>}),
+ {value, #stream{local=idle}, Streams} when Reason =:= normal ->
+ State1 = #state{streams=Streams1} = info(State, StreamID, {response, 204, #{}, <<>>}),
+ #stream{state=StreamState} = lists:keyfind(StreamID, #stream.id, Streams1),
stream_call_terminate(StreamID, Reason, StreamState),
Children = cowboy_children:shutdown(Children0, StreamID),
State1#state{streams=Streams, children=Children};