diff options
author | Loïc Hoguin <[email protected]> | 2022-09-19 14:10:32 +0200 |
---|---|---|
committer | Loïc Hoguin <[email protected]> | 2022-09-19 14:10:32 +0200 |
commit | 105edf1d6e47648f4ee96ef47989ae43b8d826d0 (patch) | |
tree | d9e9c816bf4cdf4f56cb99333c8b1f669dbeb8df | |
parent | 137e86de7b94a85c0bae72fbc7848bb849a8ac0b (diff) | |
download | cowboy-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.erl | 11 |
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 |