1212import io .jooby .WebSocketCloseStatus ;
1313import io .jooby .WebSocketConfigurer ;
1414import io .jooby .WebSocketMessage ;
15+ import org .eclipse .jetty .websocket .api .CloseException ;
1516import org .eclipse .jetty .websocket .api .RemoteEndpoint ;
1617import org .eclipse .jetty .websocket .api .Session ;
1718import org .eclipse .jetty .websocket .api .WebSocketListener ;
1819import org .eclipse .jetty .websocket .api .WriteCallback ;
19- import org .eclipse .jetty .websocket .servlet .ServletUpgradeRequest ;
2020
2121import javax .annotation .Nonnull ;
2222import java .nio .charset .StandardCharsets ;
2626import java .util .concurrent .ConcurrentHashMap ;
2727import java .util .concurrent .ConcurrentMap ;
2828import java .util .concurrent .CopyOnWriteArrayList ;
29+ import java .util .concurrent .TimeoutException ;
2930
3031public class JettyWebSocket implements WebSocketListener , WebSocketConfigurer , WebSocket ,
3132 WriteCallback {
@@ -36,6 +37,7 @@ public class JettyWebSocket implements WebSocketListener, WebSocketConfigurer, W
3637
3738 private final JettyContext ctx ;
3839 private final String key ;
40+ private final String path ;
3941 private Session session ;
4042 private WebSocket .OnConnect onConnectCallback ;
4143 private WebSocket .OnMessage onMessageCallback ;
@@ -44,6 +46,7 @@ public class JettyWebSocket implements WebSocketListener, WebSocketConfigurer, W
4446
4547 public JettyWebSocket (JettyContext ctx ) {
4648 this .ctx = ctx ;
49+ this .path = ctx .pathString ();
4750 this .key = ctx .getRoute ().getPattern ();
4851 }
4952
@@ -82,19 +85,29 @@ public JettyWebSocket(JettyContext ctx) {
8285
8386 @ Override public void onWebSocketError (Throwable x ) {
8487 // should close?
85- if (Server .connectionLost (x ) || SneakyThrows .isFatal (x )) {
86- handleClose (WebSocketCloseStatus .SERVER_ERROR );
87- }
88+ if (!isTimeout (x )) {
89+ if (Server .connectionLost (x ) || SneakyThrows .isFatal (x )) {
90+ handleClose (WebSocketCloseStatus .SERVER_ERROR );
91+ }
8892
89- if (onErrorCallback == null ) {
90- ctx .getRouter ().getLog ().error ("Websocket resulted in exception: {}" , ctx .pathString (), x );
91- } else {
92- onErrorCallback .onError (this , x );
93+ if (onErrorCallback == null ) {
94+ ctx .getRouter ().getLog ().error ("Websocket resulted in exception: {}" , path , x );
95+ } else {
96+ onErrorCallback .onError (this , x );
97+ }
98+
99+ if (SneakyThrows .isFatal (x )) {
100+ throw SneakyThrows .propagate (x );
101+ }
93102 }
103+ }
94104
95- if (SneakyThrows .isFatal (x )) {
96- throw SneakyThrows .propagate (x );
105+ private boolean isTimeout (Throwable x ) {
106+ if (x instanceof CloseException ) {
107+ Throwable cause = x .getCause ();
108+ return cause instanceof TimeoutException ;
97109 }
110+ return false ;
98111 }
99112
100113 @ Nonnull @ Override public WebSocketConfigurer onConnect (
@@ -181,7 +194,7 @@ public JettyWebSocket(JettyContext ctx) {
181194 }
182195
183196 @ Override public void writeFailed (Throwable x ) {
184- ctx .getRouter ().getLog ().error ("Websocket resulted in exception: {}" , ctx . pathString () , x );
197+ ctx .getRouter ().getLog ().error ("Websocket resulted in exception: {}" , path , x );
185198 }
186199
187200 @ Override public void writeSuccess () {
0 commit comments