aboutsummaryrefslogtreecommitdiffstats
path: root/src/cowboy_http2.erl
diff options
context:
space:
mode:
authorLoïc Hoguin <[email protected]>2017-10-21 13:09:20 +0100
committerLoïc Hoguin <[email protected]>2017-10-21 13:09:20 +0100
commitc62ce1c63e2801640e36c7a480e9250ec8108d24 (patch)
tree8c8a135ee27fbc9c4f598c9172f4a0891fa31a30 /src/cowboy_http2.erl
parent1ef5a1c45bd56fb9080ff0195c5ea74f88bcd71a (diff)
downloadcowboy-c62ce1c63e2801640e36c7a480e9250ec8108d24.tar.gz
cowboy-c62ce1c63e2801640e36c7a480e9250ec8108d24.tar.bz2
cowboy-c62ce1c63e2801640e36c7a480e9250ec8108d24.zip
Fix stream handler state being discarded on terminate
When we have to send a response before terminating a stream, we call info. The state returned by this info call was discarded when we called terminate after that. This commit fixes it. There are no tests for this, however the new metrics test in the next commit requires the correct behavior so this is ultimately covered.
Diffstat (limited to 'src/cowboy_http2.erl')
-rw-r--r--src/cowboy_http2.erl5
1 files changed, 3 insertions, 2 deletions
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};