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. 9
      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.MessageHeaderInitializer;
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.CloseStatus;
import org.springframework.web.socket.TextMessage;
@ -355,7 +357,12 @@ public class StompSubProtocolHandler implements SubProtocolHandler, ApplicationE
}
try {
byte[] bytes = this.stompEncoder.encode(stompAccessor.getMessageHeaders(), (byte[]) message.getPayload());
session.sendMessage(new TextMessage(bytes));
if (MimeTypeUtils.APPLICATION_OCTET_STREAM.isCompatibleWith(stompAccessor.getContentType())) {
session.sendMessage(new BinaryMessage(bytes));
}
else {
session.sendMessage(new TextMessage(bytes));
}
}
catch (SessionLimitExceededException ex) {
// Bad session, just get out

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

Loading…
Cancel
Save