@UnstableApi public class DefaultHttp2LocalFlowController extends Object implements Http2LocalFlowController
Http2LocalFlowController
.
This class is NOT thread safe. The assumption is all methods must be invoked from a single thread.
Typically this thread is the event loop thread for the ChannelHandlerContext
managed by this class.
Modifier and Type | Field and Description |
---|---|
static 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. |
Constructor and Description |
---|
DefaultHttp2LocalFlowController(Http2Connection connection) |
DefaultHttp2LocalFlowController(Http2Connection connection,
float windowUpdateRatio,
boolean autoRefillConnectionWindow)
Constructs a controller with the given settings.
|
Modifier and Type | Method and Description |
---|---|
void |
channelHandlerContext(ChannelHandlerContext ctx)
Set the
ChannelHandlerContext for which to apply flow control on. |
boolean |
consumeBytes(Http2Stream stream,
int numBytes)
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.
|
DefaultHttp2LocalFlowController |
frameWriter(Http2FrameWriter frameWriter)
Sets the writer to be use for sending
WINDOW_UPDATE frames. |
void |
incrementWindowSize(Http2Stream stream,
int delta)
Increments the size of the stream's flow control window by the given delta.
|
int |
initialWindowSize()
Gets the connection-wide initial flow control window size that is used as the basis for new stream flow
control windows.
|
int |
initialWindowSize(Http2Stream stream)
Get the initial flow control window size for the given stream.
|
void |
initialWindowSize(int newWindowSize)
Sets the connection-wide initial flow control window and updates all stream windows (but not the connection
stream window) by the delta.
|
void |
receiveFlowControlledFrame(Http2Stream stream,
ByteBuf data,
int padding,
boolean endOfStream)
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. |
int |
unconsumedBytes(Http2Stream stream)
The number of bytes for the given stream that have been received but not yet consumed by the
application.
|
int |
windowSize(Http2Stream stream)
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.
|
float |
windowUpdateRatio()
The window update ratio is used to determine when a window update must be sent.
|
void |
windowUpdateRatio(float ratio)
The window update ratio is used to determine when a window update must be sent.
|
float |
windowUpdateRatio(Http2Stream stream)
The window update ratio is used to determine when a window update must be sent.
|
void |
windowUpdateRatio(Http2Stream stream,
float ratio)
The window update ratio is used to determine when a window update must be sent.
|
public static final float DEFAULT_WINDOW_UPDATE_RATIO
WINDOW_UPDATE
is sent to expand the window.public DefaultHttp2LocalFlowController(Http2Connection connection)
public DefaultHttp2LocalFlowController(Http2Connection connection, float windowUpdateRatio, boolean autoRefillConnectionWindow)
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).public DefaultHttp2LocalFlowController frameWriter(Http2FrameWriter frameWriter)
Http2LocalFlowController
WINDOW_UPDATE
frames. This must be called before any flow
controlled data is received.frameWriter
in interface Http2LocalFlowController
frameWriter
- the HTTP/2 frame writer.public void channelHandlerContext(ChannelHandlerContext ctx)
Http2FlowController
ChannelHandlerContext
for which to apply flow control on.
This must be called to properly initialize the Http2FlowController
.
Not calling this is considered a programming error.
channelHandlerContext
in interface Http2FlowController
ctx
- The ChannelHandlerContext
for which to apply flow control on.public void initialWindowSize(int newWindowSize) throws Http2Exception
Http2FlowController
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.
initialWindowSize
in interface Http2FlowController
newWindowSize
- the new initial window size.Http2Exception
- thrown if any protocol-related error occurred.public int initialWindowSize()
Http2FlowController
Represents the value for
SETTINGS_INITIAL_WINDOW_SIZE. The initial value
returned by this method must be Http2CodecUtil.DEFAULT_WINDOW_SIZE
.
initialWindowSize
in interface Http2FlowController
public int windowSize(Http2Stream stream)
Http2FlowController
windowSize
in interface Http2FlowController
public int initialWindowSize(Http2Stream stream)
Http2LocalFlowController
Http2FlowController.initialWindowSize()
- Http2FlowController.windowSize(Http2Stream)
.initialWindowSize
in interface Http2LocalFlowController
public void incrementWindowSize(Http2Stream stream, int delta) throws Http2Exception
Http2FlowController
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.
incrementWindowSize
in interface Http2FlowController
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.Http2Exception
- thrown if a protocol-related error occurred.public boolean consumeBytes(Http2Stream stream, int numBytes) throws Http2Exception
Http2LocalFlowController
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.consumeBytes
in interface Http2LocalFlowController
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.WINDOW_UPDATE
was sent, false otherwise.Http2Exception
- if the number of bytes returned exceeds the Http2LocalFlowController.unconsumedBytes(Http2Stream)
for the
stream.public int unconsumedBytes(Http2Stream stream)
Http2LocalFlowController
unconsumedBytes
in interface Http2LocalFlowController
stream
- the stream for which window space should be freed.public void windowUpdateRatio(float ratio)
ratio
- the ratio to use when checking if a WINDOW_UPDATE
is determined necessary for new streams.IllegalArgumentException
- If the ratio is out of bounds (0, 1).public float windowUpdateRatio()
public void windowUpdateRatio(Http2Stream stream, float ratio) throws Http2Exception
streamId
.
Note it is the responsibly of the caller to ensure that the 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.
stream
- the stream for which ratio
applies to.ratio
- the ratio to use when checking if a WINDOW_UPDATE
is determined necessary.Http2Exception
- If a protocol-error occurs while generating WINDOW_UPDATE
framespublic float windowUpdateRatio(Http2Stream stream) throws Http2Exception
streamId
.Http2Exception
- If no stream corresponding to stream
could be found.public void receiveFlowControlledFrame(Http2Stream stream, ByteBuf data, int padding, boolean endOfStream) throws Http2Exception
Http2LocalFlowController
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.receiveFlowControlledFrame
in interface Http2LocalFlowController
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.Http2Exception
- if any flow control errors are encountered.Copyright © 2008–2017 The Netty Project. All rights reserved.