Package io.grpc.netty

Class NettyServerHandler

java.lang.Object
io.netty.channel.ChannelHandlerAdapter
io.netty.channel.ChannelInboundHandlerAdapter
io.netty.handler.codec.ByteToMessageDecoder
io.netty.handler.codec.http2.Http2ConnectionHandler
All Implemented Interfaces:
io.netty.channel.ChannelHandler, io.netty.channel.ChannelInboundHandler, io.netty.channel.ChannelOutboundHandler, io.netty.handler.codec.http2.Http2LifecycleManager

class NettyServerHandler extends AbstractNettyHandler
Server-side Netty handler for GRPC processing. All event handlers are executed entirely within the context of the Netty Channel thread.
  • Field Details

    • logger

      private static final Logger logger
    • KEEPALIVE_PING

      private static final long KEEPALIVE_PING
      See Also:
    • GRACEFUL_SHUTDOWN_PING

      static final long GRACEFUL_SHUTDOWN_PING
      See Also:
    • GRACEFUL_SHUTDOWN_PING_TIMEOUT_NANOS

      private static final long GRACEFUL_SHUTDOWN_PING_TIMEOUT_NANOS
    • DISABLE_CONNECTION_HEADER_CHECK

      private static final boolean DISABLE_CONNECTION_HEADER_CHECK
      Temporary workaround for #8674. Fine to delete after v1.45 release, and maybe earlier.
    • streamKey

      private final io.netty.handler.codec.http2.Http2Connection.PropertyKey streamKey
    • transportListener

      private final ServerTransportListener transportListener
    • maxMessageSize

      private final int maxMessageSize
    • keepAliveTimeInNanos

      private final long keepAliveTimeInNanos
    • keepAliveTimeoutInNanos

      private final long keepAliveTimeoutInNanos
    • maxConnectionAgeInNanos

      private final long maxConnectionAgeInNanos
    • maxConnectionAgeGraceInNanos

      private final long maxConnectionAgeGraceInNanos
    • maxRstCount

      private final int maxRstCount
    • maxRstPeriodNanos

      private final long maxRstPeriodNanos
    • streamTracerFactories

      private final List<? extends ServerStreamTracer.Factory> streamTracerFactories
    • transportTracer

      private final TransportTracer transportTracer
    • keepAliveEnforcer

      private final KeepAliveEnforcer keepAliveEnforcer
    • eagAttributes

      private final Attributes eagAttributes
    • ticker

      private final com.google.common.base.Ticker ticker
    • negotiationAttributes

      private Attributes negotiationAttributes
      Incomplete attributes produced by negotiator.
    • securityInfo

      private InternalChannelz.Security securityInfo
    • attributes

      private Attributes attributes
      Completed attributes produced by transportReady.
    • connectionError

      private Throwable connectionError
    • teWarningLogged

      private boolean teWarningLogged
    • serverWriteQueue

      private WriteQueue serverWriteQueue
    • lastKnownAuthority

      private io.netty.util.AsciiString lastKnownAuthority
    • keepAliveManager

      @CheckForNull private KeepAliveManager keepAliveManager
    • maxConnectionIdleManager

      @CheckForNull private MaxConnectionIdleManager maxConnectionIdleManager
    • maxConnectionAgeMonitor

      @CheckForNull private ScheduledFuture<?> maxConnectionAgeMonitor
    • gracefulShutdown

    • rstCount

      private int rstCount
    • lastRstNanoTime

      private long lastRstNanoTime
  • Constructor Details

    • NettyServerHandler

      private NettyServerHandler(io.netty.channel.ChannelPromise channelUnused, io.netty.handler.codec.http2.Http2Connection connection, ServerTransportListener transportListener, List<? extends ServerStreamTracer.Factory> streamTracerFactories, TransportTracer transportTracer, io.netty.handler.codec.http2.Http2ConnectionDecoder decoder, io.netty.handler.codec.http2.Http2ConnectionEncoder encoder, io.netty.handler.codec.http2.Http2Settings settings, int maxMessageSize, long keepAliveTimeInNanos, long keepAliveTimeoutInNanos, long maxConnectionIdleInNanos, long maxConnectionAgeInNanos, long maxConnectionAgeGraceInNanos, KeepAliveEnforcer keepAliveEnforcer, boolean autoFlowControl, int maxRstCount, long maxRstPeriodNanos, Attributes eagAttributes, com.google.common.base.Ticker ticker)
  • Method Details

    • newHandler

      static NettyServerHandler newHandler(ServerTransportListener transportListener, io.netty.channel.ChannelPromise channelUnused, List<? extends ServerStreamTracer.Factory> streamTracerFactories, TransportTracer transportTracer, int maxStreams, boolean autoFlowControl, int flowControlWindow, int maxHeaderListSize, int maxMessageSize, long keepAliveTimeInNanos, long keepAliveTimeoutInNanos, long maxConnectionIdleInNanos, long maxConnectionAgeInNanos, long maxConnectionAgeGraceInNanos, boolean permitKeepAliveWithoutCalls, long permitKeepAliveTimeInNanos, int maxRstCount, long maxRstPeriodNanos, Attributes eagAttributes)
    • newHandler

      static NettyServerHandler newHandler(io.netty.channel.ChannelPromise channelUnused, io.netty.handler.codec.http2.Http2FrameReader frameReader, io.netty.handler.codec.http2.Http2FrameWriter frameWriter, ServerTransportListener transportListener, List<? extends ServerStreamTracer.Factory> streamTracerFactories, TransportTracer transportTracer, int maxStreams, boolean autoFlowControl, int flowControlWindow, int maxHeaderListSize, int maxMessageSize, long keepAliveTimeInNanos, long keepAliveTimeoutInNanos, long maxConnectionIdleInNanos, long maxConnectionAgeInNanos, long maxConnectionAgeGraceInNanos, boolean permitKeepAliveWithoutCalls, long permitKeepAliveTimeInNanos, int maxRstCount, long maxRstPeriodNanos, Attributes eagAttributes, com.google.common.base.Ticker ticker)
    • connectionError

      @Nullable Throwable connectionError()
    • handlerAdded

      public void handlerAdded(io.netty.channel.ChannelHandlerContext ctx) throws Exception
      Specified by:
      handlerAdded in interface io.netty.channel.ChannelHandler
      Overrides:
      handlerAdded in class AbstractNettyHandler
      Throws:
      Exception
    • onHeadersRead

      private void onHeadersRead(io.netty.channel.ChannelHandlerContext ctx, int streamId, io.netty.handler.codec.http2.Http2Headers headers) throws io.netty.handler.codec.http2.Http2Exception
      Throws:
      io.netty.handler.codec.http2.Http2Exception
    • getOrUpdateAuthority

      private String getOrUpdateAuthority(io.netty.util.AsciiString authority)
    • onDataRead

      private void onDataRead(int streamId, io.netty.buffer.ByteBuf data, int padding, boolean endOfStream) throws io.netty.handler.codec.http2.Http2Exception
      Throws:
      io.netty.handler.codec.http2.Http2Exception
    • onRstStreamRead

      private void onRstStreamRead(int streamId, long errorCode) throws io.netty.handler.codec.http2.Http2Exception
      Throws:
      io.netty.handler.codec.http2.Http2Exception
    • onConnectionError

      protected void onConnectionError(io.netty.channel.ChannelHandlerContext ctx, boolean outbound, Throwable cause, io.netty.handler.codec.http2.Http2Exception http2Ex)
      Overrides:
      onConnectionError in class io.netty.handler.codec.http2.Http2ConnectionHandler
    • onStreamError

      protected void onStreamError(io.netty.channel.ChannelHandlerContext ctx, boolean outbound, Throwable cause, io.netty.handler.codec.http2.Http2Exception.StreamException http2Ex)
      Overrides:
      onStreamError in class io.netty.handler.codec.http2.Http2ConnectionHandler
    • handleProtocolNegotiationCompleted

      public void handleProtocolNegotiationCompleted(Attributes attrs, InternalChannelz.Security securityInfo)
      Description copied from class: GrpcHttp2ConnectionHandler
      Triggered on protocol negotiation completion.

      It must me called after negotiation is completed but before given handler is added to the channel.

      Overrides:
      handleProtocolNegotiationCompleted in class GrpcHttp2ConnectionHandler
      Parameters:
      attrs - arbitrary attributes passed after protocol negotiation (eg. SSLSession).
      securityInfo - informs channelz about the security protocol.
    • getEagAttributes

      public Attributes getEagAttributes()
      Description copied from class: GrpcHttp2ConnectionHandler
      Get the attributes of the EquivalentAddressGroup used to create this transport.
      Overrides:
      getEagAttributes in class GrpcHttp2ConnectionHandler
    • getSecurityInfo

      InternalChannelz.Security getSecurityInfo()
    • getKeepAliveManagerForTest

      KeepAliveManager getKeepAliveManagerForTest()
    • setKeepAliveManagerForTest

      void setKeepAliveManagerForTest(KeepAliveManager keepAliveManager)
    • channelInactive

      public void channelInactive(io.netty.channel.ChannelHandlerContext ctx) throws Exception
      Handler for the Channel shutting down.
      Specified by:
      channelInactive in interface io.netty.channel.ChannelInboundHandler
      Overrides:
      channelInactive in class io.netty.handler.codec.http2.Http2ConnectionHandler
      Throws:
      Exception
    • getWriteQueue

      WriteQueue getWriteQueue()
    • write

      public void write(io.netty.channel.ChannelHandlerContext ctx, Object msg, io.netty.channel.ChannelPromise promise) throws Exception
      Handler for commands sent from the stream.
      Specified by:
      write in interface io.netty.channel.ChannelOutboundHandler
      Overrides:
      write in class io.netty.handler.codec.http2.Http2ConnectionHandler
      Throws:
      Exception
    • close

      public void close(io.netty.channel.ChannelHandlerContext ctx, io.netty.channel.ChannelPromise promise) throws Exception
      Specified by:
      close in interface io.netty.channel.ChannelOutboundHandler
      Overrides:
      close in class io.netty.handler.codec.http2.Http2ConnectionHandler
      Throws:
      Exception
    • returnProcessedBytes

      void returnProcessedBytes(io.netty.handler.codec.http2.Http2Stream http2Stream, int bytes)
      Returns the given processed bytes back to inbound flow control.
    • closeStreamWhenDone

      private void closeStreamWhenDone(io.netty.channel.ChannelPromise promise, io.netty.handler.codec.http2.Http2Stream stream)
    • streamGone

      private static void streamGone(int streamId, io.netty.channel.ChannelPromise promise)
    • sendGrpcFrame

      private void sendGrpcFrame(io.netty.channel.ChannelHandlerContext ctx, SendGrpcFrameCommand cmd, io.netty.channel.ChannelPromise promise) throws io.netty.handler.codec.http2.Http2Exception
      Sends the given gRPC frame to the client.
      Throws:
      io.netty.handler.codec.http2.Http2Exception
    • sendResponseHeaders

      private void sendResponseHeaders(io.netty.channel.ChannelHandlerContext ctx, SendResponseHeadersCommand cmd, io.netty.channel.ChannelPromise promise) throws io.netty.handler.codec.http2.Http2Exception
      Sends the response headers to the client.
      Throws:
      io.netty.handler.codec.http2.Http2Exception
    • cancelStream

      private void cancelStream(io.netty.channel.ChannelHandlerContext ctx, CancelServerStreamCommand cmd, io.netty.channel.ChannelPromise promise)
    • shouldCloseStreamWithHeaders

      private static boolean shouldCloseStreamWithHeaders(CancelServerStreamCommand cmd, io.netty.handler.codec.http2.Http2Connection conn)
    • gracefulClose

      private void gracefulClose(io.netty.channel.ChannelHandlerContext ctx, GracefulServerCloseCommand msg, io.netty.channel.ChannelPromise promise) throws Exception
      Throws:
      Exception
    • forcefulClose

      private void forcefulClose(io.netty.channel.ChannelHandlerContext ctx, ForcefulCloseCommand msg, io.netty.channel.ChannelPromise promise) throws Exception
      Throws:
      Exception
    • respondWithHttpError

      private void respondWithHttpError(io.netty.channel.ChannelHandlerContext ctx, int streamId, int code, Status.Code statusCode, String msg)
    • requireHttp2Stream

      private io.netty.handler.codec.http2.Http2Stream requireHttp2Stream(int streamId)
    • serverStream

      private NettyServerStream.TransportState serverStream(io.netty.handler.codec.http2.Http2Stream stream)
      Returns the server stream associated to the given HTTP/2 stream object.
    • newStreamException

      private io.netty.handler.codec.http2.Http2Exception newStreamException(int streamId, Throwable cause)
    • toJavaLogLevel

      private static Level toJavaLogLevel(ChannelLogger.ChannelLogLevel level)