Issue #3849 - only notify onError for local errors

Signed-off-by: Lachlan Roberts <lachlan@webtide.com>
This commit is contained in:
Lachlan Roberts 2019-07-05 16:06:56 +10:00
parent 9902794988
commit 9449008581
3 changed files with 41 additions and 4 deletions

View File

@ -22,7 +22,6 @@ import java.io.IOException;
import java.net.SocketAddress;
import java.net.SocketTimeoutException;
import java.net.URI;
import java.nio.channels.ClosedChannelException;
import java.time.Duration;
import java.util.ArrayDeque;
import java.util.List;
@ -317,7 +316,7 @@ public class WebSocketCoreSession implements IncomingFrames, FrameHandler.CoreSe
connection.close();
// Forward Errors to Local WebSocket EndPoint
if (closeStatus.isAbnormal())
if (closeStatus.isAbnormal() && closeStatus.getCause() != null)
{
Callback errorCallback = Callback.from(() ->
{
@ -332,7 +331,7 @@ public class WebSocketCoreSession implements IncomingFrames, FrameHandler.CoreSe
}
});
Throwable cause = closeStatus.getCause() != null ? closeStatus.getCause() : new ClosedChannelException();
Throwable cause = closeStatus.getCause();
try
{
handler.onError(cause, errorCallback);

View File

@ -18,6 +18,8 @@
package org.eclipse.jetty.websocket.core.internal;
import java.nio.channels.ClosedChannelException;
import org.eclipse.jetty.websocket.core.CloseStatus;
import org.eclipse.jetty.websocket.core.Frame;
import org.eclipse.jetty.websocket.core.OpCode;
@ -133,7 +135,7 @@ public class WebSocketSessionState
default:
if (_closeStatus == null || CloseStatus.isOrdinary(_closeStatus.getCode()))
_closeStatus = new CloseStatus(CloseStatus.NO_CLOSE, "Session Closed");
_closeStatus = new CloseStatus(CloseStatus.NO_CLOSE, "Session Closed", new ClosedChannelException());
_sessionState = State.CLOSED;
return true;
}

View File

@ -20,6 +20,7 @@ package org.eclipse.jetty.websocket.core.proxy;
import java.io.IOException;
import java.net.URI;
import java.nio.channels.ClosedChannelException;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.CountDownLatch;
@ -281,6 +282,23 @@ class WebSocketProxy
if (LOG.isDebugEnabled())
LOG.debug("[{}] onClosed {}", toString(), closeStatus);
boolean abnormalClose = false;
synchronized (lock)
{
switch (state)
{
case CLOSED:
break;
default:
abnormalClose = true;
break;
}
}
if (abnormalClose)
server2Proxy.fail(new ClosedChannelException(), Callback.NOOP);
closed.countDown();
callback.succeeded();
}
@ -568,6 +586,24 @@ class WebSocketProxy
{
if (LOG.isDebugEnabled())
LOG.debug("[{}] onClosed {}", toString(), closeStatus);
boolean abnormalClose = false;
synchronized (lock)
{
switch (state)
{
case CLOSED:
break;
default:
abnormalClose = true;
break;
}
}
if (abnormalClose)
client2Proxy.fail(new ClosedChannelException(), Callback.NOOP);
closed.countDown();
callback.succeeded();
}