protected ByteBuffer encodeInternal(Message<byte[]> message) { return ByteBuffer.wrap(this.encoder.encode(message)); }
@Test public void encodeConnectWithLoginAndPasscode() throws UnsupportedEncodingException { MultiValueMap<String, String> extHeaders = new LinkedMultiValueMap<>(); extHeaders.add(StompHeaderAccessor.STOMP_LOGIN_HEADER, "joe"); extHeaders.add(StompHeaderAccessor.STOMP_PASSCODE_HEADER, "joe123"); StompHeaderAccessor headerAccessor = StompHeaderAccessor.create(StompCommand.CONNECT, extHeaders); Message<byte[]> message = MessageBuilder.createMessage(new byte[0], headerAccessor.getMessageHeaders()); byte[] bytes = new StompEncoder().encode(message); assertEquals("CONNECT\nlogin:joe\npasscode:joe123\n\n\0", new String(bytes, "UTF-8")); }
byte[] encodedKey = encodeHeaderKey(entry.getKey(), shouldEscape); for (String value : values) { output.write(encodedKey); output.write(COLON); output.write(encodeHeaderValue(value, shouldEscape)); output.write(LF);
writeHeaders(command, headers, payload, output); output.write(LF); writeBody(payload, output); output.write((byte) 0);
public StompReactorNettyCodec(StompDecoder decoder) { this(decoder, new StompEncoder()); }
private byte[] encodeHeaderValue(String input, boolean escape) { String inputToUse = (escape ? escape(input) : input); return inputToUse.getBytes(StandardCharsets.UTF_8); }
/** * See STOMP Spec 1.2: * <a href="http://stomp.github.io/stomp-specification-1.2.html#Value_Encoding">"Value Encoding"</a>. */ private String escape(String inString) { StringBuilder sb = null; for (int i = 0; i < inString.length(); i++) { char c = inString.charAt(i); if (c == '\\') { sb = getStringBuilder(sb, inString, i); sb.append("\\\\"); } else if (c == ':') { sb = getStringBuilder(sb, inString, i); sb.append("\\c"); } else if (c == '\n') { sb = getStringBuilder(sb, inString, i); sb.append("\\n"); } else if (c == '\r') { sb = getStringBuilder(sb, inString, i); sb.append("\\r"); } else if (sb != null){ sb.append(c); } } return (sb != null ? sb.toString() : inString); }
public StompReactorNettyCodec(StompDecoder decoder) { this(decoder, new StompEncoder()); }
writeHeaders(command, headers, payload, output); output.write(LF); writeBody(payload, output); output.write((byte) 0);
private byte[] encodeHeaderKey(String input, boolean escape) { String inputToUse = (escape ? escape(input) : input); if (this.headerKeyAccessCache.containsKey(inputToUse)) { return this.headerKeyAccessCache.get(inputToUse); } synchronized (this.headerKeyUpdateCache) { byte[] bytes = this.headerKeyUpdateCache.get(inputToUse); if (bytes == null) { bytes = inputToUse.getBytes(StandardCharsets.UTF_8); this.headerKeyAccessCache.put(inputToUse, bytes); this.headerKeyUpdateCache.put(inputToUse, bytes); } return bytes; } }
/** * See STOMP Spec 1.2: * <a href="http://stomp.github.io/stomp-specification-1.2.html#Value_Encoding">"Value Encoding"</a>. */ private String escape(String inString) { StringBuilder sb = null; for (int i = 0; i < inString.length(); i++) { char c = inString.charAt(i); if (c == '\\') { sb = getStringBuilder(sb, inString, i); sb.append("\\\\"); } else if (c == ':') { sb = getStringBuilder(sb, inString, i); sb.append("\\c"); } else if (c == '\n') { sb = getStringBuilder(sb, inString, i); sb.append("\\n"); } else if (c == '\r') { sb = getStringBuilder(sb, inString, i); sb.append("\\r"); } else if (sb != null){ sb.append(c); } } return (sb != null ? sb.toString() : inString); }
/** * Encodes the given STOMP {@code message} into a {@code byte[]}. * @param message the message to encode * @return the encoded message */ public byte[] encode(Message<byte[]> message) { return encode(message.getHeaders(), message.getPayload()); }
@Test public void eventPublication() { TestPublisher publisher = new TestPublisher(); this.protocolHandler.setApplicationEventPublisher(publisher); this.protocolHandler.afterSessionStarted(this.session, this.channel); StompHeaderAccessor headers = StompHeaderAccessor.create(StompCommand.CONNECT); Message<byte[]> message = MessageBuilder.createMessage(EMPTY_PAYLOAD, headers.getMessageHeaders()); TextMessage textMessage = new TextMessage(new StompEncoder().encode(message)); this.protocolHandler.handleMessageFromClient(this.session, textMessage, this.channel); headers = StompHeaderAccessor.create(StompCommand.CONNECTED); message = MessageBuilder.createMessage(EMPTY_PAYLOAD, headers.getMessageHeaders()); this.protocolHandler.handleMessageToClient(this.session, message); headers = StompHeaderAccessor.create(StompCommand.SUBSCRIBE); message = MessageBuilder.createMessage(EMPTY_PAYLOAD, headers.getMessageHeaders()); textMessage = new TextMessage(new StompEncoder().encode(message)); this.protocolHandler.handleMessageFromClient(this.session, textMessage, this.channel); headers = StompHeaderAccessor.create(StompCommand.UNSUBSCRIBE); message = MessageBuilder.createMessage(EMPTY_PAYLOAD, headers.getMessageHeaders()); textMessage = new TextMessage(new StompEncoder().encode(message)); this.protocolHandler.handleMessageFromClient(this.session, textMessage, this.channel); this.protocolHandler.afterSessionEnded(this.session, CloseStatus.BAD_DATA, this.channel); assertEquals("Unexpected events " + publisher.events, 5, publisher.events.size()); assertEquals(SessionConnectEvent.class, publisher.events.get(0).getClass()); assertEquals(SessionConnectedEvent.class, publisher.events.get(1).getClass()); assertEquals(SessionSubscribeEvent.class, publisher.events.get(2).getClass()); assertEquals(SessionUnsubscribeEvent.class, publisher.events.get(3).getClass()); assertEquals(SessionDisconnectEvent.class, publisher.events.get(4).getClass()); }
public StompReactorNettyCodec(StompDecoder decoder) { this(decoder, new StompEncoder()); }
writeHeaders(command, headers, payload, output); output.write(LF); writeBody(payload, output); output.write((byte) 0);
byte[] encodedKey = encodeHeaderKey(entry.getKey(), shouldEscape); for (String value : values) { output.write(encodedKey); output.write(COLON); output.write(encodeHeaderValue(value, shouldEscape)); output.write(LF);
private byte[] encodeHeaderValue(String input, boolean escape) { String inputToUse = (escape ? escape(input) : input); return inputToUse.getBytes(StandardCharsets.UTF_8); }
/** * See STOMP Spec 1.2: * <a href="http://stomp.github.io/stomp-specification-1.2.html#Value_Encoding">"Value Encoding"</a>. */ private String escape(String inString) { StringBuilder sb = null; for (int i = 0; i < inString.length(); i++) { char c = inString.charAt(i); if (c == '\\') { sb = getStringBuilder(sb, inString, i); sb.append("\\\\"); } else if (c == ':') { sb = getStringBuilder(sb, inString, i); sb.append("\\c"); } else if (c == '\n') { sb = getStringBuilder(sb, inString, i); sb.append("\\n"); } else if (c == '\r') { sb = getStringBuilder(sb, inString, i); sb.append("\\r"); } else if (sb != null){ sb.append(c); } } return (sb != null ? sb.toString() : inString); }
public WebSocketMessage<?> encode(Message<byte[]> message, Class<? extends WebSocketSession> sessionType) { StompHeaderAccessor accessor = MessageHeaderAccessor.getAccessor(message, StompHeaderAccessor.class); Assert.notNull(accessor, "No StompHeaderAccessor available"); byte[] payload = message.getPayload(); byte[] bytes = ENCODER.encode(accessor.getMessageHeaders(), payload); boolean useBinary = (payload.length > 0 && !(SockJsSession.class.isAssignableFrom(sessionType)) && MimeTypeUtils.APPLICATION_OCTET_STREAM.isCompatibleWith(accessor.getContentType())); return (useBinary ? new BinaryMessage(bytes) : new TextMessage(bytes)); } }
@Test public void webSocketScope() { Runnable runnable = Mockito.mock(Runnable.class); SimpAttributes simpAttributes = new SimpAttributes(this.session.getId(), this.session.getAttributes()); simpAttributes.setAttribute("name", "value"); simpAttributes.registerDestructionCallback("name", runnable); MessageChannel testChannel = new MessageChannel() { @Override public boolean send(Message<?> message) { SimpAttributes simpAttributes = SimpAttributesContextHolder.currentAttributes(); assertThat(simpAttributes.getAttribute("name"), is("value")); return true; } @Override public boolean send(Message<?> message, long timeout) { return false; } }; this.protocolHandler.afterSessionStarted(this.session, this.channel); StompHeaderAccessor headers = StompHeaderAccessor.create(StompCommand.CONNECT); Message<byte[]> message = MessageBuilder.createMessage(EMPTY_PAYLOAD, headers.getMessageHeaders()); TextMessage textMessage = new TextMessage(new StompEncoder().encode(message)); this.protocolHandler.handleMessageFromClient(this.session, textMessage, testChannel); assertEquals(Collections.<WebSocketMessage<?>>emptyList(), session.getSentMessages()); this.protocolHandler.afterSessionEnded(this.session, CloseStatus.BAD_DATA, testChannel); assertEquals(Collections.<WebSocketMessage<?>>emptyList(), this.session.getSentMessages()); verify(runnable, times(1)).run(); }