Skip to content

Commit bcf6f6e

Browse files
committed
Refactoring in reactive WebSocketSession and adapters
The WebSocketHander adapters are now neutral for client vs server-side use with the adapters for RxNetty and Reactor Netty (server-side only) completely removed. A new HandshakeInfo carries information about the handshake including URI, headers, and principal from the upgrade strategy, to the adapter, and then to the session. WebSocketSession exposes the HandshakeInfo as well reducing its overall number of methods.
1 parent edcf049 commit bcf6f6e

21 files changed

+224
-196
lines changed

spring-web-reactive/src/main/java/org/springframework/web/reactive/socket/WebSocketSession.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
package org.springframework.web.reactive.socket;
1717

1818
import java.net.URI;
19+
import java.security.Principal;
20+
import java.util.Optional;
1921
import java.util.function.Function;
2022

2123
import org.reactivestreams.Publisher;
@@ -24,6 +26,8 @@
2426

2527
import org.springframework.core.io.buffer.DataBuffer;
2628
import org.springframework.core.io.buffer.DataBufferFactory;
29+
import org.springframework.http.HttpHeaders;
30+
import org.springframework.web.reactive.socket.adapter.HandshakeInfo;
2731

2832
/**
2933
* Representation for a WebSocket session.
@@ -39,13 +43,13 @@ public interface WebSocketSession {
3943
String getId();
4044

4145
/**
42-
* Return the WebSocket endpoint URI.
46+
* Return information from the handshake request.
4347
*/
44-
URI getUri();
48+
HandshakeInfo getHandshakeInfo();
4549

4650
/**
47-
* Return a {@link DataBufferFactory} that can be used for creating message payloads.
48-
* @return a buffer factory
51+
* Return a {@code DataBuffer} Factory to create message payloads.
52+
* @return the buffer factory for the session
4953
*/
5054
DataBufferFactory bufferFactory();
5155

spring-web-reactive/src/main/java/org/springframework/web/reactive/socket/adapter/AbstractListenerWebSocketSession.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
package org.springframework.web.reactive.socket.adapter;
1818

1919
import java.io.IOException;
20-
import java.net.URI;
2120
import java.util.concurrent.atomic.AtomicBoolean;
2221

2322
import org.reactivestreams.Publisher;
@@ -55,8 +54,10 @@ public abstract class AbstractListenerWebSocketSession<T> extends WebSocketSessi
5554
private final AtomicBoolean sendCalled = new AtomicBoolean();
5655

5756

58-
public AbstractListenerWebSocketSession(T delegate, String id, URI uri, DataBufferFactory bufferFactory) {
59-
super(delegate, id, uri, bufferFactory);
57+
public AbstractListenerWebSocketSession(T delegate, String id, HandshakeInfo handshakeInfo,
58+
DataBufferFactory bufferFactory) {
59+
60+
super(delegate, id, handshakeInfo, bufferFactory);
6061
}
6162

6263

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
/*
2+
* Copyright 2002-2016 the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package org.springframework.web.reactive.socket.adapter;
17+
18+
import java.net.URI;
19+
import java.security.Principal;
20+
21+
import reactor.core.publisher.Mono;
22+
23+
import org.springframework.http.HttpHeaders;
24+
import org.springframework.util.Assert;
25+
26+
/**
27+
* Simple container of information from a WebSocket handshake request.
28+
*
29+
* @author Rossen Stoyanchev
30+
* @since 5.0
31+
*/
32+
public class HandshakeInfo {
33+
34+
private final URI uri;
35+
36+
private final HttpHeaders headers;
37+
38+
private final Mono<Principal> principal;
39+
40+
41+
public HandshakeInfo(URI uri, HttpHeaders headers, Mono<Principal> principal) {
42+
Assert.notNull(uri, "URI is required.");
43+
Assert.notNull(headers, "HttpHeaders are required.");
44+
Assert.notNull(principal, "Prinicpal is required.");
45+
this.uri = uri;
46+
this.headers = headers;
47+
this.principal = principal;
48+
}
49+
50+
51+
public URI getUri() {
52+
return this.uri;
53+
}
54+
55+
public HttpHeaders getHeaders() {
56+
return this.headers;
57+
}
58+
59+
public Mono<Principal> getPrincipal() {
60+
return this.principal;
61+
}
62+
63+
@Override
64+
public String toString() {
65+
return "HandshakeInfo[uri=" + this.uri + ", headers=" + this.headers + "]";
66+
}
67+
68+
}

spring-web-reactive/src/main/java/org/springframework/web/reactive/socket/adapter/JettyWebSocketHandlerAdapter.java

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,7 @@
3232
import org.reactivestreams.Subscription;
3333

3434
import org.springframework.core.io.buffer.DataBuffer;
35-
import org.springframework.http.server.reactive.ServerHttpRequest;
36-
import org.springframework.http.server.reactive.ServerHttpResponse;
35+
import org.springframework.core.io.buffer.DataBufferFactory;
3736
import org.springframework.web.reactive.socket.CloseStatus;
3837
import org.springframework.web.reactive.socket.WebSocketHandler;
3938
import org.springframework.web.reactive.socket.WebSocketMessage;
@@ -54,17 +53,16 @@ public class JettyWebSocketHandlerAdapter extends WebSocketHandlerAdapterSupport
5453
private JettyWebSocketSession session;
5554

5655

57-
public JettyWebSocketHandlerAdapter(ServerHttpRequest request, ServerHttpResponse response,
56+
public JettyWebSocketHandlerAdapter(HandshakeInfo handshakeInfo, DataBufferFactory bufferFactory,
5857
WebSocketHandler delegate) {
5958

60-
super(request, response, delegate);
59+
super(handshakeInfo, bufferFactory, delegate);
6160
}
6261

6362

6463
@OnWebSocketConnect
6564
public void onWebSocketConnect(Session session) {
66-
this.session = new JettyWebSocketSession(session, getUri(), getBufferFactory());
67-
65+
this.session = new JettyWebSocketSession(session, getHandshakeInfo(), getBufferFactory());
6866
HandlerResultSubscriber subscriber = new HandlerResultSubscriber();
6967
getDelegate().handle(this.session).subscribe(subscriber);
7068
}

spring-web-reactive/src/main/java/org/springframework/web/reactive/socket/adapter/JettyWebSocketSession.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
package org.springframework.web.reactive.socket.adapter;
1818

1919
import java.io.IOException;
20-
import java.net.URI;
2120
import java.nio.ByteBuffer;
2221
import java.nio.charset.StandardCharsets;
2322

@@ -41,8 +40,8 @@
4140
public class JettyWebSocketSession extends AbstractListenerWebSocketSession<Session> {
4241

4342

44-
public JettyWebSocketSession(Session session, URI uri, DataBufferFactory bufferFactory) {
45-
super(session, ObjectUtils.getIdentityHexString(session), uri, bufferFactory);
43+
public JettyWebSocketSession(Session session, HandshakeInfo info, DataBufferFactory bufferFactory) {
44+
super(session, ObjectUtils.getIdentityHexString(session), info, bufferFactory);
4645
}
4746

4847

spring-web-reactive/src/main/java/org/springframework/web/reactive/socket/adapter/NettyWebSocketSessionSupport.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
*/
1616
package org.springframework.web.reactive.socket.adapter;
1717

18-
import java.net.URI;
1918
import java.util.HashMap;
2019
import java.util.List;
2120
import java.util.Map;
@@ -54,8 +53,8 @@ public abstract class NettyWebSocketSessionSupport<T> extends WebSocketSessionSu
5453
}
5554

5655

57-
protected NettyWebSocketSessionSupport(T delegate, URI uri, NettyDataBufferFactory bufferFactory) {
58-
super(delegate, ObjectUtils.getIdentityHexString(delegate), uri, bufferFactory);
56+
protected NettyWebSocketSessionSupport(T delegate, HandshakeInfo info, NettyDataBufferFactory factory) {
57+
super(delegate, ObjectUtils.getIdentityHexString(delegate), info, factory);
5958
}
6059

6160

spring-web-reactive/src/main/java/org/springframework/web/reactive/socket/adapter/ReactorNettyWebSocketHandlerAdapter.java

Lines changed: 0 additions & 53 deletions
This file was deleted.

spring-web-reactive/src/main/java/org/springframework/web/reactive/socket/adapter/ReactorNettyWebSocketSession.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,6 @@
1515
*/
1616
package org.springframework.web.reactive.socket.adapter;
1717

18-
import java.net.URI;
19-
2018
import io.netty.handler.codec.http.websocketx.WebSocketFrame;
2119
import org.reactivestreams.Publisher;
2220
import reactor.core.publisher.Flux;
@@ -42,10 +40,10 @@ public class ReactorNettyWebSocketSession
4240
extends NettyWebSocketSessionSupport<ReactorNettyWebSocketSession.WebSocketConnection> {
4341

4442

45-
protected ReactorNettyWebSocketSession(WebsocketInbound inbound, WebsocketOutbound outbound,
46-
URI uri, NettyDataBufferFactory factory) {
43+
public ReactorNettyWebSocketSession(WebsocketInbound inbound, WebsocketOutbound outbound,
44+
HandshakeInfo handshakeInfo, NettyDataBufferFactory bufferFactory) {
4745

48-
super(new WebSocketConnection(inbound, outbound), uri, factory);
46+
super(new WebSocketConnection(inbound, outbound), handshakeInfo, bufferFactory);
4947
}
5048

5149

spring-web-reactive/src/main/java/org/springframework/web/reactive/socket/adapter/RxNettyWebSocketHandlerAdapter.java

Lines changed: 0 additions & 52 deletions
This file was deleted.

spring-web-reactive/src/main/java/org/springframework/web/reactive/socket/adapter/RxNettyWebSocketSession.java

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

1717
package org.springframework.web.reactive.socket.adapter;
1818

19-
import java.net.URI;
20-
2119
import io.netty.handler.codec.http.websocketx.WebSocketFrame;
2220
import io.reactivex.netty.protocol.http.ws.WebSocketConnection;
2321
import org.reactivestreams.Publisher;
@@ -41,8 +39,8 @@
4139
public class RxNettyWebSocketSession extends NettyWebSocketSessionSupport<WebSocketConnection> {
4240

4341

44-
public RxNettyWebSocketSession(WebSocketConnection conn, URI uri, NettyDataBufferFactory factory) {
45-
super(conn, uri, factory);
42+
public RxNettyWebSocketSession(WebSocketConnection conn, HandshakeInfo info, NettyDataBufferFactory factory) {
43+
super(conn, info, factory);
4644
}
4745

4846

0 commit comments

Comments
 (0)