aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLoïc Hoguin <[email protected]>2022-09-19 14:10:32 +0200
committerLoïc Hoguin <[email protected]>2022-09-19 14:10:32 +0200
commit105edf1d6e47648f4ee96ef47989ae43b8d826d0 (patch)
treed9e9c816bf4cdf4f56cb99333c8b1f669dbeb8df
parent137e86de7b94a85c0bae72fbc7848bb849a8ac0b (diff)
downloadcowboy-105edf1d6e47648f4ee96ef47989ae43b8d826d0.tar.gz
cowboy-105edf1d6e47648f4ee96ef47989ae43b8d826d0.tar.bz2
cowboy-105edf1d6e47648f4ee96ef47989ae43b8d826d0.zip
Fix data sent after RST_STREAM in HTTP/2 in rare cases
-rw-r--r--src/cowboy_http2.erl11
1 files changed, 8 insertions, 3 deletions
diff --git a/src/cowboy_http2.erl b/src/cowboy_http2.erl
index ed2623c..7440d91 100644
--- a/src/cowboy_http2.erl
+++ b/src/cowboy_http2.erl
@@ -849,7 +849,13 @@ send_data(State0=#state{socket=Socket, transport=Transport, opts=Opts}, SendData
_ ->
Transport:send(Socket, Data)
end || Data <- Acc],
- State.
+ send_data_terminate(State, SendData).
+
+send_data_terminate(State, []) ->
+ State;
+send_data_terminate(State0, [{StreamID, IsFin, _}|Tail]) ->
+ State = maybe_terminate_stream(State0, StreamID, IsFin),
+ send_data_terminate(State, Tail).
prepare_data(State, [], Acc, []) ->
{lists:reverse(Acc), State};
@@ -859,8 +865,7 @@ prepare_data(State0, [{StreamID, IsFin, SendData}|Tail], Acc0, Buffer0) ->
{Acc, Buffer, State} = prepare_data(State0, StreamID, IsFin, SendData, Acc0, Buffer0),
prepare_data(State, Tail, Acc, Buffer).
-prepare_data(State0, StreamID, IsFin, [], Acc, Buffer) ->
- State = maybe_terminate_stream(State0, StreamID, IsFin),
+prepare_data(State, _, _, [], Acc, Buffer) ->
{Acc, Buffer, State};
prepare_data(State0, StreamID, IsFin, [FrameData|Tail], Acc, Buffer) ->
FrameIsFin = case Tail of