/** A constructor for creating message headers from a parsed STOMP frame. */ StompHeaderAccessor(StompCommand command, Map<String, List<String>> externalSourceHeaders) { super(command.getMessageType(), externalSourceHeaders); setHeader(COMMAND_HEADER, command); updateSimpMessageHeadersFromStompHeaders(); }
/** Decode a single STOMP frame from the given {@code buffer} into a {@link Message}. */ private Message<byte[]> decodeMessage(ByteBuffer buffer, MultiValueMap<String, String> headers) { Message<byte[]> decodedMessage = null; skipLeadingEol(buffer); buffer.mark(); String command = readCommand(buffer); if (command.length() > 0) { StompHeaderAccessor headerAccessor = null; byte[] payload = null; if (buffer.remaining() > 0) { StompCommand stompCommand = StompCommand.valueOf(command); headerAccessor = StompHeaderAccessor.create(stompCommand); initHeaders(headerAccessor); readHeaders(buffer, headerAccessor); payload = readPayload(buffer, headerAccessor); } if (payload != null) { if ((payload.length > 0) && (!headerAccessor.getCommand().isBodyAllowed())) { throw new StompConversionException( headerAccessor.getCommand() + " shouldn't have a payload: length=" + payload.length + ", headers=" + headers); } headerAccessor.updateSimpMessageHeadersFromStompHeaders(); headerAccessor.setLeaveMutable(true); decodedMessage = MessageBuilder.createMessage(payload, headerAccessor.getMessageHeaders()); if (logger.isDebugEnabled()) { logger.debug("Decoded " + decodedMessage); } } else { if (logger.isTraceEnabled()) { logger.trace("Received incomplete frame. Resetting buffer."); } if (headers != null && headerAccessor != null) { String name = NativeMessageHeaderAccessor.NATIVE_HEADERS; @SuppressWarnings("unchecked") MultiValueMap<String, String> map = (MultiValueMap<String, String>) headerAccessor.getHeader(name); if (map != null) { headers.putAll(map); } } buffer.reset(); } } else { if (logger.isTraceEnabled()) { logger.trace("Decoded heartbeat"); } StompHeaderAccessor headerAccessor = StompHeaderAccessor.createForHeartbeat(); initHeaders(headerAccessor); headerAccessor.setLeaveMutable(true); decodedMessage = MessageBuilder.createMessage(HEARTBEAT_PAYLOAD, headerAccessor.getMessageHeaders()); } return decodedMessage; }