From 3fea604ed8b92a0284cae1a490afdb1a8830b6a0 Mon Sep 17 00:00:00 2001 From: Tony Han Date: Tue, 30 Jul 2019 14:19:56 +0800 Subject: [PATCH] Use cal_increasing_window to calculate new window --- Makefile | 2 +- src/cowboy_http2.erl | 22 +++++++++++++++++++--- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index 039bf2e3..b5958fb9 100644 --- a/Makefile +++ b/Makefile @@ -15,7 +15,7 @@ CT_OPTS += -ct_hooks cowboy_ct_hook [] # -boot start_sasl LOCAL_DEPS = crypto DEPS = cowlib ranch -dep_cowlib = git https://github.com/ninenines/cowlib 2.7.3 +dep_cowlib = git https://github.com/elixir-grpc/cowlib add-new-update-window dep_ranch = git https://github.com/ninenines/ranch 1.7.1 DOC_DEPS = asciideck diff --git a/src/cowboy_http2.erl b/src/cowboy_http2.erl index 3f456702..deb57ce6 100644 --- a/src/cowboy_http2.erl +++ b/src/cowboy_http2.erl @@ -311,7 +311,7 @@ data_frame(State=#state{opts=Opts, streams=Streams}, StreamID, IsFin, Data) -> lingering_data_frame(State=#state{socket=Socket, transport=Transport, http2_machine=HTTP2Machine0}, DataLen) -> Transport:send(Socket, cow_http2:window_update(DataLen)), - HTTP2Machine1 = cow_http2_machine:update_window(DataLen, HTTP2Machine0), + HTTP2Machine1 = cal_and_update_window(DataLen, HTTP2Machine0), State#state{http2_machine=HTTP2Machine1}. headers_frame(State, StreamID, IsFin, Headers, @@ -586,8 +586,8 @@ commands(State=#state{socket=Socket, transport=Transport, http2_machine=HTTP2Mac cow_http2:window_update(Size), cow_http2:window_update(StreamID, Size) ]), - HTTP2Machine1 = cow_http2_machine:update_window(Size, HTTP2Machine0), - HTTP2Machine = cow_http2_machine:update_window(StreamID, Size, HTTP2Machine1), + HTTP2Machine1 = cal_and_update_window(Size, HTTP2Machine0), + HTTP2Machine = cal_and_update_window(StreamID, Size, HTTP2Machine1), commands(State#state{http2_machine=HTTP2Machine}, StreamID, Tail); %% Supervise a child process. commands(State=#state{children=Children}, StreamID, [{spawn, Pid, Shutdown}|Tail]) -> @@ -666,6 +666,22 @@ maybe_send_data(State=#state{http2_machine=HTTP2Machine0}, StreamID, IsFin, Data send_data(State#state{http2_machine=HTTP2Machine}, SendData) end. +cal_and_update_window(DataLen, HTTP2Machine) -> + case cow_http2_machine:cal_increasing_window(DataLen, HTTP2Machine) of + 0 -> + HTTP2Machine; + NewSize -> + cow_http2_machine:update_window(NewSize, HTTP2Machine) + end. + +cal_and_update_window(StreamID, _DataLen, HTTP2Machine) -> + case cow_http2_machine:cal_increasing_window(StreamID, HTTP2Machine) of + 0 -> + HTTP2Machine; + NewSize -> + cow_http2_machine:update_window(StreamID, NewSize, HTTP2Machine) + end. + send_data(State, []) -> State; send_data(State0, [{StreamID, IsFin, SendData}|Tail]) ->