From b31888066148be78e1e60a4615dc5c09c4524076 Mon Sep 17 00:00:00 2001 From: Rossen Stoyanchev Date: Fri, 11 Jul 2014 10:09:48 -0400 Subject: [PATCH] Ensure StompEncoder never writes content-length twice Issue: SPR-11984 --- .../messaging/simp/stomp/StompEncoder.java | 6 +++++- .../messaging/simp/stomp/StompCodecTests.java | 11 +++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/StompEncoder.java b/spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/StompEncoder.java index beb5dd03bd..fa9ee29d75 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/StompEncoder.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/StompEncoder.java @@ -112,8 +112,12 @@ public final class StompEncoder { for (Entry> entry : nativeHeaders.entrySet()) { byte[] key = encodeHeaderString(entry.getKey(), shouldEscape); + if (command.requiresContentLength() && "content-length".equals(entry.getKey())) { + continue; + } List values = entry.getValue(); - if (StompHeaderAccessor.STOMP_PASSCODE_HEADER.equals(entry.getKey())) { + if (StompCommand.CONNECT.equals(command) && + StompHeaderAccessor.STOMP_PASSCODE_HEADER.equals(entry.getKey())) { values = Arrays.asList(StompHeaderAccessor.getPasscode(headers)); } for (String value : values) { diff --git a/spring-messaging/src/test/java/org/springframework/messaging/simp/stomp/StompCodecTests.java b/spring-messaging/src/test/java/org/springframework/messaging/simp/stomp/StompCodecTests.java index 5e74b7e4c4..bfe8e9fe96 100644 --- a/spring-messaging/src/test/java/org/springframework/messaging/simp/stomp/StompCodecTests.java +++ b/spring-messaging/src/test/java/org/springframework/messaging/simp/stomp/StompCodecTests.java @@ -290,6 +290,17 @@ public class StompCodecTests { new Reactor11StompCodec().encoder().apply(frame).asString()); } + @Test + public void encodeFrameWithContentLengthPresent() { + StompHeaderAccessor headers = StompHeaderAccessor.create(StompCommand.SEND); + headers.setContentLength(12); + + Message frame = MessageBuilder.createMessage("Message body".getBytes(), headers.getMessageHeaders()); + + assertEquals("SEND\ncontent-length:12\n\nMessage body\0", + new Reactor11StompCodec().encoder().apply(frame).asString()); + } + private void assertIncompleteDecode(String partialFrame) { Buffer buffer = Buffer.wrap(partialFrame); assertNull(decode(buffer));