This API is very immature. The Http2Connection-based API is currently preferred over this API.
This API is targeted to eventually replace or reduce the need for the Http2ConnectionHandler API.
An HTTP/2 handler that maps HTTP/2 frames to Http2Frame objects and vice versa. For every incoming HTTP/2
frame, an Http2Frame object is created and propagated via channelRead. Outbound Http2Frame
objects received via write are converted to the HTTP/2 wire format. HTTP/2 frames specific to a stream
implement the Http2StreamFrame interface. The Http2FrameCodec is instantiated using the
Http2FrameCodecBuilder. It's recommended for channel handlers to inherit from the
Http2ChannelDuplexHandler, as it provides additional functionality like iterating over all active streams or
creating outbound streams.
The frame codec delivers and writes frames for active streams. An active stream is closed when either side sends a
RST_STREAM frame or both sides send a frame with the END_STREAM flag set. Each
Http2StreamFrame has a Http2FrameStream object attached that uniquely identifies a particular stream.
Http2StreamFrames read from the channel always a Http2FrameStream object set, while when writing a
Http2StreamFrame the application code needs to set a Http2FrameStream object using
Http2StreamFrame#stream(Http2FrameStream).
The frame codec automatically increments stream and connection flow control windows.
Incoming flow controlled frames need to be consumed by writing a Http2WindowUpdateFrame with the consumed
number of bytes and the corresponding stream identifier set to the frame codec.
The local stream-level flow control window can be changed by writing a Http2SettingsFrame with the
Http2Settings#initialWindowSize() set to the targeted value.
The connection-level flow control window can be changed by writing a Http2WindowUpdateFrame with the
desired window size increment in bytes and the stream identifier set to 0. By default the initial
connection-level flow control window is the same as initial stream-level flow control window.
The first frame of an HTTP/2 stream must be an Http2HeadersFrame, which will have an Http2FrameStream
object attached.
A outbound HTTP/2 stream can be created by first instantiating a new Http2FrameStream object via
Http2ChannelDuplexHandler#newStream(), and then writing a Http2HeadersFrame object with the stream
attached.
final Http2Stream2 stream = handler.newStream();
ctx.write(headersFrame.stream(stream)).addListener(new ChannelFutureListener() {
Error Handling
Exceptions and errors are propagated via ChannelInboundHandler#exceptionCaught. Exceptions that apply to
a specific HTTP/2 stream are wrapped in a Http2FrameStreamException and have the corresponding
Http2FrameStream object attached.
Reference Counting
Some Http2StreamFrames implement the ReferenceCounted interface, as they carry
reference counted objects (e.g. ByteBufs). The frame codec will call ReferenceCounted#retain() before
propagating a reference counted object through the pipeline, and thus an application handler needs to release such
an object after having consumed it. For more information on reference counting take a look at
https://netty.io/wiki/reference-counted-objects.html
HTTP Upgrade
Server-side HTTP to HTTP/2 upgrade is supported in conjunction with Http2ServerUpgradeCodec; the necessary
HTTP-to-HTTP/2 conversion is performed automatically.
| Modifier and Type | Class and Description |
|---|---|
| private class | |
| pack-priv static class | Http2FrameCodec.DefaultHttp2FrameStream
|
| private class | |
| private class |
| Modifier and Type | Field and Description |
|---|---|
| pack-priv ChannelHandlerContext | |
| private final IntObjectMap | |
| private final Integer | |
| private static final InternalLogger | |
| private int | numBufferedStreams
Number of buffered streams if the |
| protected final Http2Connection. | |
| private final Http2Connection. |
| Access | Constructor and Description |
|---|---|
| pack-priv | Http2FrameCodec(Http2ConnectionEncoder encoder, Http2ConnectionDecoder decoder, Http2Settings initialSettings, boolean decoupleCloseAndGoAway, boolean flushPreface)
|
| Modifier and Type | Method and Description |
|---|---|
| pack-priv final boolean | |
| pack-priv final void | forEachActiveStream(final Http2FrameStreamVisitor streamVisitor)
Iterates over all active HTTP/2 streams. |
| private void | |
| public final void | handlerAdded(ChannelHandlerContext ctx)
Overrides io. Implements io. ChannelHandler was added to the actual context and it's ready to handle events.
|
| pack-priv void | |
| private void | |
| private boolean | initializeNewStream(ChannelHandlerContext ctx, Http2FrameCodec.
|
| protected final boolean | isGracefulShutdownComplete()
Overrides io. |
| pack-priv Http2FrameCodec. | |
| pack-priv int | numInitializingStreams()
Retrieve the number of streams currently in the process of being initialized. |
| protected void | onConnectionError(ChannelHandlerContext
the channel context ctx, boolean true if the error was caused by an outbound operation.the exception that was caught cause, Http2Exception the http2Ex)Http2Exception that is embedded in the causality chain. This may
be null if it's an unknown exception.Overrides io. |
| pack-priv void | |
| pack-priv void | |
| pack-priv void | |
| private void | onHttp2StreamWritabilityChanged(ChannelHandlerContext ctx, Http2FrameCodec.
|
| private static void | onHttp2UnknownStreamError(ChannelHandlerContext ctx, Throwable cause, Http2Exception.
|
| private void | |
| protected final void | onStreamError(ChannelHandlerContext
the channel context ctx, boolean true if the error was caused by an outbound operation.the exception that was caught cause, Http2Exception.the streamExceptionStreamException that is embedded in the causality chain.Overrides io. Http2FrameStream object attached
are simply logged and replied to by sending a RST_STREAM frame.
|
| private void | |
| pack-priv void | |
| private void | |
| public final void | userEventTriggered(final ChannelHandlerContext ctx, final Object evt)
Overrides io. Implements io. |
| public void | write(ChannelHandlerContext
the ctx, Object ChannelHandlerContext for which the write operation is madethe message to write msg, ChannelPromise the promise)ChannelPromise to notify once the operation completesOverrides io. Implements io. Http2Frames.
|
| private void | |
| private void | writeHeadersFrame(final ChannelHandlerContext ctx, Http2HeadersFrame headersFrame, final ChannelPromise promise)
|
| private void | writePushPromise(final ChannelHandlerContext ctx, Http2PushPromiseFrame pushPromiseFrame, final ChannelPromise promise)
|