Class MessageDeframer

java.lang.Object
io.grpc.internal.MessageDeframer
All Implemented Interfaces:
Deframer, Closeable, AutoCloseable

@NotThreadSafe public class MessageDeframer extends Object implements Closeable, Deframer
Deframer for GRPC frames.

This class is not thread-safe. Unless otherwise stated, all calls to public methods should be made in the deframing thread.

  • Field Details

    • HEADER_LENGTH

      private static final int HEADER_LENGTH
      See Also:
    • COMPRESSED_FLAG_MASK

      private static final int COMPRESSED_FLAG_MASK
      See Also:
    • RESERVED_MASK

      private static final int RESERVED_MASK
      See Also:
    • MAX_BUFFER_SIZE

      private static final int MAX_BUFFER_SIZE
      See Also:
    • listener

      private MessageDeframer.Listener listener
    • maxInboundMessageSize

      private int maxInboundMessageSize
    • statsTraceCtx

      private final StatsTraceContext statsTraceCtx
    • transportTracer

      private final TransportTracer transportTracer
    • decompressor

      private Decompressor decompressor
    • fullStreamDecompressor

      private GzipInflatingBuffer fullStreamDecompressor
    • inflatedBuffer

      private byte[] inflatedBuffer
    • inflatedIndex

      private int inflatedIndex
    • state

      private MessageDeframer.State state
    • requiredLength

      private int requiredLength
    • compressedFlag

      private boolean compressedFlag
    • nextFrame

      private CompositeReadableBuffer nextFrame
    • unprocessed

      private CompositeReadableBuffer unprocessed
    • pendingDeliveries

      private long pendingDeliveries
    • inDelivery

      private boolean inDelivery
    • currentMessageSeqNo

      private int currentMessageSeqNo
    • inboundBodyWireSize

      private int inboundBodyWireSize
    • closeWhenComplete

      private boolean closeWhenComplete
    • stopDelivery

      private volatile boolean stopDelivery
  • Constructor Details

    • MessageDeframer

      public MessageDeframer(MessageDeframer.Listener listener, Decompressor decompressor, int maxMessageSize, StatsTraceContext statsTraceCtx, TransportTracer transportTracer)
      Create a deframer.
      Parameters:
      listener - listener for deframer events.
      decompressor - the compression used if a compressed frame is encountered, with NONE meaning unsupported
      maxMessageSize - the maximum allowed size for received messages.
  • Method Details

    • setListener

      void setListener(MessageDeframer.Listener listener)
    • setMaxInboundMessageSize

      public void setMaxInboundMessageSize(int messageSize)
      Specified by:
      setMaxInboundMessageSize in interface Deframer
    • setDecompressor

      public void setDecompressor(Decompressor decompressor)
      Description copied from interface: Deframer
      Sets the decompressor available to use. The message encoding for the stream comes later in time, and thus will not be available at the time of construction. This should only be set once, since the compression codec cannot change after the headers have been sent.
      Specified by:
      setDecompressor in interface Deframer
      Parameters:
      decompressor - the decompressing wrapper.
    • setFullStreamDecompressor

      public void setFullStreamDecompressor(GzipInflatingBuffer fullStreamDecompressor)
      Description copied from interface: Deframer
      Sets the decompressor used for full-stream decompression. Full-stream decompression disables any per-message decompressor set by Deframer.setDecompressor(io.grpc.Decompressor).
      Specified by:
      setFullStreamDecompressor in interface Deframer
      Parameters:
      fullStreamDecompressor - the decompressing wrapper
    • request

      public void request(int numMessages)
      Description copied from interface: Deframer
      Requests up to the given number of messages from the call. No additional messages will be delivered.

      If Deframer.close() has been called, this method will have no effect.

      Specified by:
      request in interface Deframer
      Parameters:
      numMessages - the requested number of messages to be delivered to the listener.
    • deframe

      public void deframe(ReadableBuffer data)
      Description copied from interface: Deframer
      Adds the given data to this deframer and attempts delivery to the listener.
      Specified by:
      deframe in interface Deframer
      Parameters:
      data - the raw data read from the remote endpoint. Must be non-null.
    • closeWhenComplete

      public void closeWhenComplete()
      Description copied from interface: Deframer
      Close when any messages currently queued have been requested and delivered.
      Specified by:
      closeWhenComplete in interface Deframer
    • stopDelivery

      void stopDelivery()
      Sets a flag to interrupt delivery of any currently queued messages. This may be invoked outside of the deframing thread, and must be followed by a call to close() in the deframing thread. Without a subsequent call to close(), the deframer may hang waiting for additional messages before noticing that the stopDelivery flag has been set.
    • hasPendingDeliveries

      boolean hasPendingDeliveries()
    • close

      public void close()
      Description copied from interface: Deframer
      Closes this deframer and frees any resources. After this method is called, additional calls will have no effect.
      Specified by:
      close in interface AutoCloseable
      Specified by:
      close in interface Closeable
      Specified by:
      close in interface Deframer
    • isClosed

      public boolean isClosed()
      Indicates whether or not this deframer has been closed.
    • isClosedOrScheduledToClose

      private boolean isClosedOrScheduledToClose()
      Returns true if this deframer has already been closed or scheduled to close.
    • isStalled

      private boolean isStalled()
    • deliver

      private void deliver()
      Reads and delivers as many messages to the listener as possible.
    • readRequiredBytes

      private boolean readRequiredBytes()
      Attempts to read the required bytes into nextFrame.
      Returns:
      true if all of the required bytes have been read.
    • processHeader

      private void processHeader()
      Processes the GRPC compression header which is composed of the compression flag and the outer frame length.
    • processBody

      private void processBody()
      Processes the GRPC message body, which depending on frame header flags may be compressed.
    • getUncompressedBody

      private InputStream getUncompressedBody()
    • getCompressedBody

      private InputStream getCompressedBody()