Package io.grpc.internal
Class MessageDeframer
java.lang.Object
io.grpc.internal.MessageDeframer
- All Implemented Interfaces:
Deframer
,Closeable
,AutoCloseable
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.
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionstatic interface
A listener of deframing events.private static class
(package private) static final class
AnInputStream
that enforces theMessageDeframer.SizeEnforcingInputStream.maxMessageSize
limit for compressed frames.private static enum
-
Field Summary
FieldsModifier and TypeFieldDescriptionprivate boolean
private static final int
private boolean
private int
private Decompressor
private GzipInflatingBuffer
private static final int
private int
private boolean
private byte[]
private int
private MessageDeframer.Listener
private static final int
private int
private CompositeReadableBuffer
private long
private int
private static final int
private MessageDeframer.State
private final StatsTraceContext
private boolean
private final TransportTracer
private CompositeReadableBuffer
-
Constructor Summary
ConstructorsConstructorDescriptionMessageDeframer
(MessageDeframer.Listener listener, Decompressor decompressor, int maxMessageSize, StatsTraceContext statsTraceCtx, TransportTracer transportTracer) Create a deframer. -
Method Summary
Modifier and TypeMethodDescriptionvoid
close()
Closes this deframer and frees any resources.void
Close when any messages currently queued have been requested and delivered.void
deframe
(ReadableBuffer data) Adds the given data to this deframer and attempts delivery to the listener.private void
deliver()
Reads and delivers as many messages to the listener as possible.private InputStream
private InputStream
(package private) boolean
boolean
isClosed()
Indicates whether or not this deframer has been closed.private boolean
Returns true if this deframer has already been closed or scheduled to close.private boolean
private void
Processes the GRPC message body, which depending on frame header flags may be compressed.private void
Processes the GRPC compression header which is composed of the compression flag and the outer frame length.private boolean
Attempts to read the required bytes into nextFrame.void
request
(int numMessages) Requests up to the given number of messages from the call.void
setDecompressor
(Decompressor decompressor) Sets the decompressor available to use.void
setFullStreamDecompressor
(GzipInflatingBuffer fullStreamDecompressor) Sets the decompressor used for full-stream decompression.(package private) void
setListener
(MessageDeframer.Listener listener) void
setMaxInboundMessageSize
(int messageSize) (package private) void
Sets a flag to interrupt delivery of any currently queued messages.
-
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
-
maxInboundMessageSize
private int maxInboundMessageSize -
statsTraceCtx
-
transportTracer
-
decompressor
-
fullStreamDecompressor
-
inflatedBuffer
private byte[] inflatedBuffer -
inflatedIndex
private int inflatedIndex -
state
-
requiredLength
private int requiredLength -
compressedFlag
private boolean compressedFlag -
nextFrame
-
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, withNONE
meaning unsupportedmaxMessageSize
- the maximum allowed size for received messages.
-
-
Method Details
-
setListener
-
setMaxInboundMessageSize
public void setMaxInboundMessageSize(int messageSize) - Specified by:
setMaxInboundMessageSize
in interfaceDeframer
-
setDecompressor
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 interfaceDeframer
- Parameters:
decompressor
- the decompressing wrapper.
-
setFullStreamDecompressor
Description copied from interface:Deframer
Sets the decompressor used for full-stream decompression. Full-stream decompression disables any per-message decompressor set byDeframer.setDecompressor(io.grpc.Decompressor)
.- Specified by:
setFullStreamDecompressor
in interfaceDeframer
- 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. -
deframe
Description copied from interface:Deframer
Adds the given data to this deframer and attempts delivery to the listener. -
closeWhenComplete
public void closeWhenComplete()Description copied from interface:Deframer
Close when any messages currently queued have been requested and delivered.- Specified by:
closeWhenComplete
in interfaceDeframer
-
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 toclose()
in the deframing thread. Without a subsequent call toclose()
, the deframer may hang waiting for additional messages before noticing that thestopDelivery
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. -
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
-
getCompressedBody
-