Skip to content

Commit 56b197b

Browse files
committed
Avoid unnecessary String concatenation in StompSubProtocolHandler
Issue: SPR-14624
1 parent bbc85ea commit 56b197b

File tree

1 file changed

+32
-23
lines changed

1 file changed

+32
-23
lines changed

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

Lines changed: 32 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@
4343
import org.springframework.messaging.simp.stomp.StompDecoder;
4444
import org.springframework.messaging.simp.stomp.StompEncoder;
4545
import org.springframework.messaging.simp.stomp.StompHeaderAccessor;
46-
import org.springframework.messaging.simp.user.DestinationUserNameProvider;
4746
import org.springframework.messaging.support.AbstractMessageChannel;
4847
import org.springframework.messaging.support.ChannelInterceptor;
4948
import org.springframework.messaging.support.ImmutableMessageChannelInterceptor;
@@ -272,8 +271,10 @@ else if (StompCommand.UNSUBSCRIBE.equals(headerAccessor.getCommand())) {
272271
}
273272
}
274273
catch (Throwable ex) {
275-
logger.error("Failed to send client message to application via MessageChannel" +
276-
" in session " + session.getId() + ". Sending STOMP ERROR to client.", ex);
274+
if (logger.isErrorEnabled()) {
275+
logger.error("Failed to send client message to application via MessageChannel" +
276+
" in session " + session.getId() + ". Sending STOMP ERROR to client.", ex);
277+
}
277278
handleError(session, ex, message);
278279
}
279280
}
@@ -291,7 +292,7 @@ private void handleError(WebSocketSession session, Throwable ex, Message<byte[]>
291292
}
292293

293294
StompHeaderAccessor accessor = MessageHeaderAccessor.getAccessor(message, StompHeaderAccessor.class);
294-
Assert.notNull(accessor, "Expected STOMP headers");
295+
Assert.state(accessor != null, "Expected STOMP headers");
295296
sendToClient(session, accessor, message.getPayload());
296297
}
297298

@@ -336,7 +337,9 @@ private void publishEvent(ApplicationEvent event) {
336337
this.eventPublisher.publishEvent(event);
337338
}
338339
catch (Throwable ex) {
339-
logger.error("Error publishing " + event, ex);
340+
if (logger.isErrorEnabled()) {
341+
logger.error("Error publishing " + event, ex);
342+
}
340343
}
341344
}
342345

@@ -347,27 +350,29 @@ private void publishEvent(ApplicationEvent event) {
347350
@SuppressWarnings("unchecked")
348351
public void handleMessageToClient(WebSocketSession session, Message<?> message) {
349352
if (!(message.getPayload() instanceof byte[])) {
350-
logger.error("Expected byte[] payload. Ignoring " + message + ".");
353+
if (logger.isErrorEnabled()) {
354+
logger.error("Expected byte[] payload. Ignoring " + message + ".");
355+
}
351356
return;
352357
}
353358

354-
StompHeaderAccessor stompAccessor = getStompHeaderAccessor(message);
355-
StompCommand command = stompAccessor.getCommand();
359+
StompHeaderAccessor accessor = getStompHeaderAccessor(message);
360+
StompCommand command = accessor.getCommand();
356361

357362
if (StompCommand.MESSAGE.equals(command)) {
358-
if (stompAccessor.getSubscriptionId() == null) {
363+
if (accessor.getSubscriptionId() == null && logger.isWarnEnabled()) {
359364
logger.warn("No STOMP \"subscription\" header in " + message);
360365
}
361-
String origDestination = stompAccessor.getFirstNativeHeader(SimpMessageHeaderAccessor.ORIGINAL_DESTINATION);
366+
String origDestination = accessor.getFirstNativeHeader(SimpMessageHeaderAccessor.ORIGINAL_DESTINATION);
362367
if (origDestination != null) {
363-
stompAccessor = toMutableAccessor(stompAccessor, message);
364-
stompAccessor.removeNativeHeader(SimpMessageHeaderAccessor.ORIGINAL_DESTINATION);
365-
stompAccessor.setDestination(origDestination);
368+
accessor = toMutableAccessor(accessor, message);
369+
accessor.removeNativeHeader(SimpMessageHeaderAccessor.ORIGINAL_DESTINATION);
370+
accessor.setDestination(origDestination);
366371
}
367372
}
368373
else if (StompCommand.CONNECTED.equals(command)) {
369374
this.stats.incrementConnectedCount();
370-
stompAccessor = afterStompSessionConnected(message, stompAccessor, session);
375+
accessor = afterStompSessionConnected(message, accessor, session);
371376
if (this.eventPublisher != null && StompCommand.CONNECTED.equals(command)) {
372377
try {
373378
SimpAttributes simpAttributes = new SimpAttributes(session.getId(), session.getAttributes());
@@ -382,25 +387,21 @@ else if (StompCommand.CONNECTED.equals(command)) {
382387
}
383388

384389
byte[] payload = (byte[]) message.getPayload();
385-
386390
if (StompCommand.ERROR.equals(command) && getErrorHandler() != null) {
387391
Message<byte[]> errorMessage = getErrorHandler().handleErrorMessageToClient((Message<byte[]>) message);
388-
stompAccessor = MessageHeaderAccessor.getAccessor(errorMessage, StompHeaderAccessor.class);
389-
Assert.notNull(stompAccessor, "Expected STOMP headers");
392+
accessor = MessageHeaderAccessor.getAccessor(errorMessage, StompHeaderAccessor.class);
393+
Assert.state(accessor != null, "Expected STOMP headers");
390394
payload = errorMessage.getPayload();
391395
}
392-
393-
sendToClient(session, stompAccessor, payload);
396+
sendToClient(session, accessor, payload);
394397
}
395398

396399
private void sendToClient(WebSocketSession session, StompHeaderAccessor stompAccessor, byte[] payload) {
397400
StompCommand command = stompAccessor.getCommand();
398401
try {
399402
byte[] bytes = this.stompEncoder.encode(stompAccessor.getMessageHeaders(), payload);
400-
401403
boolean useBinary = (payload.length > 0 && !(session instanceof SockJsSession) &&
402404
MimeTypeUtils.APPLICATION_OCTET_STREAM.isCompatibleWith(stompAccessor.getContentType()));
403-
404405
if (useBinary) {
405406
session.sendMessage(new BinaryMessage(bytes));
406407
}
@@ -414,7 +415,9 @@ private void sendToClient(WebSocketSession session, StompHeaderAccessor stompAcc
414415
}
415416
catch (Throwable ex) {
416417
// Could be part of normal workflow (e.g. browser tab closed)
417-
logger.debug("Failed to send WebSocket message to client in session " + session.getId(), ex);
418+
if (logger.isDebugEnabled()) {
419+
logger.debug("Failed to send WebSocket message to client in session " + session.getId(), ex);
420+
}
418421
command = StompCommand.ERROR;
419422
}
420423
finally {
@@ -471,9 +474,13 @@ else if (stompAccessor.getCommand() == null || StompCommand.SEND.equals(stompAcc
471474
private StompHeaderAccessor convertConnectAcktoStompConnected(StompHeaderAccessor connectAckHeaders) {
472475
String name = StompHeaderAccessor.CONNECT_MESSAGE_HEADER;
473476
Message<?> message = (Message<?>) connectAckHeaders.getHeader(name);
474-
Assert.notNull(message, "Original STOMP CONNECT not found in " + connectAckHeaders);
477+
if (message == null) {
478+
throw new IllegalStateException("Original STOMP CONNECT not found in " + connectAckHeaders);
479+
}
480+
475481
StompHeaderAccessor connectHeaders = MessageHeaderAccessor.getAccessor(message, StompHeaderAccessor.class);
476482
StompHeaderAccessor connectedHeaders = StompHeaderAccessor.create(StompCommand.CONNECTED);
483+
477484
Set<String> acceptVersions = connectHeaders.getAcceptVersion();
478485
if (acceptVersions.contains("1.2")) {
479486
connectedHeaders.setVersion("1.2");
@@ -484,13 +491,15 @@ else if (acceptVersions.contains("1.1")) {
484491
else if (!acceptVersions.isEmpty()) {
485492
throw new IllegalArgumentException("Unsupported STOMP version '" + acceptVersions + "'");
486493
}
494+
487495
long[] heartbeat = (long[]) connectAckHeaders.getHeader(SimpMessageHeaderAccessor.HEART_BEAT_HEADER);
488496
if (heartbeat != null) {
489497
connectedHeaders.setHeartbeat(heartbeat[0], heartbeat[1]);
490498
}
491499
else {
492500
connectedHeaders.setHeartbeat(0, 0);
493501
}
502+
494503
return connectedHeaders;
495504
}
496505

0 commit comments

Comments
 (0)