Skip to content

Commit feef4a7

Browse files
committed
Polishing
1 parent 6c48a83 commit feef4a7

File tree

4 files changed

+52
-39
lines changed

4 files changed

+52
-39
lines changed

spring-core/src/main/java/org/springframework/core/io/buffer/JettyDataBuffer.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -305,6 +305,22 @@ public String toString(int index, int length, Charset charset) {
305305
return this.delegate.toString(index, length, charset);
306306
}
307307

308+
@Override
309+
public int hashCode() {
310+
return this.delegate.hashCode();
311+
}
312+
313+
@Override
314+
public boolean equals(Object o) {
315+
return this == o || (o instanceof JettyDataBuffer other &&
316+
this.delegate.equals(other.delegate));
317+
}
318+
319+
@Override
320+
public String toString() {
321+
return String.format("JettyDataBuffer (r: %d, w: %d, c: %d)",
322+
readPosition(), writePosition(), capacity());
323+
}
308324

309325
private static final class JettyByteBufferIterator implements ByteBufferIterator {
310326

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

Lines changed: 18 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,12 @@
1919
import java.nio.ByteBuffer;
2020
import java.nio.charset.Charset;
2121
import java.nio.charset.StandardCharsets;
22-
import java.util.Objects;
2322
import java.util.function.Function;
2423
import java.util.function.IntPredicate;
2524

2625
import org.eclipse.jetty.util.BufferUtil;
2726
import org.eclipse.jetty.websocket.api.Callback;
2827
import org.eclipse.jetty.websocket.api.Session;
29-
import org.reactivestreams.Subscriber;
30-
import org.reactivestreams.Subscription;
3128

3229
import org.springframework.core.io.buffer.CloseableDataBuffer;
3330
import org.springframework.core.io.buffer.DataBuffer;
@@ -47,15 +44,16 @@
4744
* @author Rossen Stoyanchev
4845
* @since 5.0
4946
*/
50-
@SuppressWarnings("NullAway")
5147
public class JettyWebSocketHandlerAdapter implements Session.Listener {
48+
5249
private final WebSocketHandler delegateHandler;
5350

5451
private final Function<Session, JettyWebSocketSession> sessionFactory;
5552

5653
@Nullable
5754
private JettyWebSocketSession delegateSession;
5855

56+
5957
public JettyWebSocketHandlerAdapter(WebSocketHandler handler,
6058
Function<Session, JettyWebSocketSession> sessionFactory) {
6159

@@ -67,32 +65,16 @@ public JettyWebSocketHandlerAdapter(WebSocketHandler handler,
6765

6866
@Override
6967
public void onWebSocketOpen(Session session) {
70-
this.delegateSession = Objects.requireNonNull(this.sessionFactory.apply(session));
71-
this.delegateHandler.handle(this.delegateSession)
72-
.subscribe(new Subscriber<>() {
73-
@Override
74-
public void onSubscribe(Subscription s) {
75-
s.request(Long.MAX_VALUE);
76-
}
77-
78-
@Override
79-
public void onNext(Void unused) {
80-
}
81-
82-
@Override
83-
public void onError(Throwable t) {
84-
delegateSession.onHandlerError(t);
85-
}
86-
87-
@Override
88-
public void onComplete() {
89-
delegateSession.onHandleComplete();
90-
}
91-
});
68+
JettyWebSocketSession delegateSession = this.sessionFactory.apply(session);
69+
this.delegateSession = delegateSession;
70+
this.delegateHandler.handle(delegateSession)
71+
.checkpoint(session.getUpgradeRequest().getRequestURI() + " [JettyWebSocketHandlerAdapter]")
72+
.subscribe(unused -> {}, delegateSession::onHandlerError, delegateSession::onHandleComplete);
9273
}
9374

9475
@Override
9576
public void onWebSocketText(String message) {
77+
Assert.state(this.delegateSession != null, "No delegate session available");
9678
byte[] bytes = message.getBytes(StandardCharsets.UTF_8);
9779
DataBuffer buffer = this.delegateSession.bufferFactory().wrap(bytes);
9880
WebSocketMessage webSocketMessage = new WebSocketMessage(Type.TEXT, buffer);
@@ -101,37 +83,42 @@ public void onWebSocketText(String message) {
10183

10284
@Override
10385
public void onWebSocketBinary(ByteBuffer byteBuffer, Callback callback) {
86+
Assert.state(this.delegateSession != null, "No delegate session available");
10487
DataBuffer buffer = this.delegateSession.bufferFactory().wrap(byteBuffer);
105-
buffer = new JettyDataBuffer(buffer, callback);
88+
buffer = new JettyCallbackDataBuffer(buffer, callback);
10689
WebSocketMessage webSocketMessage = new WebSocketMessage(Type.BINARY, buffer);
10790
this.delegateSession.handleMessage(webSocketMessage);
10891
}
10992

11093
@Override
11194
public void onWebSocketPong(ByteBuffer payload) {
95+
Assert.state(this.delegateSession != null, "No delegate session available");
11296
DataBuffer buffer = this.delegateSession.bufferFactory().wrap(BufferUtil.copy(payload));
11397
WebSocketMessage webSocketMessage = new WebSocketMessage(Type.PONG, buffer);
11498
this.delegateSession.handleMessage(webSocketMessage);
11599
}
116100

117101
@Override
118102
public void onWebSocketClose(int statusCode, String reason) {
103+
Assert.state(this.delegateSession != null, "No delegate session available");
119104
this.delegateSession.handleClose(CloseStatus.create(statusCode, reason));
120105
}
121106

122107
@Override
123108
public void onWebSocketError(Throwable cause) {
109+
Assert.state(this.delegateSession != null, "No delegate session available");
124110
this.delegateSession.handleError(cause);
125111
}
126112

127113

128-
private static final class JettyDataBuffer implements CloseableDataBuffer {
114+
private static final class JettyCallbackDataBuffer implements CloseableDataBuffer {
129115

130116
private final DataBuffer delegate;
131117

132118
private final Callback callback;
133119

134-
public JettyDataBuffer(DataBuffer delegate, Callback callback) {
120+
121+
public JettyCallbackDataBuffer(DataBuffer delegate, Callback callback) {
135122
Assert.notNull(delegate, "'delegate` must not be null");
136123
Assert.notNull(callback, "Callback must not be null");
137124
this.delegate = delegate;
@@ -266,13 +253,13 @@ public DataBuffer write(ByteBuffer... buffers) {
266253
@Deprecated
267254
public DataBuffer slice(int index, int length) {
268255
DataBuffer delegateSlice = this.delegate.slice(index, length);
269-
return new JettyDataBuffer(delegateSlice, this.callback);
256+
return new JettyCallbackDataBuffer(delegateSlice, this.callback);
270257
}
271258

272259
@Override
273260
public DataBuffer split(int index) {
274261
DataBuffer delegateSplit = this.delegate.split(index);
275-
return new JettyDataBuffer(delegateSplit, this.callback);
262+
return new JettyCallbackDataBuffer(delegateSplit, this.callback);
276263
}
277264

278265
@Override

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,13 @@
5353
public class JettyWebSocketSession extends AbstractWebSocketSession<Session> {
5454

5555
private final Flux<WebSocketMessage> flux;
56+
5657
private final Sinks.One<CloseStatus> closeStatusSink = Sinks.one();
58+
5759
private final Lock lock = new ReentrantLock();
60+
5861
private long requested = 0;
62+
5963
private boolean awaitingMessage = false;
6064

6165
@Nullable

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

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -39,16 +39,18 @@
3939
* @author Rossen Stoyanchev
4040
* @since 4.0
4141
*/
42-
@SuppressWarnings("NullAway")
4342
public class JettyWebSocketHandlerAdapter implements Session.Listener {
43+
4444
private static final Log logger = LogFactory.getLog(JettyWebSocketHandlerAdapter.class);
4545

4646
private final WebSocketHandler webSocketHandler;
47+
4748
private final JettyWebSocketSession wsSession;
4849

4950
@Nullable
5051
private Session nativeSession;
5152

53+
5254
public JettyWebSocketHandlerAdapter(WebSocketHandler webSocketHandler, JettyWebSocketSession wsSession) {
5355
Assert.notNull(webSocketHandler, "WebSocketHandler must not be null");
5456
Assert.notNull(wsSession, "WebSocketSession must not be null");
@@ -71,6 +73,7 @@ public void onWebSocketOpen(Session session) {
7173

7274
@Override
7375
public void onWebSocketText(String payload) {
76+
Assert.state(this.nativeSession != null, "No native session available");
7477
TextMessage message = new TextMessage(payload);
7578
try {
7679
this.webSocketHandler.handleMessage(this.wsSession, message);
@@ -83,6 +86,7 @@ public void onWebSocketText(String payload) {
8386

8487
@Override
8588
public void onWebSocketBinary(ByteBuffer payload, Callback callback) {
89+
Assert.state(this.nativeSession != null, "No native session available");
8690
BinaryMessage message = new BinaryMessage(BufferUtil.copy(payload), true);
8791
callback.succeed();
8892
try {
@@ -96,6 +100,7 @@ public void onWebSocketBinary(ByteBuffer payload, Callback callback) {
96100

97101
@Override
98102
public void onWebSocketPong(ByteBuffer payload) {
103+
Assert.state(this.nativeSession != null, "No native session available");
99104
PongMessage message = new PongMessage(BufferUtil.copy(payload));
100105
try {
101106
this.webSocketHandler.handleMessage(this.wsSession, message);
@@ -132,13 +137,14 @@ public void onWebSocketError(Throwable cause) {
132137
}
133138

134139
private void tryCloseWithError(Throwable t) {
135-
136-
if (this.nativeSession.isOpen()) {
137-
ExceptionWebSocketHandlerDecorator.tryCloseWithError(this.wsSession, t, logger);
138-
}
139-
else {
140-
// Session might be O-SHUT waiting for response close frame, so abort to close the connection.
141-
this.nativeSession.disconnect();
140+
if (this.nativeSession != null) {
141+
if (this.nativeSession.isOpen()) {
142+
ExceptionWebSocketHandlerDecorator.tryCloseWithError(this.wsSession, t, logger);
143+
}
144+
else {
145+
// Session might be O-SHUT waiting for response close frame, so abort to close the connection.
146+
this.nativeSession.disconnect();
147+
}
142148
}
143149
}
144150
}

0 commit comments

Comments
 (0)