Allow sending binary messages with STOMP

After this change the StompSubProtocolHandler sends STOMP frames
with content-type=octet-stream as a binary WebSocket message.

Issue: SPR-12475
master
Rossen Stoyanchev 10 years ago
parent 6b3023c2aa
commit 670974d76a
  1. 7
      spring-websocket/src/main/java/org/springframework/web/socket/messaging/StompSubProtocolHandler.java
  2. 5
      spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/session/AbstractSockJsSession.java

@ -52,6 +52,8 @@ import org.springframework.messaging.support.MessageBuilder;
import org.springframework.messaging.support.MessageHeaderAccessor; import org.springframework.messaging.support.MessageHeaderAccessor;
import org.springframework.messaging.support.MessageHeaderInitializer; import org.springframework.messaging.support.MessageHeaderInitializer;
import org.springframework.util.Assert; import org.springframework.util.Assert;
import org.springframework.util.MimeType;
import org.springframework.util.MimeTypeUtils;
import org.springframework.web.socket.BinaryMessage; import org.springframework.web.socket.BinaryMessage;
import org.springframework.web.socket.CloseStatus; import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.TextMessage; import org.springframework.web.socket.TextMessage;
@ -355,8 +357,13 @@ public class StompSubProtocolHandler implements SubProtocolHandler, ApplicationE
} }
try { try {
byte[] bytes = this.stompEncoder.encode(stompAccessor.getMessageHeaders(), (byte[]) message.getPayload()); byte[] bytes = this.stompEncoder.encode(stompAccessor.getMessageHeaders(), (byte[]) message.getPayload());
if (MimeTypeUtils.APPLICATION_OCTET_STREAM.isCompatibleWith(stompAccessor.getContentType())) {
session.sendMessage(new BinaryMessage(bytes));
}
else {
session.sendMessage(new TextMessage(bytes)); session.sendMessage(new TextMessage(bytes));
} }
}
catch (SessionLimitExceededException ex) { catch (SessionLimitExceededException ex) {
// Bad session, just get out // Bad session, just get out
throw ex; throw ex;

@ -30,7 +30,6 @@ import java.util.concurrent.ScheduledFuture;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
import org.springframework.core.NestedCheckedException; import org.springframework.core.NestedCheckedException;
import org.springframework.util.Assert; import org.springframework.util.Assert;
import org.springframework.web.socket.CloseStatus; import org.springframework.web.socket.CloseStatus;
@ -158,9 +157,7 @@ public abstract class AbstractSockJsSession implements SockJsSession {
public final void sendMessage(WebSocketMessage<?> message) throws IOException { public final void sendMessage(WebSocketMessage<?> message) throws IOException {
Assert.state(!isClosed(), "Cannot send a message when session is closed"); Assert.state(!isClosed(), "Cannot send a message when session is closed");
if (!(message instanceof TextMessage)) { Assert.isInstanceOf(TextMessage.class, message, "SockJS supports text messages only: " + message);
throw new IllegalArgumentException("Expected text message: " + message);
}
sendMessageInternal(((TextMessage) message).getPayload()); sendMessageInternal(((TextMessage) message).getPayload());
} }

Loading…
Cancel
Save