Skip to content

Commit 670974d

Browse files
committed
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
1 parent 6b3023c commit 670974d

File tree

2 files changed

+9
-5
lines changed

2 files changed

+9
-5
lines changed

spring-websocket/src/main/java/org/springframework/web/socket/messaging/StompSubProtocolHandler.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@
5252
import org.springframework.messaging.support.MessageHeaderAccessor;
5353
import org.springframework.messaging.support.MessageHeaderInitializer;
5454
import org.springframework.util.Assert;
55+
import org.springframework.util.MimeType;
56+
import org.springframework.util.MimeTypeUtils;
5557
import org.springframework.web.socket.BinaryMessage;
5658
import org.springframework.web.socket.CloseStatus;
5759
import org.springframework.web.socket.TextMessage;
@@ -355,7 +357,12 @@ else if (StompCommand.CONNECTED.equals(command)) {
355357
}
356358
try {
357359
byte[] bytes = this.stompEncoder.encode(stompAccessor.getMessageHeaders(), (byte[]) message.getPayload());
358-
session.sendMessage(new TextMessage(bytes));
360+
if (MimeTypeUtils.APPLICATION_OCTET_STREAM.isCompatibleWith(stompAccessor.getContentType())) {
361+
session.sendMessage(new BinaryMessage(bytes));
362+
}
363+
else {
364+
session.sendMessage(new TextMessage(bytes));
365+
}
359366
}
360367
catch (SessionLimitExceededException ex) {
361368
// Bad session, just get out

spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/session/AbstractSockJsSession.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@
3030

3131
import org.apache.commons.logging.Log;
3232
import org.apache.commons.logging.LogFactory;
33-
3433
import org.springframework.core.NestedCheckedException;
3534
import org.springframework.util.Assert;
3635
import org.springframework.web.socket.CloseStatus;
@@ -158,9 +157,7 @@ public Map<String, Object> getAttributes() {
158157

159158
public final void sendMessage(WebSocketMessage<?> message) throws IOException {
160159
Assert.state(!isClosed(), "Cannot send a message when session is closed");
161-
if (!(message instanceof TextMessage)) {
162-
throw new IllegalArgumentException("Expected text message: " + message);
163-
}
160+
Assert.isInstanceOf(TextMessage.class, message, "SockJS supports text messages only: " + message);
164161
sendMessageInternal(((TextMessage) message).getPayload());
165162
}
166163

0 commit comments

Comments
 (0)