Skip to content

Commit 4731c87

Browse files
[Java] Don't call onClose when WebSocket connection is not open (#28004)
1 parent 4b46b26 commit 4731c87

File tree

2 files changed

+46
-18
lines changed

2 files changed

+46
-18
lines changed

src/SignalR/clients/java/signalr/core/src/main/java/com/microsoft/signalr/OkHttpWebSocketWrapper.java

Lines changed: 46 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ class OkHttpWebSocketWrapper extends WebSocketWrapper {
3030
private WebSocketOnClosedCallback onClose;
3131
private CompletableSubject startSubject = CompletableSubject.create();
3232
private CompletableSubject closeSubject = CompletableSubject.create();
33-
private final ReentrantLock closeLock = new ReentrantLock();
33+
private final ReentrantLock stateLock = new ReentrantLock();
3434

3535
private final Logger logger = LoggerFactory.getLogger(OkHttpWebSocketWrapper.class);
3636

@@ -82,7 +82,12 @@ public void setOnClose(WebSocketOnClosedCallback onClose) {
8282
private class SignalRWebSocketListener extends WebSocketListener {
8383
@Override
8484
public void onOpen(WebSocket webSocket, Response response) {
85-
startSubject.onComplete();
85+
stateLock.lock();
86+
try {
87+
startSubject.onComplete();
88+
} finally {
89+
stateLock.unlock();
90+
}
8691
}
8792

8893
@Override
@@ -97,39 +102,64 @@ public void onMessage(WebSocket webSocket, ByteString bytes) {
97102

98103
@Override
99104
public void onClosing(WebSocket webSocket, int code, String reason) {
100-
onClose.invoke(code, reason);
105+
boolean isOpen = false;
106+
stateLock.lock();
107+
try {
108+
isOpen = startSubject.hasComplete();
109+
} finally {
110+
stateLock.unlock();
111+
}
112+
113+
logger.info("WebSocket closing with status code '{}' and reason '{}'.", code, reason);
114+
115+
// Only call onClose if connection is open
116+
if (isOpen) {
117+
onClose.invoke(code, reason);
118+
}
119+
101120
try {
102-
closeLock.lock();
121+
stateLock.lock();
103122
closeSubject.onComplete();
104123
}
105124
finally {
106-
closeLock.unlock();
125+
stateLock.unlock();
107126
}
108-
checkStartFailure();
127+
checkStartFailure(null);
109128
}
110129

111130
@Override
112131
public void onFailure(WebSocket webSocket, Throwable t, Response response) {
113-
logger.error("WebSocket closed from an error: {}.", t.getMessage());
132+
logger.error("WebSocket closed from an error.", t);
114133

134+
boolean isOpen = false;
115135
try {
116-
closeLock.lock();
136+
stateLock.lock();
117137
if (!closeSubject.hasComplete()) {
118138
closeSubject.onError(new RuntimeException(t));
119139
}
140+
141+
isOpen = startSubject.hasComplete();
120142
}
121143
finally {
122-
closeLock.unlock();
144+
stateLock.unlock();
123145
}
124-
onClose.invoke(null, t.getMessage());
125-
checkStartFailure();
146+
// Only call onClose if connection is open
147+
if (isOpen) {
148+
onClose.invoke(null, t.getMessage());
149+
}
150+
checkStartFailure(t);
126151
}
127152

128-
private void checkStartFailure() {
129-
// If the start task hasn't completed yet, then we need to complete it
130-
// exceptionally.
131-
if (!startSubject.hasComplete()) {
132-
startSubject.onError(new RuntimeException("There was an error starting the WebSocket transport."));
153+
private void checkStartFailure(Throwable t) {
154+
stateLock.lock();
155+
try {
156+
// If the start task hasn't completed yet, then we need to complete it
157+
// exceptionally.
158+
if (!startSubject.hasComplete()) {
159+
startSubject.onError(new RuntimeException("There was an error starting the WebSocket transport.", t));
160+
}
161+
} finally {
162+
stateLock.unlock();
133163
}
134164
}
135165
}

src/SignalR/clients/java/signalr/core/src/main/java/com/microsoft/signalr/WebSocketTransport.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,8 +86,6 @@ public Completable stop() {
8686
}
8787

8888
void onClose(Integer code, String reason) {
89-
logger.info("WebSocket connection stopping with " +
90-
"code {} and reason '{}'.", code, reason);
9189
if (code == null || code != 1000) {
9290
onClose.invoke(reason);
9391
}

0 commit comments

Comments
 (0)