module FlowControlled
Definitions
def available_frame_size(maximum_frame_size = self.maximum_frame_size)
This could be negative if the window has been overused due to a change in initial window size.
Implementation
def available_frame_size(maximum_frame_size = self.maximum_frame_size)
available_size = self.available_size
# puts "available_size=#{available_size} maximum_frame_size=#{maximum_frame_size}"
if available_size < maximum_frame_size
return available_size
else
return maximum_frame_size
end
end
def consume_remote_window(frame)
Keep track of the amount of data sent, and fail if is too much.
Implementation
def consume_remote_window(frame)
amount = frame.length
# Frames with zero length with the END_STREAM flag set (that is, an empty DATA frame) MAY be sent if there is no available space in either flow-control window.
if amount.zero? and frame.end_stream?
# It's okay, we can send. No need to consume, it's empty anyway.
elsif amount >= 0 and amount <= @remote_window.available
@remote_window.consume(amount)
else
raise FlowControlError, "Trying to send #{frame.length} bytes, exceeded window size: #{@remote_window.available} (#{@remote_window})"
end
end
def send_window_update(window_increment)
Notify the remote end that we are prepared to receive more data:
Implementation
def send_window_update(window_increment)
frame = WindowUpdateFrame.new(self.id)
frame.pack window_increment
write_frame(frame)
@local_window.expand(window_increment)
end
def window_updated(size)
The window has been expanded by the given amount.
Implementation
def window_updated(size)
return false
end