Skip to content

Commit 87a9602

Browse files
committed
Fix bug in WebSocketClient implementations
1 parent fb4e34f commit 87a9602

File tree

6 files changed

+42
-45
lines changed

6 files changed

+42
-45
lines changed

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

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,6 @@
1616

1717
package org.springframework.web.socket;
1818

19-
import java.io.Reader;
20-
import java.io.StringReader;
2119

2220
/**
2321
* A {@link WebSocketMessage} that contains a textual {@link String} payload.
@@ -46,13 +44,6 @@ public TextMessage(CharSequence payload, boolean isLast) {
4644
super(payload.toString(), isLast);
4745
}
4846

49-
/**
50-
* Returns access to the message payload as a {@link Reader}.
51-
*/
52-
public Reader getReader() {
53-
return new StringReader(getPayload());
54-
}
55-
5647
@Override
5748
protected int getPayloadSize() {
5849
return getPayload().length();

spring-websocket/src/main/java/org/springframework/web/socket/client/WebSocketConnectionManager.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424
import org.springframework.util.CollectionUtils;
2525
import org.springframework.web.socket.WebSocketHandler;
2626
import org.springframework.web.socket.WebSocketSession;
27-
import org.springframework.web.socket.support.ExceptionWebSocketHandlerDecorator;
2827
import org.springframework.web.socket.support.LoggingWebSocketHandlerDecorator;
2928

3029
/**
@@ -61,11 +60,9 @@ public WebSocketConnectionManager(WebSocketClient client,
6160
/**
6261
* Decorate the WebSocketHandler provided to the class constructor.
6362
* <p>
64-
* By default {@link ExceptionWebSocketHandlerDecorator} and
65-
* {@link LoggingWebSocketHandlerDecorator} are applied are added.
63+
* By default {@link LoggingWebSocketHandlerDecorator} is added.
6664
*/
6765
protected WebSocketHandler decorateWebSocketHandler(WebSocketHandler handler) {
68-
handler = new ExceptionWebSocketHandlerDecorator(handler);
6966
return new LoggingWebSocketHandlerDecorator(handler);
7067
}
7168

spring-websocket/src/main/java/org/springframework/web/socket/client/endpoint/StandardWebSocketClient.java

Lines changed: 29 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import org.apache.commons.logging.Log;
3434
import org.apache.commons.logging.LogFactory;
3535
import org.springframework.http.HttpHeaders;
36+
import org.springframework.util.Assert;
3637
import org.springframework.web.socket.WebSocketHandler;
3738
import org.springframework.web.socket.WebSocketSession;
3839
import org.springframework.web.socket.adapter.StandardEndpointAdapter;
@@ -53,49 +54,57 @@ public class StandardWebSocketClient implements WebSocketClient {
5354

5455
private static final Log logger = LogFactory.getLog(StandardWebSocketClient.class);
5556

56-
private WebSocketContainer webSocketContainer;
57+
private final WebSocketContainer webSocketContainer;
5758

5859

59-
public WebSocketContainer getWebSocketContainer() {
60-
if (this.webSocketContainer == null) {
61-
this.webSocketContainer = ContainerProvider.getWebSocketContainer();
62-
}
63-
return this.webSocketContainer;
60+
public StandardWebSocketClient() {
61+
this.webSocketContainer = ContainerProvider.getWebSocketContainer();
6462
}
6563

66-
public void setWebSocketContainer(WebSocketContainer container) {
67-
this.webSocketContainer = container;
64+
public StandardWebSocketClient(WebSocketContainer webSocketContainer) {
65+
Assert.notNull(webSocketContainer, "webSocketContainer is required");
66+
this.webSocketContainer = webSocketContainer;
6867
}
6968

7069
@Override
7170
public WebSocketSession doHandshake(WebSocketHandler webSocketHandler, String uriTemplate, Object... uriVariables)
7271
throws WebSocketConnectFailureException {
7372

73+
Assert.notNull(uriTemplate, "uriTemplate is required");
7474
UriComponents uriComponents = UriComponentsBuilder.fromUriString(uriTemplate).buildAndExpand(uriVariables).encode();
75-
return doHandshake(webSocketHandler, null, uriComponents);
75+
return doHandshake(webSocketHandler, null, uriComponents.toUri());
7676
}
7777

7878
@Override
7979
public WebSocketSession doHandshake(WebSocketHandler webSocketHandler, HttpHeaders httpHeaders, URI uri)
8080
throws WebSocketConnectFailureException {
8181

82+
Assert.notNull(webSocketHandler, "webSocketHandler is required");
83+
Assert.notNull(uri, "uri is required");
84+
85+
httpHeaders = (httpHeaders != null) ? httpHeaders : new HttpHeaders();
86+
87+
if (logger.isDebugEnabled()) {
88+
logger.debug("Connecting to " + uri);
89+
}
90+
8291
StandardWebSocketSessionAdapter session = new StandardWebSocketSessionAdapter();
8392
session.setUri(uri);
8493
session.setRemoteHostName(uri.getHost());
85-
Endpoint endpoint = new StandardEndpointAdapter(webSocketHandler, session);
8694

8795
ClientEndpointConfig.Builder configBuidler = ClientEndpointConfig.Builder.create();
88-
if (httpHeaders != null) {
89-
List<String> protocols = httpHeaders.getSecWebSocketProtocol();
90-
if (!protocols.isEmpty()) {
91-
configBuidler.preferredSubprotocols(protocols);
92-
}
93-
configBuidler.configurator(new StandardWebSocketClientConfigurator(httpHeaders));
96+
configBuidler.configurator(new StandardWebSocketClientConfigurator(httpHeaders));
97+
98+
List<String> protocols = httpHeaders.getSecWebSocketProtocol();
99+
if (!protocols.isEmpty()) {
100+
configBuidler.preferredSubprotocols(protocols);
94101
}
95102

96103
try {
97104
// TODO: do not block
105+
Endpoint endpoint = new StandardEndpointAdapter(webSocketHandler, session);
98106
this.webSocketContainer.connectToServer(endpoint, configBuidler.build(), uri);
107+
99108
return session;
100109
}
101110
catch (Exception e) {
@@ -128,14 +137,14 @@ public void beforeRequest(Map<String, List<String>> headers) {
128137
headers.put(headerName, value);
129138
}
130139
}
131-
if (logger.isTraceEnabled()) {
132-
logger.trace("Handshake request headers: " + headers);
140+
if (logger.isDebugEnabled()) {
141+
logger.debug("Handshake request headers: " + headers);
133142
}
134143
}
135144
@Override
136145
public void afterResponse(HandshakeResponse handshakeResponse) {
137-
if (logger.isTraceEnabled()) {
138-
logger.trace("Handshake response headers: " + handshakeResponse.getHeaders());
146+
if (logger.isDebugEnabled()) {
147+
logger.debug("Handshake response headers: " + handshakeResponse.getHeaders());
139148
}
140149
}
141150
}

spring-websocket/src/main/java/org/springframework/web/socket/client/jetty/JettyWebSocketClient.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import org.apache.commons.logging.LogFactory;
2323
import org.springframework.context.SmartLifecycle;
2424
import org.springframework.http.HttpHeaders;
25+
import org.springframework.util.Assert;
2526
import org.springframework.web.socket.WebSocketHandler;
2627
import org.springframework.web.socket.WebSocketSession;
2728
import org.springframework.web.socket.adapter.JettyWebSocketListenerAdapter;
@@ -126,13 +127,20 @@ public WebSocketSession doHandshake(WebSocketHandler webSocketHandler, String ur
126127
throws WebSocketConnectFailureException {
127128

128129
UriComponents uriComponents = UriComponentsBuilder.fromUriString(uriTemplate).buildAndExpand(uriVariables).encode();
129-
return doHandshake(webSocketHandler, null, uriComponents);
130+
return doHandshake(webSocketHandler, null, uriComponents.toUri());
130131
}
131132

132133
@Override
133134
public WebSocketSession doHandshake(WebSocketHandler webSocketHandler, HttpHeaders headers, URI uri)
134135
throws WebSocketConnectFailureException {
135136

137+
Assert.notNull(webSocketHandler, "webSocketHandler is required");
138+
Assert.notNull(uri, "uri is required");
139+
140+
if (logger.isDebugEnabled()) {
141+
logger.debug("Connecting to " + uri);
142+
}
143+
136144
// TODO: populate headers
137145

138146
JettyWebSocketSessionAdapter session = new JettyWebSocketSessionAdapter();

spring-websocket/src/test/java/org/springframework/web/socket/client/WebSocketConnectionManagerTests.java

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@
2727
import org.springframework.web.socket.WebSocketHandler;
2828
import org.springframework.web.socket.WebSocketSession;
2929
import org.springframework.web.socket.adapter.WebSocketHandlerAdapter;
30-
import org.springframework.web.socket.support.ExceptionWebSocketHandlerDecorator;
3130
import org.springframework.web.socket.support.LoggingWebSocketHandlerDecorator;
3231
import org.springframework.web.socket.support.WebSocketHandlerDecorator;
3332

@@ -69,11 +68,7 @@ public void openConnection() throws Exception {
6968
WebSocketHandlerDecorator loggingHandler = captor.getValue();
7069
assertEquals(LoggingWebSocketHandlerDecorator.class, loggingHandler.getClass());
7170

72-
WebSocketHandlerDecorator exceptionHandler = (WebSocketHandlerDecorator) loggingHandler.getDelegate();
73-
assertNotNull(exceptionHandler);
74-
assertEquals(ExceptionWebSocketHandlerDecorator.class, exceptionHandler.getClass());
75-
76-
assertSame(handler, exceptionHandler.getDelegate());
71+
assertSame(handler, loggingHandler.getDelegate());
7772
}
7873

7974
@Test

spring-websocket/src/test/java/org/springframework/web/socket/client/endpoint/StandardWebSocketClientTests.java

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@
3434
import org.springframework.web.socket.WebSocketSession;
3535
import org.springframework.web.socket.adapter.StandardEndpointAdapter;
3636
import org.springframework.web.socket.adapter.WebSocketHandlerAdapter;
37-
import org.springframework.web.socket.client.endpoint.StandardWebSocketClient;
3837

3938
import static org.junit.Assert.*;
4039
import static org.mockito.Mockito.*;
@@ -60,18 +59,15 @@ public void doHandshake() throws Exception {
6059

6160
WebSocketHandler handler = new WebSocketHandlerAdapter();
6261
WebSocketContainer webSocketContainer = mock(WebSocketContainer.class);
63-
StandardWebSocketClient client = new StandardWebSocketClient();
64-
client.setWebSocketContainer(webSocketContainer);
62+
StandardWebSocketClient client = new StandardWebSocketClient(webSocketContainer);
6563
WebSocketSession session = client.doHandshake(handler, headers, uri);
6664

6765
ArgumentCaptor<Endpoint> endpointArg = ArgumentCaptor.forClass(Endpoint.class);
6866
ArgumentCaptor<ClientEndpointConfig> configArg = ArgumentCaptor.forClass(ClientEndpointConfig.class);
6967
ArgumentCaptor<URI> uriArg = ArgumentCaptor.forClass(URI.class);
7068

71-
7269
verify(webSocketContainer).connectToServer(endpointArg.capture(), configArg.capture(), uriArg.capture());
7370

74-
7571
assertNotNull(endpointArg.getValue());
7672
assertEquals(StandardEndpointAdapter.class, endpointArg.getValue().getClass());
7773

@@ -86,4 +82,5 @@ public void doHandshake() throws Exception {
8682
assertEquals(uri, session.getUri());
8783
assertEquals("example.com", session.getRemoteHostName());
8884
}
85+
8986
}

0 commit comments

Comments
 (0)