Package io.grpc.internal
Class MessageDeframer
- java.lang.Object
-
- io.grpc.internal.MessageDeframer
-
- All Implemented Interfaces:
Deframer,java.io.Closeable,java.lang.AutoCloseable
@NotThreadSafe public class MessageDeframer extends java.lang.Object implements java.io.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.
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static interfaceMessageDeframer.ListenerA listener of deframing events.private static classMessageDeframer.SingleMessageProducer(package private) static classMessageDeframer.SizeEnforcingInputStreamAnInputStreamthat enforces theMessageDeframer.SizeEnforcingInputStream.maxMessageSizelimit for compressed frames.private static classMessageDeframer.State
-
Field Summary
Fields Modifier and Type Field Description private booleancloseWhenCompleteprivate static intCOMPRESSED_FLAG_MASKprivate booleancompressedFlagprivate intcurrentMessageSeqNoprivate Decompressordecompressorprivate GzipInflatingBufferfullStreamDecompressorprivate static intHEADER_LENGTHprivate intinboundBodyWireSizeprivate booleaninDeliveryprivate byte[]inflatedBufferprivate intinflatedIndexprivate MessageDeframer.Listenerlistenerprivate static intMAX_BUFFER_SIZEprivate intmaxInboundMessageSizeprivate CompositeReadableBuffernextFrameprivate longpendingDeliveriesprivate intrequiredLengthprivate static intRESERVED_MASKprivate MessageDeframer.Statestateprivate StatsTraceContextstatsTraceCtxprivate booleanstopDeliveryprivate TransportTracertransportTracerprivate CompositeReadableBufferunprocessed
-
Constructor Summary
Constructors Constructor Description MessageDeframer(MessageDeframer.Listener listener, Decompressor decompressor, int maxMessageSize, StatsTraceContext statsTraceCtx, TransportTracer transportTracer)Create a deframer.
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description voidclose()Closes this deframer and frees any resources.voidcloseWhenComplete()Close when any messages currently queued have been requested and delivered.voiddeframe(ReadableBuffer data)Adds the given data to this deframer and attempts delivery to the listener.private voiddeliver()Reads and delivers as many messages to the listener as possible.private java.io.InputStreamgetCompressedBody()private java.io.InputStreamgetUncompressedBody()(package private) booleanhasPendingDeliveries()booleanisClosed()Indicates whether or not this deframer has been closed.private booleanisClosedOrScheduledToClose()Returns true if this deframer has already been closed or scheduled to close.private booleanisStalled()private voidprocessBody()Processes the GRPC message body, which depending on frame header flags may be compressed.private voidprocessHeader()Processes the GRPC compression header which is composed of the compression flag and the outer frame length.private booleanreadRequiredBytes()Attempts to read the required bytes into nextFrame.voidrequest(int numMessages)Requests up to the given number of messages from the call.voidsetDecompressor(Decompressor decompressor)Sets the decompressor available to use.voidsetFullStreamDecompressor(GzipInflatingBuffer fullStreamDecompressor)Sets the decompressor used for full-stream decompression.(package private) voidsetListener(MessageDeframer.Listener listener)voidsetMaxInboundMessageSize(int messageSize)(package private) voidstopDelivery()Sets a flag to interrupt delivery of any currently queued messages.
-
-
-
Field Detail
-
HEADER_LENGTH
private static final int HEADER_LENGTH
- See Also:
- Constant Field Values
-
COMPRESSED_FLAG_MASK
private static final int COMPRESSED_FLAG_MASK
- See Also:
- Constant Field Values
-
RESERVED_MASK
private static final int RESERVED_MASK
- See Also:
- Constant Field Values
-
MAX_BUFFER_SIZE
private static final int MAX_BUFFER_SIZE
- See Also:
- Constant Field Values
-
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 Detail
-
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, withNONEmeaning unsupportedmaxMessageSize- the maximum allowed size for received messages.
-
-
Method Detail
-
setListener
void setListener(MessageDeframer.Listener listener)
-
setMaxInboundMessageSize
public void setMaxInboundMessageSize(int messageSize)
- Specified by:
setMaxInboundMessageSizein interfaceDeframer
-
setDecompressor
public void setDecompressor(Decompressor decompressor)
Description copied from interface:DeframerSets 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:
setDecompressorin interfaceDeframer- Parameters:
decompressor- the decompressing wrapper.
-
setFullStreamDecompressor
public void setFullStreamDecompressor(GzipInflatingBuffer fullStreamDecompressor)
Description copied from interface:DeframerSets the decompressor used for full-stream decompression. Full-stream decompression disables any per-message decompressor set byDeframer.setDecompressor(io.grpc.Decompressor).- Specified by:
setFullStreamDecompressorin interfaceDeframer- Parameters:
fullStreamDecompressor- the decompressing wrapper
-
request
public void request(int numMessages)
Description copied from interface:DeframerRequests 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
public void deframe(ReadableBuffer data)
Description copied from interface:DeframerAdds the given data to this deframer and attempts delivery to the listener.
-
closeWhenComplete
public void closeWhenComplete()
Description copied from interface:DeframerClose when any messages currently queued have been requested and delivered.- Specified by:
closeWhenCompletein 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 thestopDeliveryflag has been set.
-
hasPendingDeliveries
boolean hasPendingDeliveries()
-
close
public void close()
Description copied from interface:DeframerCloses 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:
trueif 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 java.io.InputStream getUncompressedBody()
-
getCompressedBody
private java.io.InputStream getCompressedBody()
-
-