Fixing failed upgrade due to invalid request websocket version
This commit is contained in:
parent
e30e5976b4
commit
9de009c1b2
|
@ -36,6 +36,7 @@ import org.eclipse.jetty.websocket.annotations.WebSocket;
|
||||||
import org.eclipse.jetty.websocket.api.EventMethodsCache;
|
import org.eclipse.jetty.websocket.api.EventMethodsCache;
|
||||||
import org.eclipse.jetty.websocket.api.ExtensionConfig;
|
import org.eclipse.jetty.websocket.api.ExtensionConfig;
|
||||||
import org.eclipse.jetty.websocket.api.WebSocketEventDriver;
|
import org.eclipse.jetty.websocket.api.WebSocketEventDriver;
|
||||||
|
import org.eclipse.jetty.websocket.api.WebSocketException;
|
||||||
import org.eclipse.jetty.websocket.api.WebSocketPolicy;
|
import org.eclipse.jetty.websocket.api.WebSocketPolicy;
|
||||||
import org.eclipse.jetty.websocket.extensions.Extension;
|
import org.eclipse.jetty.websocket.extensions.Extension;
|
||||||
import org.eclipse.jetty.websocket.extensions.deflate.DeflateFrameExtension;
|
import org.eclipse.jetty.websocket.extensions.deflate.DeflateFrameExtension;
|
||||||
|
@ -47,7 +48,7 @@ import org.eclipse.jetty.websocket.server.handshake.HandshakeRFC6455;
|
||||||
/**
|
/**
|
||||||
* Factory to create WebSocket connections
|
* Factory to create WebSocket connections
|
||||||
*/
|
*/
|
||||||
public class WebSocketServerFactory extends AbstractLifeCycle
|
public class WebSocketServerFactory extends AbstractLifeCycle implements WebSocketCreator
|
||||||
{
|
{
|
||||||
private static final Logger LOG = Log.getLogger(WebSocketServerFactory.class);
|
private static final Logger LOG = Log.getLogger(WebSocketServerFactory.class);
|
||||||
private final Queue<AsyncWebSocketConnection> connections = new ConcurrentLinkedQueue<AsyncWebSocketConnection>();
|
private final Queue<AsyncWebSocketConnection> connections = new ConcurrentLinkedQueue<AsyncWebSocketConnection>();
|
||||||
|
@ -70,11 +71,13 @@ public class WebSocketServerFactory extends AbstractLifeCycle
|
||||||
private WebSocketPolicy basePolicy;
|
private WebSocketPolicy basePolicy;
|
||||||
private WebSocketCreator creator;
|
private WebSocketCreator creator;
|
||||||
private EventMethodsCache methodsCache;
|
private EventMethodsCache methodsCache;
|
||||||
|
private Class<?> firstRegisteredClass;
|
||||||
|
|
||||||
public WebSocketServerFactory(WebSocketPolicy policy)
|
public WebSocketServerFactory(WebSocketPolicy policy)
|
||||||
{
|
{
|
||||||
this.basePolicy = policy;
|
this.basePolicy = policy;
|
||||||
this.methodsCache = new EventMethodsCache();
|
this.methodsCache = new EventMethodsCache();
|
||||||
|
this.creator = this;
|
||||||
|
|
||||||
// Create supportedVersions
|
// Create supportedVersions
|
||||||
List<Integer> versions = new ArrayList<>();
|
List<Integer> versions = new ArrayList<>();
|
||||||
|
@ -132,6 +135,29 @@ public class WebSocketServerFactory extends AbstractLifeCycle
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object createWebSocket(WebSocketRequest req, WebSocketResponse resp)
|
||||||
|
{
|
||||||
|
if (methodsCache.count() < 1)
|
||||||
|
{
|
||||||
|
throw new WebSocketException("No WebSockets have been registered with the factory. Cannot use default implementation of WebSocketCreator.");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (methodsCache.count() > 1)
|
||||||
|
{
|
||||||
|
LOG.warn("You have registered more than 1 websocket object, and are using the default WebSocketCreator! Using first registered websocket.");
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
return firstRegisteredClass.newInstance();
|
||||||
|
}
|
||||||
|
catch (InstantiationException | IllegalAccessException e)
|
||||||
|
{
|
||||||
|
throw new WebSocketException("Unable to create instance of " + firstRegisteredClass,e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void doStop() throws Exception
|
protected void doStop() throws Exception
|
||||||
{
|
{
|
||||||
|
@ -247,6 +273,10 @@ public class WebSocketServerFactory extends AbstractLifeCycle
|
||||||
|
|
||||||
public void register(Class<?> websocketClass)
|
public void register(Class<?> websocketClass)
|
||||||
{
|
{
|
||||||
|
if (firstRegisteredClass == null)
|
||||||
|
{
|
||||||
|
firstRegisteredClass = websocketClass;
|
||||||
|
}
|
||||||
methodsCache.register(websocketClass);
|
methodsCache.register(websocketClass);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -44,7 +44,7 @@ import org.junit.Test;
|
||||||
public class WebSocketServletRFCTest
|
public class WebSocketServletRFCTest
|
||||||
{
|
{
|
||||||
@SuppressWarnings("serial")
|
@SuppressWarnings("serial")
|
||||||
private static class RFCServlet extends WebSocketServlet
|
public static class RFCServlet extends WebSocketServlet
|
||||||
{
|
{
|
||||||
@Override
|
@Override
|
||||||
public void registerWebSockets(WebSocketServerFactory factory)
|
public void registerWebSockets(WebSocketServerFactory factory)
|
||||||
|
@ -53,7 +53,7 @@ public class WebSocketServletRFCTest
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class RFCSocket extends WebSocketAdapter
|
public static class RFCSocket extends WebSocketAdapter
|
||||||
{
|
{
|
||||||
@Override
|
@Override
|
||||||
public void onWebSocketText(String message)
|
public void onWebSocketText(String message)
|
||||||
|
@ -204,8 +204,9 @@ public class WebSocketServletRFCTest
|
||||||
ByteBuffer txtbuf = bufferPool.acquire(policy.getBufferSize(),false);
|
ByteBuffer txtbuf = bufferPool.acquire(policy.getBufferSize(),false);
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
BufferUtil.flipToFill(txtbuf);
|
||||||
generator.generate(txtbuf,txt);
|
generator.generate(txtbuf,txt);
|
||||||
txtbuf.flip();
|
BufferUtil.flipToFlush(txtbuf,0);
|
||||||
|
|
||||||
// Write Text Frame
|
// Write Text Frame
|
||||||
BufferUtil.writeTo(txtbuf,out);
|
BufferUtil.writeTo(txtbuf,out);
|
||||||
|
@ -219,10 +220,11 @@ public class WebSocketServletRFCTest
|
||||||
ByteBuffer rbuf = bufferPool.acquire(policy.getBufferSize(),false);
|
ByteBuffer rbuf = bufferPool.acquire(policy.getBufferSize(),false);
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
BufferUtil.flipToFill(rbuf);
|
||||||
read(in,rbuf);
|
read(in,rbuf);
|
||||||
|
|
||||||
// Parse Frame
|
// Parse Frame
|
||||||
rbuf.flip();
|
BufferUtil.flipToFlush(rbuf,0);
|
||||||
parser.parse(rbuf);
|
parser.parse(rbuf);
|
||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
|
|
Loading…
Reference in New Issue