Browse Source

Filter out null WebSocketSession attributes

Closes gh-29315
pull/29589/head
rstoyanchev 3 years ago
parent
commit
8ade083a05
  1. 7
      spring-webflux/src/main/java/org/springframework/web/reactive/socket/adapter/AbstractWebSocketSession.java
  2. 6
      spring-websocket/src/main/java/org/springframework/web/socket/adapter/AbstractWebSocketSession.java
  3. 16
      spring-websocket/src/test/java/org/springframework/web/socket/adapter/standard/StandardWebSocketSessionTests.java

7
spring-webflux/src/main/java/org/springframework/web/reactive/socket/adapter/AbstractWebSocketSession.java

@ -1,5 +1,5 @@ @@ -1,5 +1,5 @@
/*
* Copyright 2002-2018 the original author or authors.
* Copyright 2002-2022 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -73,9 +73,12 @@ public abstract class AbstractWebSocketSession<T> implements WebSocketSession { @@ -73,9 +73,12 @@ public abstract class AbstractWebSocketSession<T> implements WebSocketSession {
this.id = id;
this.handshakeInfo = info;
this.bufferFactory = bufferFactory;
this.attributes.putAll(info.getAttributes());
this.logPrefix = initLogPrefix(info, id);
info.getAttributes().entrySet().stream()
.filter(entry -> (entry.getKey() != null && entry.getValue() != null))
.forEach(entry -> this.attributes.put(entry.getKey(), entry.getValue()));
if (logger.isDebugEnabled()) {
logger.debug(getLogPrefix() + "Session id \"" + getId() + "\" for " + getHandshakeInfo().getUri());
}

6
spring-websocket/src/main/java/org/springframework/web/socket/adapter/AbstractWebSocketSession.java

@ -1,5 +1,5 @@ @@ -1,5 +1,5 @@
/*
* Copyright 2002-2018 the original author or authors.
* Copyright 2002-2022 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -62,7 +62,9 @@ public abstract class AbstractWebSocketSession<T> implements NativeWebSocketSess @@ -62,7 +62,9 @@ public abstract class AbstractWebSocketSession<T> implements NativeWebSocketSess
*/
public AbstractWebSocketSession(@Nullable Map<String, Object> attributes) {
if (attributes != null) {
this.attributes.putAll(attributes);
attributes.entrySet().stream()
.filter(entry -> (entry.getKey() != null && entry.getValue() != null))
.forEach(entry -> this.attributes.put(entry.getKey(), entry.getValue()));
}
}

16
spring-websocket/src/test/java/org/springframework/web/socket/adapter/standard/StandardWebSocketSessionTests.java

@ -1,5 +1,5 @@ @@ -1,5 +1,5 @@
/*
* Copyright 2002-2019 the original author or authors.
* Copyright 2002-2022 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -37,6 +37,7 @@ import static org.mockito.Mockito.verifyNoMoreInteractions; @@ -37,6 +37,7 @@ import static org.mockito.Mockito.verifyNoMoreInteractions;
*
* @author Rossen Stoyanchev
*/
@SuppressWarnings("resource")
public class StandardWebSocketSessionTests {
private final HttpHeaders headers = new HttpHeaders();
@ -54,7 +55,6 @@ public class StandardWebSocketSessionTests { @@ -54,7 +55,6 @@ public class StandardWebSocketSessionTests {
}
@Test
@SuppressWarnings("resource")
public void getPrincipalWithNativeSession() {
TestPrincipal user = new TestPrincipal("joe");
@ -68,7 +68,6 @@ public class StandardWebSocketSessionTests { @@ -68,7 +68,6 @@ public class StandardWebSocketSessionTests {
}
@Test
@SuppressWarnings("resource")
public void getPrincipalNone() {
Session nativeSession = Mockito.mock(Session.class);
given(nativeSession.getUserPrincipal()).willReturn(null);
@ -83,7 +82,6 @@ public class StandardWebSocketSessionTests { @@ -83,7 +82,6 @@ public class StandardWebSocketSessionTests {
}
@Test
@SuppressWarnings("resource")
public void getAcceptedProtocol() {
String protocol = "foo";
@ -99,4 +97,14 @@ public class StandardWebSocketSessionTests { @@ -99,4 +97,14 @@ public class StandardWebSocketSessionTests {
verifyNoMoreInteractions(nativeSession);
}
@Test // gh-29315
public void addAttributesWithNullKeyOrValue() {
this.attributes.put(null, "value");
this.attributes.put("key", null);
this.attributes.put("foo", "bar");
assertThat(new StandardWebSocketSession(this.headers, this.attributes, null, null).getAttributes())
.hasSize(1).containsEntry("foo", "bar");
}
}

Loading…
Cancel
Save