From 105edf1d6e47648f4ee96ef47989ae43b8d826d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Hoguin?= Date: Mon, 19 Sep 2022 14:10:32 +0200 Subject: Fix data sent after RST_STREAM in HTTP/2 in rare cases --- src/cowboy_http2.erl | 11 ++++++++--- 1 file 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 -- cgit v1.2.3