@Override protected MessageHeaderAccessor createAccessor(Message<?> message) { return wrap(message); }
public MessageExchangeBuilder(Message<?> message) { this.message = message; this.headers = StompHeaderAccessor.wrap(message); }
protected StompHeaderAccessor toMutableAccessor(StompHeaderAccessor headerAccessor, Message<?> message) { return (headerAccessor.isMutable() ? headerAccessor : StompHeaderAccessor.wrap(message)); }
@Override @Nullable public Message<byte[]> handleErrorMessageToClient(Message<byte[]> errorMessage) { StompHeaderAccessor accessor = MessageHeaderAccessor.getAccessor(errorMessage, StompHeaderAccessor.class); Assert.notNull(accessor, "No StompHeaderAccessor"); if (!accessor.isMutable()) { accessor = StompHeaderAccessor.wrap(errorMessage); } return handleInternal(accessor, errorMessage.getPayload(), null, null); }
@Test public void decodeMultipleFramesFromSameBuffer() { String frame1 = "SEND\ndestination:test\n\nThe body of the message\0"; String frame2 = "DISCONNECT\n\n\0"; ByteBuffer buffer = ByteBuffer.wrap((frame1 + frame2).getBytes()); final List<Message<byte[]>> messages = decoder.decode(buffer); assertEquals(2, messages.size()); assertEquals(StompCommand.SEND, StompHeaderAccessor.wrap(messages.get(0)).getCommand()); assertEquals(StompCommand.DISCONNECT, StompHeaderAccessor.wrap(messages.get(1)).getCommand()); }
@Test public void decodeHeartbeat() { String frame = "\n"; ByteBuffer buffer = ByteBuffer.wrap(frame.getBytes()); final List<Message<byte[]>> messages = decoder.decode(buffer); assertEquals(1, messages.size()); assertEquals(SimpMessageType.HEARTBEAT, StompHeaderAccessor.wrap(messages.get(0)).getMessageType()); }
@Override public final boolean match(Message<?> message) { StompHeaderAccessor headers = StompHeaderAccessor.wrap(message); if (!this.command.equals(headers.getCommand()) || (this.sessionId != headers.getSessionId())) { return false; } return matchInternal(headers, message.getPayload()); }
@Test public void decodeFrameWithContentLength() { Message<byte[]> message = decode("SEND\ncontent-length:23\n\nThe body of the message\0"); StompHeaderAccessor headers = StompHeaderAccessor.wrap(message); assertEquals(StompCommand.SEND, headers.getCommand()); assertEquals(1, headers.toNativeHeaderMap().size()); assertEquals(Integer.valueOf(23), headers.getContentLength()); String bodyText = new String(message.getPayload()); assertEquals("The body of the message", bodyText); }
@Test public void decodeFrameWithInvalidContentLength() { Message<byte[]> message = decode("SEND\ncontent-length:-1\n\nThe body of the message\0"); StompHeaderAccessor headers = StompHeaderAccessor.wrap(message); assertEquals(StompCommand.SEND, headers.getCommand()); assertEquals(1, headers.toNativeHeaderMap().size()); assertEquals(Integer.valueOf(-1), headers.getContentLength()); String bodyText = new String(message.getPayload()); assertEquals("The body of the message", bodyText); }
@Test public void decodeFrameWithContentLengthZero() { Message<byte[]> frame = decode("SEND\ncontent-length:0\n\n\0"); StompHeaderAccessor headers = StompHeaderAccessor.wrap(frame); assertEquals(StompCommand.SEND, headers.getCommand()); assertEquals(1, headers.toNativeHeaderMap().size()); assertEquals(Integer.valueOf(0), headers.getContentLength()); String bodyText = new String(frame.getPayload()); assertEquals("", bodyText); }
@Test public void decodeFrameWithNullOctectsInTheBody() { Message<byte[]> frame = decode("SEND\ncontent-length:23\n\nThe b\0dy \0f the message\0"); StompHeaderAccessor headers = StompHeaderAccessor.wrap(frame); assertEquals(StompCommand.SEND, headers.getCommand()); assertEquals(1, headers.toNativeHeaderMap().size()); assertEquals(Integer.valueOf(23), headers.getContentLength()); String bodyText = new String(frame.getPayload()); assertEquals("The b\0dy \0f the message", bodyText); }
@Test public void decodeFrameWithCrLfEols() { Message<byte[]> frame = decode("DISCONNECT\r\n\r\n\0"); StompHeaderAccessor headers = StompHeaderAccessor.wrap(frame); assertEquals(StompCommand.DISCONNECT, headers.getCommand()); assertEquals(0, headers.toNativeHeaderMap().size()); assertEquals(0, frame.getPayload().length); }
@Test public void decodeFrameWithNoHeadersAndNoBody() { Message<byte[]> frame = decode("DISCONNECT\n\n\0"); StompHeaderAccessor headers = StompHeaderAccessor.wrap(frame); assertEquals(StompCommand.DISCONNECT, headers.getCommand()); assertEquals(0, headers.toNativeHeaderMap().size()); assertEquals(0, frame.getPayload().length); }
@Test public void decodeFrame() throws UnsupportedEncodingException { Message<byte[]> frame = decode("SEND\ndestination:test\n\nThe body of the message\0"); StompHeaderAccessor headers = StompHeaderAccessor.wrap(frame); assertEquals(StompCommand.SEND, headers.getCommand()); assertEquals(headers.toNativeHeaderMap().toString(), 1, headers.toNativeHeaderMap().size()); assertEquals("test", headers.getDestination()); String bodyText = new String(frame.getPayload()); assertEquals("The body of the message", bodyText); }
@Test public void toNativeHeadersContentType() { SimpMessageHeaderAccessor simpHeaderAccessor = SimpMessageHeaderAccessor.create(); simpHeaderAccessor.setContentType(MimeType.valueOf("application/atom+xml")); Message<byte[]> message = MessageBuilder.createMessage(new byte[0], simpHeaderAccessor.getMessageHeaders()); StompHeaderAccessor stompHeaderAccessor = StompHeaderAccessor.wrap(message); Map<String, List<String>> map = stompHeaderAccessor.toNativeHeaderMap(); assertEquals("application/atom+xml", map.get(StompHeaderAccessor.STOMP_CONTENT_TYPE_HEADER).get(0)); }
@Test public void brokerChannelUsedByAnnotatedMethod() { ApplicationContext context = loadConfig(SimpleBrokerConfig.class); TestChannel channel = context.getBean("brokerChannel", TestChannel.class); SimpAnnotationMethodMessageHandler messageHandler = context.getBean(SimpAnnotationMethodMessageHandler.class); StompHeaderAccessor headers = StompHeaderAccessor.create(StompCommand.SEND); headers.setSessionId("sess1"); headers.setSessionAttributes(new ConcurrentHashMap<>()); headers.setDestination("/foo"); Message<?> message = MessageBuilder.createMessage(new byte[0], headers.getMessageHeaders()); messageHandler.handleMessage(message); message = channel.messages.get(0); headers = StompHeaderAccessor.wrap(message); assertEquals(SimpMessageType.MESSAGE, headers.getMessageType()); assertEquals("/bar", headers.getDestination()); assertEquals("bar", new String((byte[]) message.getPayload())); }
@Test public void decodeFrameWithEscapedHeaders() { Message<byte[]> frame = decode("DISCONNECT\na\\c\\r\\n\\\\b:alpha\\cbravo\\r\\n\\\\\n\n\0"); StompHeaderAccessor headers = StompHeaderAccessor.wrap(frame); assertEquals(StompCommand.DISCONNECT, headers.getCommand()); assertEquals(1, headers.toNativeHeaderMap().size()); assertEquals("alpha:bravo\r\n\\", headers.getFirstNativeHeader("a:\r\n\\b")); }
@Test public void decodeFrameWithHeaderWithEmptyValue() { String accept = "accept-version:1.1\n"; String valuelessKey = "key:\n"; Message<byte[]> frame = decode("CONNECT\n" + accept + valuelessKey + "\n\0"); StompHeaderAccessor headers = StompHeaderAccessor.wrap(frame); assertEquals(StompCommand.CONNECT, headers.getCommand()); assertEquals(2, headers.toNativeHeaderMap().size()); assertEquals("1.1", headers.getFirstNativeHeader("accept-version")); assertEquals("", headers.getFirstNativeHeader("key")); assertEquals(0, frame.getPayload().length); }
@Test public void decodeFrameWithNoBody() { String accept = "accept-version:1.1\n"; String host = "host:github.org\n"; Message<byte[]> frame = decode("CONNECT\n" + accept + host + "\n\0"); StompHeaderAccessor headers = StompHeaderAccessor.wrap(frame); assertEquals(StompCommand.CONNECT, headers.getCommand()); assertEquals(2, headers.toNativeHeaderMap().size()); assertEquals("1.1", headers.getFirstNativeHeader("accept-version")); assertEquals("github.org", headers.getHost()); assertEquals(0, frame.getPayload().length); }
@Test public void clientOutboundChannelUsedByAnnotatedMethod() { ApplicationContext context = loadConfig(SimpleBrokerConfig.class); TestChannel channel = context.getBean("clientOutboundChannel", TestChannel.class); SimpAnnotationMethodMessageHandler messageHandler = context.getBean(SimpAnnotationMethodMessageHandler.class); StompHeaderAccessor headers = StompHeaderAccessor.create(StompCommand.SUBSCRIBE); headers.setSessionId("sess1"); headers.setSessionAttributes(new ConcurrentHashMap<>()); headers.setSubscriptionId("subs1"); headers.setDestination("/foo"); Message<?> message = MessageBuilder.withPayload(new byte[0]).setHeaders(headers).build(); messageHandler.handleMessage(message); message = channel.messages.get(0); headers = StompHeaderAccessor.wrap(message); assertEquals(SimpMessageType.MESSAGE, headers.getMessageType()); assertEquals("/foo", headers.getDestination()); assertEquals("bar", new String((byte[]) message.getPayload())); }