From cad3e3f63d96559f16ee90e661a29063d0b3fc80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Hoguin?= Date: Wed, 31 May 2017 12:49:21 +0200 Subject: Fix bad accounting of HTTP/2 windows The previous code was incorrectly substracting the maximum frame size we could send when the data we were actually sending was much lower. --- src/cowboy_http2.erl | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) (limited to 'src') diff --git a/src/cowboy_http2.erl b/src/cowboy_http2.erl index daaffed..ae5f5b9 100644 --- a/src/cowboy_http2.erl +++ b/src/cowboy_http2.erl @@ -633,31 +633,31 @@ send_data(State=#state{local_window=ConnWindow}, send_data(State=#state{socket=Socket, transport=Transport, local_window=ConnWindow}, Stream=#stream{id=StreamID, local_window=StreamWindow}, IsFin, Data) -> MaxFrameSize = 16384, %% @todo Use the real SETTINGS_MAX_FRAME_SIZE set by the client. - SendSize = min(min(ConnWindow, StreamWindow), MaxFrameSize), + MaxSendSize = min(min(ConnWindow, StreamWindow), MaxFrameSize), case Data of - {sendfile, Offset, Bytes, Path} when Bytes =< SendSize -> + {sendfile, Offset, Bytes, Path} when Bytes =< MaxSendSize -> Transport:send(Socket, cow_http2:data_header(StreamID, IsFin, Bytes)), Transport:sendfile(Socket, Path, Offset, Bytes), - {State#state{local_window=ConnWindow - SendSize}, - Stream#stream{local=IsFin, local_window=StreamWindow - SendSize}}; + {State#state{local_window=ConnWindow - Bytes}, + Stream#stream{local=IsFin, local_window=StreamWindow - Bytes}}; {sendfile, Offset, Bytes, Path} -> - Transport:send(Socket, cow_http2:data_header(StreamID, nofin, SendSize)), - Transport:sendfile(Socket, Path, Offset, SendSize), - send_data(State#state{local_window=ConnWindow - SendSize}, - Stream#stream{local_window=StreamWindow - SendSize}, - IsFin, {sendfile, Offset + SendSize, Bytes - SendSize, Path}); + Transport:send(Socket, cow_http2:data_header(StreamID, nofin, MaxSendSize)), + Transport:sendfile(Socket, Path, Offset, MaxSendSize), + send_data(State#state{local_window=ConnWindow - MaxSendSize}, + Stream#stream{local_window=StreamWindow - MaxSendSize}, + IsFin, {sendfile, Offset + MaxSendSize, Bytes - MaxSendSize, Path}); Iolist0 -> IolistSize = iolist_size(Iolist0), if - IolistSize =< SendSize -> + IolistSize =< MaxSendSize -> Transport:send(Socket, cow_http2:data(StreamID, IsFin, Iolist0)), - {State#state{local_window=ConnWindow - SendSize}, - Stream#stream{local=IsFin, local_window=StreamWindow - SendSize}}; + {State#state{local_window=ConnWindow - IolistSize}, + Stream#stream{local=IsFin, local_window=StreamWindow - IolistSize}}; true -> - {Iolist, More} = cowboy_iolists:split(SendSize, Iolist0), + {Iolist, More} = cowboy_iolists:split(MaxSendSize, Iolist0), Transport:send(Socket, cow_http2:data(StreamID, nofin, Iolist)), - send_data(State#state{local_window=ConnWindow - SendSize}, - Stream#stream{local_window=StreamWindow - SendSize}, + send_data(State#state{local_window=ConnWindow - MaxSendSize}, + Stream#stream{local_window=StreamWindow - MaxSendSize}, IsFin, More) end end. -- cgit v1.2.3