Class Http2MultiplexCodec
- All Implemented Interfaces:
ChannelHandler, ChannelInboundHandler, ChannelOutboundHandler, Http2LifecycleManager
When a new stream is created, a new Channel is created for it. Applications send and
receive Http2StreamFrames on the created channel. ByteBufs cannot be processed by the channel;
all writes that reach the head of the pipeline must be an instance of Http2StreamFrame. Writes that reach
the head of the pipeline are processed directly by this handler and cannot be intercepted.
The child channel will be notified of user events that impact the stream, such as Http2GoAwayFrame and Http2ResetFrame, as soon as they occur. Although
Http2GoAwayFrame and Http2ResetFrame signify that the remote is ignoring further
communication, closing of the channel is delayed until any inbound queue is drained with Channel.read(), which follows the default behavior of channels in Netty. Applications are
free to close the channel in response to such events if they don't have use for any queued
messages. Any connection level events like Http2SettingsFrame and Http2GoAwayFrame
will be processed internally and also propagated down the pipeline for other handlers to act on.
Outbound streams are supported via the Http2StreamChannelBootstrap.
ChannelConfig.setMaxMessagesPerRead(int) and ChannelConfig.setAutoRead(boolean) are supported.
Reference Counting
SomeHttp2StreamFrames implement the ReferenceCounted interface, as they carry
reference counted objects (e.g. ByteBufs). The multiplex 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
Channel Events
A child channel becomes active as soon as it is registered to anEventLoop. Therefore, an active channel
does not map to an active HTTP/2 stream immediately. Only once a Http2HeadersFrame has been successfully sent
or received, does the channel map to an active HTTP/2 stream. In case it is not possible to open a new HTTP/2 stream
(i.e. due to the maximum number of active streams being exceeded), the child channel receives an exception
indicating the cause and is closed immediately thereafter.
Writability and Flow Control
A child channel observes outbound/remote flow control via the channel's writability. A channel only becomes writable when it maps to an active HTTP/2 stream and the stream's flow control window is greater than zero. A child channel does not know about the connection-level flow control window.ChannelHandlers are free to ignore the
channel's writability, in which case the excessive writes will be buffered by the parent channel. It's important to
note that only Http2DataFrames are subject to HTTP/2 flow control.-
Nested Class Summary
Nested classes/interfaces inherited from class ByteToMessageDecoder
ByteToMessageDecoder.CumulatorNested classes/interfaces inherited from interface ChannelHandler
ChannelHandler.SharableModifier and TypeInterfaceDescriptionstatic @interfaceIndicates that the same instance of the annotatedChannelHandlercan be added to one or moreChannelPipelines multiple times without a race condition. -
Field Summary
Fields inherited from class Http2FrameCodec
streamKeyFields inherited from class ByteToMessageDecoder
COMPOSITE_CUMULATOR, MERGE_CUMULATORModifier and TypeFieldDescriptionstatic final ByteToMessageDecoder.CumulatorCumulateByteBufs by add them to aCompositeByteBufand so do no memory copy whenever possible.static final ByteToMessageDecoder.Cumulator -
Method Summary
Modifier and TypeMethodDescriptionfinal voidchannelRead(ChannelHandlerContext ctx, Object msg) Deprecated.CallsChannelHandlerContext.fireChannelRead(Object)to forward to the nextChannelInboundHandlerin theChannelPipeline.final voidDeprecated.Notifies any child streams of the read completion.final voidDeprecated.CallsChannelHandlerContext.fireChannelWritabilityChanged()to forward to the nextChannelInboundHandlerin theChannelPipeline.final voidDeprecated.final voidDeprecated.Gets called after theByteToMessageDecoderwas removed from the actual context and it doesn't handle events anymore.voidDeprecated.Handles the client-side (cleartext) upgrade from HTTP to HTTP/2.Methods inherited from class Http2FrameCodec
handlerAdded, isGracefulShutdownComplete, newHttp2UnknownFrame, onConnectionError, onStreamError, userEventTriggered, writeModifier and TypeMethodDescriptionfinal voidDo nothing by default, sub-classes may override this method.protected final booleanCalled by the graceful shutdown logic to determine when it is safe to close the connection.protected Http2StreamFramenewHttp2UnknownFrame(byte frameType, int streamId, Http2Flags flags, ByteBuf payload) Create a Http2UnknownFrame.protected voidonConnectionError(ChannelHandlerContext ctx, boolean outbound, Throwable cause, Http2Exception http2Ex) Handler for a connection error.protected final voidonStreamError(ChannelHandlerContext ctx, boolean outbound, Throwable cause, Http2Exception.StreamException streamException) Exceptions for unknown streams, that is streams that have noHttp2FrameStreamobject attached are simply logged and replied to by sending a RST_STREAM frame.final voiduserEventTriggered(ChannelHandlerContext ctx, Object evt) Handles the cleartext HTTP upgrade event.voidwrite(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) Processes allHttp2Frames.Methods inherited from class Http2ConnectionHandler
bind, channelActive, channelInactive, close, closeStream, closeStreamLocal, closeStreamRemote, connect, connection, decode, decoder, deregister, disconnect, encoder, exceptionCaught, flush, frameWriter, goAway, gracefulShutdownTimeoutMillis, gracefulShutdownTimeoutMillis, handleServerHeaderDecodeSizeError, onError, onHttpServerUpgrade, read, resetStreamModifier and TypeMethodDescriptionvoidbind(ChannelHandlerContext ctx, SocketAddress localAddress, ChannelPromise promise) Called once a bind operation is made.voidCallsChannelHandlerContext.fireChannelActive()to forward to the nextChannelInboundHandlerin theChannelPipeline.voidCallsChannelHandlerContext.fireChannelInactive()to forward to the nextChannelInboundHandlerin theChannelPipeline.voidclose(ChannelHandlerContext ctx, ChannelPromise promise) Called once a close operation is made.voidcloseStream(Http2Stream stream, ChannelFuture future) Closes and deactivates the givenstream.voidcloseStreamLocal(Http2Stream stream, ChannelFuture future) Closes the local side of the given stream.voidcloseStreamRemote(Http2Stream stream, ChannelFuture future) Closes the remote side of the given stream.voidconnect(ChannelHandlerContext ctx, SocketAddress remoteAddress, SocketAddress localAddress, ChannelPromise promise) Called once a connect operation is made.protected voiddecode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) Decode the from oneByteBufto an other.decoder()voidderegister(ChannelHandlerContext ctx, ChannelPromise promise) Called once a deregister operation is made from the current registeredEventLoop.voiddisconnect(ChannelHandlerContext ctx, ChannelPromise promise) Called once a disconnect operation is made.encoder()voidexceptionCaught(ChannelHandlerContext ctx, Throwable cause) HandlesHttp2Exceptionobjects that were thrown from other handlers.voidCalled once a flush operation is made.protected Http2FrameWritergoAway(ChannelHandlerContext ctx, int lastStreamId, long errorCode, ByteBuf debugData, ChannelPromise promise) Prevents the peer from creating streams and close the connection iferrorCodeis notHttp2Error.NO_ERROR.longGet the amount of time (in milliseconds) this endpoint will wait for all streams to be closed before closing the connection during the graceful shutdown process.voidgracefulShutdownTimeoutMillis(long gracefulShutdownTimeoutMillis) Set the amount of time (in milliseconds) this endpoint will wait for all streams to be closed before closing the connection during the graceful shutdown process.protected voidNotifies client that this server has received headers that are larger than what it is willing to accept.voidonError(ChannelHandlerContext ctx, boolean outbound, Throwable cause) Central handler for all exceptions caught during HTTP/2 processing.voidonHttpServerUpgrade(Http2Settings settings) Handles the server-side (cleartext) upgrade from HTTP to HTTP/2.voidInterceptsChannelHandlerContext.read().resetStream(ChannelHandlerContext ctx, int streamId, long errorCode, ChannelPromise promise) Ensure the stream identified bystreamIdis reset.Methods inherited from class ByteToMessageDecoder
actualReadableBytes, callDecode, decodeLast, discardSomeReadBytes, handlerRemoved, internalBuffer, isSingleDecode, setCumulator, setDiscardAfterReads, setSingleDecodeModifier and TypeMethodDescriptionprotected intReturns the actual number of readable bytes in the internal cumulative buffer of this decoder.protected voidcallDecode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) Called once data should be decoded from the givenByteBuf.protected voiddecodeLast(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) Is called one last time when theChannelHandlerContextgoes in-active.protected final voidfinal voidDo nothing by default, sub-classes may override this method.protected ByteBufReturns the internal cumulative buffer of this decoder.booleanIftruethen only one message is decoded on eachByteToMessageDecoder.channelRead(ChannelHandlerContext, Object)call.voidsetCumulator(ByteToMessageDecoder.Cumulator cumulator) Set theByteToMessageDecoder.Cumulatorto use for cumulate the receivedByteBufs.voidsetDiscardAfterReads(int discardAfterReads) Set the number of reads after whichByteBuf.discardSomeReadBytes()are called and so free up memory.voidsetSingleDecode(boolean singleDecode) If set then only one message is decoded on eachByteToMessageDecoder.channelRead(ChannelHandlerContext, Object)call.Methods inherited from class ChannelInboundHandlerAdapter
channelRegistered, channelUnregisteredModifier and TypeMethodDescriptionvoidCallsChannelHandlerContext.fireChannelRegistered()to forward to the nextChannelInboundHandlerin theChannelPipeline.voidCallsChannelHandlerContext.fireChannelUnregistered()to forward to the nextChannelInboundHandlerin theChannelPipeline.Methods inherited from class ChannelHandlerAdapter
ensureNotSharable, isSharableModifier and TypeMethodDescriptionprotected voidbooleanReturntrueif the implementation isChannelHandler.Sharableand so can be added to differentChannelPipelines.
-
Method Details
-
onHttpClientUpgrade
Deprecated.Description copied from class:Http2ConnectionHandlerHandles the client-side (cleartext) upgrade from HTTP to HTTP/2. Reserves local stream 1 for the HTTP/2 response.- Overrides:
onHttpClientUpgradein classHttp2ConnectionHandler- Throws:
Http2Exception
-
handlerAdded0
Deprecated.- Throws:
Exception
-
handlerRemoved0
Deprecated.Description copied from class:ByteToMessageDecoderGets called after theByteToMessageDecoderwas removed from the actual context and it doesn't handle events anymore.- Overrides:
handlerRemoved0in classHttp2ConnectionHandler- Throws:
Exception
-
channelReadComplete
Deprecated.Notifies any child streams of the read completion.- Specified by:
channelReadCompletein interfaceChannelInboundHandler- Overrides:
channelReadCompletein classHttp2ConnectionHandler- Throws:
Exception
-
channelRead
Deprecated.Description copied from class:ChannelInboundHandlerAdapterCallsChannelHandlerContext.fireChannelRead(Object)to forward to the nextChannelInboundHandlerin theChannelPipeline. Sub-classes may override this method to change behavior.- Specified by:
channelReadin interfaceChannelInboundHandler- Overrides:
channelReadin classByteToMessageDecoder- Throws:
Exception
-
channelWritabilityChanged
Deprecated.Description copied from class:ChannelInboundHandlerAdapterCallsChannelHandlerContext.fireChannelWritabilityChanged()to forward to the nextChannelInboundHandlerin theChannelPipeline. Sub-classes may override this method to change behavior.- Specified by:
channelWritabilityChangedin interfaceChannelInboundHandler- Overrides:
channelWritabilityChangedin classHttp2ConnectionHandler- Throws:
Exception
-
Http2FrameCodecBuildertogether withHttp2MultiplexHandler.