diff options
author | Loïc Hoguin <[email protected]> | 2017-05-31 12:49:21 +0200 |
---|---|---|
committer | Loïc Hoguin <[email protected]> | 2017-05-31 12:49:21 +0200 |
commit | cad3e3f63d96559f16ee90e661a29063d0b3fc80 (patch) | |
tree | 5b23eb8ba4deb099413f82690b04fd240c282971 /src | |
parent | 18e2d684b3f810c7386a921d837e6dbca47e4b15 (diff) | |
download | cowboy-cad3e3f63d96559f16ee90e661a29063d0b3fc80.tar.gz cowboy-cad3e3f63d96559f16ee90e661a29063d0b3fc80.tar.bz2 cowboy-cad3e3f63d96559f16ee90e661a29063d0b3fc80.zip |
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.
Diffstat (limited to 'src')
-rw-r--r-- | src/cowboy_http2.erl | 30 |
1 files changed, 15 insertions, 15 deletions
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. |