Class DefaultHttp2LocalFlowController

    • Field Detail

      • DEFAULT_WINDOW_UPDATE_RATIO

        public static final float DEFAULT_WINDOW_UPDATE_RATIO
        The default ratio of window size to initial window size below which a WINDOW_UPDATE is sent to expand the window.
        See Also:
        Constant Field Values
    • Constructor Detail

      • DefaultHttp2LocalFlowController

        public DefaultHttp2LocalFlowController​(Http2Connection connection)
      • DefaultHttp2LocalFlowController

        public DefaultHttp2LocalFlowController​(Http2Connection connection,
                                               float windowUpdateRatio,
                                               boolean autoRefillConnectionWindow)
        Constructs a controller with the given settings.
        Parameters:
        connection - the connection state.
        windowUpdateRatio - the window percentage below which to send a WINDOW_UPDATE.
        autoRefillConnectionWindow - if true, effectively disables the connection window in the flow control algorithm as they will always refill automatically without requiring the application to consume the bytes. When enabled, the maximum bytes you must be prepared to queue is proportional to maximum number of concurrent streams * the initial window size per stream (SETTINGS_MAX_CONCURRENT_STREAMS SETTINGS_INITIAL_WINDOW_SIZE).
    • Method Detail

      • initialWindowSize

        public void initialWindowSize​(int newWindowSize)
                               throws Http2Exception
        Description copied from interface: Http2FlowController
        Sets the connection-wide initial flow control window and updates all stream windows (but not the connection stream window) by the delta.

        Represents the value for SETTINGS_INITIAL_WINDOW_SIZE. This method should only be called by Netty (not users) as a result of a receiving a SETTINGS frame.

        Specified by:
        initialWindowSize in interface Http2FlowController
        Parameters:
        newWindowSize - the new initial window size.
        Throws:
        Http2Exception - thrown if any protocol-related error occurred.
      • windowSize

        public int windowSize​(Http2Stream stream)
        Description copied from interface: Http2FlowController
        Get the portion of the flow control window for the given stream that is currently available for sending/receiving frames which are subject to flow control. This quantity is measured in number of bytes.
        Specified by:
        windowSize in interface Http2FlowController
      • incrementWindowSize

        public void incrementWindowSize​(Http2Stream stream,
                                        int delta)
                                 throws Http2Exception
        Description copied from interface: Http2FlowController
        Increments the size of the stream's flow control window by the given delta.

        In the case of a Http2RemoteFlowController this is called upon receipt of a WINDOW_UPDATE frame from the remote endpoint to mirror the changes to the window size.

        For a Http2LocalFlowController this can be called to request the expansion of the window size published by this endpoint. It is up to the implementation, however, as to when a WINDOW_UPDATE is actually sent.

        Specified by:
        incrementWindowSize in interface Http2FlowController
        Parameters:
        stream - The subject stream. Use Http2Connection.connectionStream() for requesting the size of the connection window.
        delta - the change in size of the flow control window.
        Throws:
        Http2Exception - thrown if a protocol-related error occurred.
      • consumeBytes

        public boolean consumeBytes​(Http2Stream stream,
                                    int numBytes)
                             throws Http2Exception
        Description copied from interface: Http2LocalFlowController
        Indicates that the application has consumed a number of bytes for the given stream and is therefore ready to receive more data from the remote endpoint. The application must consume any bytes that it receives or the flow control window will collapse. Consuming bytes enables the flow controller to send WINDOW_UPDATE to restore a portion of the flow control window for the stream.

        If stream is null or closed (i.e. Http2Stream.state() method returns Http2Stream.State.CLOSED), calling this method has no effect.

        Specified by:
        consumeBytes in interface Http2LocalFlowController
        Parameters:
        stream - the stream for which window space should be freed. The connection stream object must not be used. If stream is null or closed (i.e. Http2Stream.state() method returns Http2Stream.State.CLOSED), calling this method has no effect.
        numBytes - the number of bytes to be returned to the flow control window.
        Returns:
        true if a WINDOW_UPDATE was sent, false otherwise.
        Throws:
        Http2Exception - if the number of bytes returned exceeds the Http2LocalFlowController.unconsumedBytes(Http2Stream) for the stream.
      • unconsumedBytes

        public int unconsumedBytes​(Http2Stream stream)
        Description copied from interface: Http2LocalFlowController
        The number of bytes for the given stream that have been received but not yet consumed by the application.
        Specified by:
        unconsumedBytes in interface Http2LocalFlowController
        Parameters:
        stream - the stream for which window space should be freed.
        Returns:
        the number of unconsumed bytes for the stream.
      • windowUpdateRatio

        public void windowUpdateRatio​(float ratio)
        The window update ratio is used to determine when a window update must be sent. If the ratio of bytes processed since the last update has meet or exceeded this ratio then a window update will be sent. This is the global window update ratio that will be used for new streams.
        Parameters:
        ratio - the ratio to use when checking if a WINDOW_UPDATE is determined necessary for new streams.
        Throws:
        IllegalArgumentException - If the ratio is out of bounds (0, 1).
      • windowUpdateRatio

        public float windowUpdateRatio()
        The window update ratio is used to determine when a window update must be sent. If the ratio of bytes processed since the last update has meet or exceeded this ratio then a window update will be sent. This is the global window update ratio that will be used for new streams.
      • windowUpdateRatio

        public void windowUpdateRatio​(Http2Stream stream,
                                      float ratio)
                               throws Http2Exception
        The window update ratio is used to determine when a window update must be sent. If the ratio of bytes processed since the last update has meet or exceeded this ratio then a window update will be sent. This window update ratio will only be applied to streamId.

        Note it is the responsibly of the caller to ensure that the initial SETTINGS frame is sent before this is called. It would be considered a Http2Error.PROTOCOL_ERROR if a WINDOW_UPDATE was generated by this method before the initial SETTINGS frame is sent.

        Parameters:
        stream - the stream for which ratio applies to.
        ratio - the ratio to use when checking if a WINDOW_UPDATE is determined necessary.
        Throws:
        Http2Exception - If a protocol-error occurs while generating WINDOW_UPDATE frames
      • windowUpdateRatio

        public float windowUpdateRatio​(Http2Stream stream)
                                throws Http2Exception
        The window update ratio is used to determine when a window update must be sent. If the ratio of bytes processed since the last update has meet or exceeded this ratio then a window update will be sent. This window update ratio will only be applied to streamId.
        Throws:
        Http2Exception - If no stream corresponding to stream could be found.
      • receiveFlowControlledFrame

        public void receiveFlowControlledFrame​(Http2Stream stream,
                                               Buffer data,
                                               int padding,
                                               boolean endOfStream)
                                        throws Http2Exception
        Description copied from interface: Http2LocalFlowController
        Receives an inbound DATA frame from the remote endpoint and applies flow control policies to it for both the stream as well as the connection. If any flow control policies have been violated, an exception is raised immediately, otherwise the frame is considered to have "passed" flow control.

        If stream is null or closed, flow control should only be applied to the connection window and the bytes are immediately consumed.

        Specified by:
        receiveFlowControlledFrame in interface Http2LocalFlowController
        Parameters:
        stream - the subject stream for the received frame. The connection stream object must not be used. If stream is null or closed, flow control should only be applied to the connection window and the bytes are immediately consumed.
        data - payload buffer for the frame.
        padding - additional bytes that should be added to obscure the true content size. Must be between 0 and 256 (inclusive).
        endOfStream - Indicates whether this is the last frame to be sent from the remote endpoint for this stream.
        Throws:
        Http2Exception - if any flow control errors are encountered.