Skip to content

Commit f04c037

Browse files
authored
Merge pull request jooby-project#2220 from jooby-project/2210
WebSocket enhancements
2 parents 782c2aa + e105611 commit f04c037

File tree

3 files changed

+43
-29
lines changed

3 files changed

+43
-29
lines changed

jooby/src/main/java/io/jooby/Server.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -139,8 +139,10 @@ static boolean connectionLost(@Nullable Throwable cause) {
139139
String message = cause.getMessage();
140140
if (message != null) {
141141
String msg = message.toLowerCase();
142-
return msg.contains("reset by peer") || msg.contains("broken pipe") || msg
143-
.contains("forcibly closed");
142+
return msg.contains("reset by peer")
143+
|| msg.contains("broken pipe")
144+
|| msg.contains("forcibly closed")
145+
|| msg.contains("connection reset");
144146
}
145147
}
146148
return (cause instanceof ClosedChannelException) || (cause instanceof EOFException);

modules/jooby-netty/src/main/java/io/jooby/internal/netty/NettyWebSocket.java

Lines changed: 25 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,17 @@
55
*/
66
package io.jooby.internal.netty;
77

8+
import java.nio.charset.StandardCharsets;
9+
import java.util.ArrayList;
10+
import java.util.Collections;
11+
import java.util.List;
12+
import java.util.concurrent.ConcurrentHashMap;
13+
import java.util.concurrent.ConcurrentMap;
14+
import java.util.concurrent.CopyOnWriteArrayList;
15+
import java.util.concurrent.CountDownLatch;
16+
17+
import javax.annotation.Nonnull;
18+
819
import io.jooby.Context;
920
import io.jooby.Router;
1021
import io.jooby.Server;
@@ -24,16 +35,6 @@
2435
import io.netty.handler.codec.http.websocketx.WebSocketFrame;
2536
import io.netty.util.AttributeKey;
2637

27-
import javax.annotation.Nonnull;
28-
import java.nio.charset.StandardCharsets;
29-
import java.util.ArrayList;
30-
import java.util.Collections;
31-
import java.util.List;
32-
import java.util.concurrent.ConcurrentHashMap;
33-
import java.util.concurrent.ConcurrentMap;
34-
import java.util.concurrent.CopyOnWriteArrayList;
35-
import java.util.concurrent.CountDownLatch;
36-
3738
public class NettyWebSocket implements WebSocketConfigurer, WebSocket, ChannelFutureListener {
3839
/** All connected websocket. */
3940
private static final ConcurrentMap<String, List<NettyWebSocket>> all = new ConcurrentHashMap<>();
@@ -155,20 +156,22 @@ void handleFrame(WebSocketFrame frame) {
155156

156157
private void handleMessage(WebSocketFrame frame) {
157158
try {
158-
if (frame.isFinalFragment()) {
159-
ByteBuf content;
160-
if (buffer != null) {
161-
buffer.writeBytes(frame.content());
162-
content = buffer;
163-
buffer = null;
159+
if (messageCallback != null) {
160+
if (frame.isFinalFragment()) {
161+
ByteBuf content;
162+
if (buffer != null) {
163+
buffer.writeBytes(frame.content());
164+
content = buffer;
165+
buffer = null;
166+
} else {
167+
content = frame.content();
168+
}
169+
WebSocketMessage message = WebSocketMessage.create(getContext(), array(content));
170+
171+
fireCallback(webSocketTask(() -> messageCallback.onMessage(this, message), false));
164172
} else {
165-
content = frame.content();
173+
buffer = Unpooled.copiedBuffer(frame.content());
166174
}
167-
WebSocketMessage message = WebSocketMessage.create(getContext(), array(content));
168-
169-
fireCallback(webSocketTask(() -> messageCallback.onMessage(this, message), false));
170-
} else {
171-
buffer = Unpooled.copiedBuffer(frame.content());
172175
}
173176
} finally {
174177
frame.release();

modules/jooby-utow/src/main/java/io/jooby/internal/utow/UtowWebSocket.java

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -198,12 +198,19 @@ private void dispatch(Runnable runnable) {
198198
@Override protected void onError(WebSocketChannel channel, Throwable x) {
199199
// should close?
200200
if (Server.connectionLost(x) || SneakyThrows.isFatal(x)) {
201-
handleClose(WebSocketCloseStatus.SERVER_ERROR);
201+
if (channel.isOpen()) {
202+
handleClose(WebSocketCloseStatus.SERVER_ERROR);
203+
}
202204
}
203205

204206
if (onErrorCallback == null) {
205-
ctx.getRouter().getLog()
206-
.error("Websocket resulted in exception: {}", ctx.getRequestPath(), x);
207+
if (Server.connectionLost(x)) {
208+
ctx.getRouter().getLog()
209+
.debug("Websocket connection lost: {}", ctx.getRequestPath(), x);
210+
} else {
211+
ctx.getRouter().getLog()
212+
.error("Websocket resulted in exception: {}", ctx.getRequestPath(), x);
213+
}
207214
} else {
208215
onErrorCallback.onError(this, x);
209216
}
@@ -215,8 +222,10 @@ private void dispatch(Runnable runnable) {
215222

216223
@Override protected void onCloseMessage(CloseMessage cm,
217224
WebSocketChannel channel) {
218-
handleClose(WebSocketCloseStatus.valueOf(cm.getCode())
219-
.orElseGet(() -> new WebSocketCloseStatus(cm.getCode(), cm.getReason())));
225+
if (channel.isOpen()) {
226+
handleClose(WebSocketCloseStatus.valueOf(cm.getCode())
227+
.orElseGet(() -> new WebSocketCloseStatus(cm.getCode(), cm.getReason())));
228+
}
220229
}
221230

222231
private void handleClose(WebSocketCloseStatus closeStatus) {

0 commit comments

Comments
 (0)