lib/protocol/http2/window_update_frame.rb in protocol-http2-0.19.1 vs lib/protocol/http2/window_update_frame.rb in protocol-http2-0.19.2

- old
+ new

@@ -2,108 +2,13 @@ # Released under the MIT License. # Copyright, 2019-2024, by Samuel Williams. require_relative "frame" +require_relative "window" module Protocol module HTTP2 - class Window - # @param capacity [Integer] The initial window size, typically from the settings. - def initialize(capacity = 0xFFFF) - # This is the main field required: - @available = capacity - - # These two fields are primarily used for efficiently sending window updates: - @used = 0 - @capacity = capacity - end - - # The window is completely full? - def full? - @available <= 0 - end - - attr :used - attr :capacity - - # When the value of SETTINGS_INITIAL_WINDOW_SIZE changes, a receiver MUST adjust the size of all stream flow-control windows that it maintains by the difference between the new value and the old value. - def capacity= value - difference = value - @capacity - - # An endpoint MUST treat a change to SETTINGS_INITIAL_WINDOW_SIZE that causes any flow-control window to exceed the maximum size as a connection error of type FLOW_CONTROL_ERROR. - if (@available + difference) > MAXIMUM_ALLOWED_WINDOW_SIZE - raise FlowControlError, "Changing window size by #{difference} caused overflow: #{@available + difference} > #{MAXIMUM_ALLOWED_WINDOW_SIZE}!" - end - - @available += difference - @capacity = value - end - - def consume(amount) - @available -= amount - @used += amount - end - - attr :available - - def available? - @available > 0 - end - - def expand(amount) - available = @available + amount - - if available > MAXIMUM_ALLOWED_WINDOW_SIZE - raise FlowControlError, "Expanding window by #{amount} caused overflow: #{available} > #{MAXIMUM_ALLOWED_WINDOW_SIZE}!" - end - - # puts "expand(#{amount}) @available=#{@available}" - @available += amount - @used -= amount - end - - def wanted - @used - end - - def limited? - @available < (@capacity / 2) - end - - def inspect - "\#<#{self.class} used=#{@used} available=#{@available} capacity=#{@capacity}>" - end - end - - # This is a window which efficiently maintains a desired capacity. - class LocalWindow < Window - def initialize(capacity = 0xFFFF, desired: nil) - super(capacity) - - @desired = desired - end - - attr_accessor :desired - - def wanted - if @desired - # We must send an update which allows at least @desired bytes to be sent. - (@desired - @capacity) + @used - else - @used - end - end - - def limited? - if @desired - @available < @desired - else - super - end - end - end - # The WINDOW_UPDATE frame is used to implement flow control. # # +-+-------------------------------------------------------------+ # |R| Window Size Increment (31) | # +-+-------------------------------------------------------------+