From 5e925ac03c7fe6bebaf81d429fcb6839eab77035 Mon Sep 17 00:00:00 2001 From: Rossen Stoyanchev Date: Fri, 4 Apr 2014 14:31:49 -0400 Subject: [PATCH] Rename header for "orig" destination The UserDestinationMessageHandler adds a header providing a hint for what the original destination a user may have used when subscribing. That is then used when writing messages back to WebSocket clients to ensure they dont see the internally used, transformed user destination. This change moves the header name constatn to make it more broadly applicable. For example SPR-11645. --- .../simp/SimpMessageHeaderAccessor.java | 28 +++++++++++++++++++ .../user/UserDestinationMessageHandler.java | 4 +-- .../UserDestinationMessageHandlerTests.java | 2 +- .../messaging/StompSubProtocolHandler.java | 3 +- .../StompSubProtocolHandlerTests.java | 2 +- 5 files changed, 33 insertions(+), 6 deletions(-) diff --git a/spring-messaging/src/main/java/org/springframework/messaging/simp/SimpMessageHeaderAccessor.java b/spring-messaging/src/main/java/org/springframework/messaging/simp/SimpMessageHeaderAccessor.java index 7af2a47af83..78adf8afbda 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/simp/SimpMessageHeaderAccessor.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/simp/SimpMessageHeaderAccessor.java @@ -52,6 +52,16 @@ public class SimpMessageHeaderAccessor extends NativeMessageHeaderAccessor { public static final String USER_HEADER = "simpUser"; + /** + * For internal use. + * + *

The original destination used by a client when subscribing. Such a + * destination may have been modified (e.g. user destinations) on the server + * side. This header provides a hint so messages sent to clients may have + * a destination matching to their original subscription. + */ + public static final String ORIGINAL_DESTINATION = "simpOrigDestination"; + /** * A constructor for creating new message headers. @@ -100,6 +110,9 @@ public class SimpMessageHeaderAccessor extends NativeMessageHeaderAccessor { } } + /** + * @return the message type + */ public SimpMessageType getMessageType() { return (SimpMessageType) getHeader(MESSAGE_TYPE_HEADER); } @@ -109,10 +122,16 @@ public class SimpMessageHeaderAccessor extends NativeMessageHeaderAccessor { setHeader(DESTINATION_HEADER, destination); } + /** + * @return the message destination + */ public String getDestination() { return (String) getHeader(DESTINATION_HEADER); } + /** + * @return the subscription id (if any) of the message + */ public String getSubscriptionId() { return (String) getHeader(SUBSCRIPTION_ID_HEADER); } @@ -121,6 +140,9 @@ public class SimpMessageHeaderAccessor extends NativeMessageHeaderAccessor { setHeader(SUBSCRIPTION_ID_HEADER, subscriptionId); } + /** + * @return the id of the current session + */ public String getSessionId() { return (String) getHeader(SESSION_ID_HEADER); } @@ -129,6 +151,9 @@ public class SimpMessageHeaderAccessor extends NativeMessageHeaderAccessor { setHeader(SESSION_ID_HEADER, sessionId); } + /** + * @return attributes associated with the current session. + */ @SuppressWarnings("unchecked") public Map getSessionAttributes() { return (Map) getHeader(SESSION_ATTRIBUTES); @@ -138,6 +163,9 @@ public class SimpMessageHeaderAccessor extends NativeMessageHeaderAccessor { setHeader(SESSION_ATTRIBUTES, attributes); } + /** + * @return the user associated with the current session. + */ public Principal getUser() { return (Principal) getHeader(USER_HEADER); } diff --git a/spring-messaging/src/main/java/org/springframework/messaging/simp/user/UserDestinationMessageHandler.java b/spring-messaging/src/main/java/org/springframework/messaging/simp/user/UserDestinationMessageHandler.java index bda6e87a4b8..5d0686789d2 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/simp/user/UserDestinationMessageHandler.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/simp/user/UserDestinationMessageHandler.java @@ -45,8 +45,6 @@ import org.springframework.util.Assert; */ public class UserDestinationMessageHandler implements MessageHandler, SmartLifecycle { - public static final String SUBSCRIBE_DESTINATION = "subscribeDestination"; - private static final Log logger = LogFactory.getLog(UserDestinationMessageHandler.class); @@ -156,7 +154,7 @@ public class UserDestinationMessageHandler implements MessageHandler, SmartLifec } SimpMessageHeaderAccessor headerAccessor = SimpMessageHeaderAccessor.wrap(message); if (SimpMessageType.MESSAGE.equals(headerAccessor.getMessageType())) { - headerAccessor.setHeader(SUBSCRIBE_DESTINATION, result.getSubscribeDestination()); + headerAccessor.setHeader(SimpMessageHeaderAccessor.ORIGINAL_DESTINATION, result.getSubscribeDestination()); message = MessageBuilder.withPayload(message.getPayload()).setHeaders(headerAccessor).build(); } for (String targetDestination : destinations) { diff --git a/spring-messaging/src/test/java/org/springframework/messaging/simp/user/UserDestinationMessageHandlerTests.java b/spring-messaging/src/test/java/org/springframework/messaging/simp/user/UserDestinationMessageHandlerTests.java index 717388af0d1..10ff0c9a8dd 100644 --- a/spring-messaging/src/test/java/org/springframework/messaging/simp/user/UserDestinationMessageHandlerTests.java +++ b/spring-messaging/src/test/java/org/springframework/messaging/simp/user/UserDestinationMessageHandlerTests.java @@ -96,7 +96,7 @@ public class UserDestinationMessageHandlerTests { assertEquals("/queue/foo-user123", captor.getValue().getHeaders().get(SimpMessageHeaderAccessor.DESTINATION_HEADER)); assertEquals("/user/queue/foo", - captor.getValue().getHeaders().get(UserDestinationMessageHandler.SUBSCRIBE_DESTINATION)); + captor.getValue().getHeaders().get(SimpMessageHeaderAccessor.ORIGINAL_DESTINATION)); } diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/messaging/StompSubProtocolHandler.java b/spring-websocket/src/main/java/org/springframework/web/socket/messaging/StompSubProtocolHandler.java index b33a91d5f39..352fc145772 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/messaging/StompSubProtocolHandler.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/messaging/StompSubProtocolHandler.java @@ -33,6 +33,7 @@ import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.ApplicationEventPublisherAware; import org.springframework.messaging.Message; import org.springframework.messaging.MessageChannel; +import org.springframework.messaging.simp.SimpMessageHeaderAccessor; import org.springframework.messaging.simp.SimpMessageType; import org.springframework.messaging.simp.stomp.BufferingStompDecoder; import org.springframework.messaging.simp.stomp.StompCommand; @@ -251,7 +252,7 @@ public class StompSubProtocolHandler implements SubProtocolHandler, ApplicationE logger.error("Ignoring message, no subscriptionId header: " + message); return; } - String header = UserDestinationMessageHandler.SUBSCRIBE_DESTINATION; + String header = SimpMessageHeaderAccessor.ORIGINAL_DESTINATION; if (message.getHeaders().containsKey(header)) { headers.setDestination((String) message.getHeaders().get(header)); } diff --git a/spring-websocket/src/test/java/org/springframework/web/socket/messaging/StompSubProtocolHandlerTests.java b/spring-websocket/src/test/java/org/springframework/web/socket/messaging/StompSubProtocolHandlerTests.java index 426a0599ab4..35fc8d268a9 100644 --- a/spring-websocket/src/test/java/org/springframework/web/socket/messaging/StompSubProtocolHandlerTests.java +++ b/spring-websocket/src/test/java/org/springframework/web/socket/messaging/StompSubProtocolHandlerTests.java @@ -240,7 +240,7 @@ public class StompSubProtocolHandlerTests { headers.setMessageId("mess0"); headers.setSubscriptionId("sub0"); headers.setDestination("/queue/foo-user123"); - headers.setHeader(UserDestinationMessageHandler.SUBSCRIBE_DESTINATION, "/user/queue/foo"); + headers.setHeader(StompHeaderAccessor.ORIGINAL_DESTINATION, "/user/queue/foo"); Message message = MessageBuilder.withPayload(new byte[0]).setHeaders(headers).build(); this.protocolHandler.handleMessageToClient(this.session, message);