public class StompDecoder
extends java.lang.Object
ByteBuffer
.
An attempt is made to read all complete STOMP frames from the buffer, which could be zero, one, or more. If there is any left-over content, i.e. an incomplete STOMP frame, at the end the buffer is reset to point to the beginning of the partial content. The caller is then responsible for dealing with that incomplete content by buffering until there is more input available.
Modifier and Type | Field and Description |
---|---|
private static byte[] |
HEARTBEAT_PAYLOAD |
private Log |
logger |
private static java.nio.charset.Charset |
UTF8_CHARSET |
Constructor and Description |
---|
StompDecoder() |
Modifier and Type | Method and Description |
---|---|
java.util.List<Message<byte[]>> |
decode(java.nio.ByteBuffer buffer)
Decodes one or more STOMP frames from the given
ByteBuffer into a
list of Message s. |
java.util.List<Message<byte[]>> |
decode(java.nio.ByteBuffer buffer,
MultiValueMap<java.lang.String,java.lang.String> headers)
Decodes one or more STOMP frames from the given
buffer and returns
a list of Message s. |
private Message<byte[]> |
decodeMessage(java.nio.ByteBuffer buffer,
MultiValueMap<java.lang.String,java.lang.String> headers)
Decode a single STOMP frame from the given
buffer into a Message . |
protected java.lang.Integer |
getContentLength(MultiValueMap<java.lang.String,java.lang.String> headers) |
private java.lang.String |
readCommand(java.nio.ByteBuffer buffer) |
private void |
readHeaders(java.nio.ByteBuffer buffer,
MultiValueMap<java.lang.String,java.lang.String> headers) |
private byte[] |
readPayload(java.nio.ByteBuffer buffer,
MultiValueMap<java.lang.String,java.lang.String> headers) |
protected void |
skipLeadingEol(java.nio.ByteBuffer buffer)
Skip one ore more EOL characters at the start of the given ByteBuffer.
|
private boolean |
tryConsumeEndOfLine(java.nio.ByteBuffer buffer)
Try to read an EOL incrementing the buffer position if successful.
|
private java.lang.String |
unescape(java.lang.String inString)
See STOMP Spec 1.2:
"Value Encoding".
|
private static final java.nio.charset.Charset UTF8_CHARSET
private static final byte[] HEARTBEAT_PAYLOAD
private final Log logger
public java.util.List<Message<byte[]>> decode(java.nio.ByteBuffer buffer)
ByteBuffer
into a
list of Message
s. If the input buffer contains any incplcontains partial STOMP frame content, or additional
content with a partial STOMP frame, the buffer is reset and null
is
returned.buffer
- The buffer to decode the STOMP frame frompublic java.util.List<Message<byte[]>> decode(java.nio.ByteBuffer buffer, MultiValueMap<java.lang.String,java.lang.String> headers)
buffer
and returns
a list of Message
s.
If the given ByteBuffer contains only partial STOMP frame content and no complete STOMP frames, an empty list is returned, and the buffer is reset to to where it was.
If the buffer contains one ore more STOMP frames, those are returned and the buffer reset to point to the beginning of the unused partial content.
The input headers map is used to store successfully parsed headers and is cleared after ever successfully read message. So when partial content is read the caller can check if a "content-length" header was read, which helps to determine how much more content is needed before the next STOMP frame can be decoded.
buffer
- The buffer to decode the STOMP frame fromheaders
- an empty map that will contain successfully parsed headers
in cases where the partial buffer ended with a partial STOMP frameStompConversionException
- raised in case of decoding issuesprivate Message<byte[]> decodeMessage(java.nio.ByteBuffer buffer, MultiValueMap<java.lang.String,java.lang.String> headers)
buffer
into a Message
.protected void skipLeadingEol(java.nio.ByteBuffer buffer)
private java.lang.String readCommand(java.nio.ByteBuffer buffer)
private void readHeaders(java.nio.ByteBuffer buffer, MultiValueMap<java.lang.String,java.lang.String> headers)
private java.lang.String unescape(java.lang.String inString)
private byte[] readPayload(java.nio.ByteBuffer buffer, MultiValueMap<java.lang.String,java.lang.String> headers)
protected java.lang.Integer getContentLength(MultiValueMap<java.lang.String,java.lang.String> headers)
private boolean tryConsumeEndOfLine(java.nio.ByteBuffer buffer)