Skip to content

Commit 51367de

Browse files
committed
Refine condition to send WebSocket binary messages
The following two refinements have been added: 1) SockJS doesn't support binary messages so don't even try 2) don't bother if payload.length == 0 Issue: SPR-12475
1 parent bc075c7 commit 51367de

File tree

2 files changed

+55
-9
lines changed

2 files changed

+55
-9
lines changed

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

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@
2828

2929
import org.apache.commons.logging.Log;
3030
import org.apache.commons.logging.LogFactory;
31-
3231
import org.springframework.context.ApplicationEvent;
3332
import org.springframework.context.ApplicationEventPublisher;
3433
import org.springframework.context.ApplicationEventPublisherAware;
@@ -52,7 +51,6 @@
5251
import org.springframework.messaging.support.MessageHeaderAccessor;
5352
import org.springframework.messaging.support.MessageHeaderInitializer;
5453
import org.springframework.util.Assert;
55-
import org.springframework.util.MimeType;
5654
import org.springframework.util.MimeTypeUtils;
5755
import org.springframework.web.socket.BinaryMessage;
5856
import org.springframework.web.socket.CloseStatus;
@@ -356,8 +354,13 @@ else if (StompCommand.CONNECTED.equals(command)) {
356354
}
357355
}
358356
try {
359-
byte[] bytes = this.stompEncoder.encode(stompAccessor.getMessageHeaders(), (byte[]) message.getPayload());
360-
if (MimeTypeUtils.APPLICATION_OCTET_STREAM.isCompatibleWith(stompAccessor.getContentType())) {
357+
byte[] payload = (byte[]) message.getPayload();
358+
byte[] bytes = this.stompEncoder.encode(stompAccessor.getMessageHeaders(), payload);
359+
360+
boolean useBinary = (payload.length > 0 && !(session instanceof SockJsSession) &&
361+
MimeTypeUtils.APPLICATION_OCTET_STREAM.isCompatibleWith(stompAccessor.getContentType()));
362+
363+
if (useBinary) {
361364
session.sendMessage(new BinaryMessage(bytes));
362365
}
363366
else {

spring-websocket/src/test/java/org/springframework/web/socket/messaging/StompSubProtocolHandlerTests.java

Lines changed: 48 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,20 @@
1616

1717
package org.springframework.web.socket.messaging;
1818

19+
import static org.hamcrest.Matchers.is;
20+
import static org.junit.Assert.assertArrayEquals;
21+
import static org.junit.Assert.assertEquals;
22+
import static org.junit.Assert.assertFalse;
23+
import static org.junit.Assert.assertNotNull;
24+
import static org.junit.Assert.assertThat;
25+
import static org.junit.Assert.assertTrue;
26+
import static org.mockito.Mockito.mock;
27+
import static org.mockito.Mockito.reset;
28+
import static org.mockito.Mockito.times;
29+
import static org.mockito.Mockito.verify;
30+
import static org.mockito.Mockito.verifyNoMoreInteractions;
31+
import static org.mockito.Mockito.verifyZeroInteractions;
32+
1933
import java.nio.ByteBuffer;
2034
import java.util.ArrayList;
2135
import java.util.Arrays;
@@ -28,7 +42,6 @@
2842
import org.junit.Test;
2943
import org.mockito.ArgumentCaptor;
3044
import org.mockito.Mockito;
31-
3245
import org.springframework.context.ApplicationEvent;
3346
import org.springframework.context.ApplicationEventPublisher;
3447
import org.springframework.messaging.Message;
@@ -50,16 +63,14 @@
5063
import org.springframework.messaging.support.ImmutableMessageChannelInterceptor;
5164
import org.springframework.messaging.support.MessageBuilder;
5265
import org.springframework.messaging.support.MessageHeaderAccessor;
66+
import org.springframework.util.MimeTypeUtils;
67+
import org.springframework.web.socket.BinaryMessage;
5368
import org.springframework.web.socket.CloseStatus;
5469
import org.springframework.web.socket.TextMessage;
5570
import org.springframework.web.socket.WebSocketMessage;
5671
import org.springframework.web.socket.handler.TestWebSocketSession;
5772
import org.springframework.web.socket.sockjs.transport.SockJsSession;
5873

59-
import static org.hamcrest.Matchers.*;
60-
import static org.junit.Assert.*;
61-
import static org.mockito.Mockito.*;
62-
6374
/**
6475
* Test fixture for {@link StompSubProtocolHandler} tests.
6576
*
@@ -267,6 +278,38 @@ public void handleMessageToClientUserDestination() {
267278
assertFalse(((String) textMessage.getPayload()).contains(SimpMessageHeaderAccessor.ORIGINAL_DESTINATION));
268279
}
269280

281+
// SPR-12475
282+
283+
@Test
284+
public void handleMessageToClientBinaryWebSocketMessage() {
285+
286+
StompHeaderAccessor headers = StompHeaderAccessor.create(StompCommand.MESSAGE);
287+
headers.setMessageId("mess0");
288+
headers.setSubscriptionId("sub0");
289+
headers.setContentType(MimeTypeUtils.APPLICATION_OCTET_STREAM);
290+
headers.setDestination("/queue/foo");
291+
292+
// Non-empty payload
293+
294+
byte[] payload = new byte[1];
295+
Message<byte[]> message = MessageBuilder.createMessage(payload, headers.getMessageHeaders());
296+
this.protocolHandler.handleMessageToClient(this.session, message);
297+
298+
assertEquals(1, this.session.getSentMessages().size());
299+
WebSocketMessage<?> webSocketMessage = this.session.getSentMessages().get(0);
300+
assertTrue(webSocketMessage instanceof BinaryMessage);
301+
302+
// Empty payload
303+
304+
payload = EMPTY_PAYLOAD;
305+
message = MessageBuilder.createMessage(payload, headers.getMessageHeaders());
306+
this.protocolHandler.handleMessageToClient(this.session, message);
307+
308+
assertEquals(2, this.session.getSentMessages().size());
309+
webSocketMessage = this.session.getSentMessages().get(1);
310+
assertTrue(webSocketMessage instanceof TextMessage);
311+
}
312+
270313
@Test
271314
public void handleMessageFromClient() {
272315

0 commit comments

Comments
 (0)