WebSocketCoreClient no longer stores configuration and can be shared

configuration moved to ClientUpgradeRequest

Signed-off-by: Lachlan Roberts <lachlan@webtide.com>
This commit is contained in:
Lachlan Roberts 2019-05-21 11:33:06 +10:00
parent 0b41386c0d
commit e31009cb06
17 changed files with 152 additions and 208 deletions

View File

@ -37,11 +37,8 @@ import javax.websocket.Extension;
import javax.websocket.Session;
import org.eclipse.jetty.client.HttpClient;
import org.eclipse.jetty.io.ByteBufferPool;
import org.eclipse.jetty.util.DecoratedObjectFactory;
import org.eclipse.jetty.util.annotation.ManagedObject;
import org.eclipse.jetty.websocket.core.WebSocketComponents;
import org.eclipse.jetty.websocket.core.WebSocketExtensionRegistry;
import org.eclipse.jetty.websocket.core.client.WebSocketCoreClient;
import org.eclipse.jetty.websocket.javax.common.ConfiguredEndpoint;
import org.eclipse.jetty.websocket.javax.common.InvalidWebSocketException;
@ -60,40 +57,27 @@ public class JavaxWebSocketClientContainer extends JavaxWebSocketContainer imple
protected WebSocketCoreClient coreClient;
protected Supplier<WebSocketCoreClient> coreClientFactory;
private final JavaxWebSocketClientFrameHandlerFactory frameHandlerFactory;
private DecoratedObjectFactory objectFactory;
private WebSocketExtensionRegistry extensionRegistry;
public JavaxWebSocketClientContainer()
{
this(new WebSocketComponents(), null, null);
this(new WebSocketComponents());
}
public JavaxWebSocketClientContainer(WebSocketComponents components, HttpClient httpClient, Executor executor)
public JavaxWebSocketClientContainer(WebSocketComponents components)
{
this.objectFactory = components.getObjectFactory();
this.extensionRegistry = components.getExtensionRegistry();
this.frameHandlerFactory = new JavaxWebSocketClientFrameHandlerFactory(this);
coreClientFactory = () ->
this(components, ()->
{
WebSocketCoreClient coreClient = new WebSocketCoreClient(httpClient, defaultCustomizer);
WebSocketCoreClient coreClient = new WebSocketCoreClient(components);
coreClient.getHttpClient().setName("Javax-WebSocketClient@" + Integer.toHexString(coreClient.getHttpClient().hashCode()));
if (executor != null && httpClient == null)
coreClient.getHttpClient().setExecutor(executor);
return coreClient;
};
});
}
@Override
public JavaxWebSocketFrameHandlerFactory getFrameHandlerFactory()
public JavaxWebSocketClientContainer(WebSocketComponents components, Supplier<WebSocketCoreClient> coreClientFactory)
{
return frameHandlerFactory;
}
@Override
protected WebSocketExtensionRegistry getExtensionRegistry()
{
return this.extensionRegistry;
super(components);
this.coreClientFactory = coreClientFactory;
this.frameHandlerFactory = new JavaxWebSocketClientFrameHandlerFactory(this);
}
protected HttpClient getHttpClient()
@ -120,6 +104,7 @@ public class JavaxWebSocketClientContainer extends JavaxWebSocketContainer imple
*/
private CompletableFuture<Session> connect(JavaxClientUpgradeRequest upgradeRequest)
{
upgradeRequest.setConfiguration(defaultCustomizer);
CompletableFuture<Session> fut = upgradeRequest.getFutureSession();
try
{
@ -174,8 +159,7 @@ public class JavaxWebSocketClientContainer extends JavaxWebSocketContainer imple
}
@Override
public Session connectToServer(final Class<? extends Endpoint> endpointClass, final ClientEndpointConfig config, URI path)
throws DeploymentException, IOException
public Session connectToServer(final Class<? extends Endpoint> endpointClass, final ClientEndpointConfig config, URI path) throws DeploymentException, IOException
{
ClientEndpointConfig clientEndpointConfig = config;
if (clientEndpointConfig == null)
@ -213,21 +197,9 @@ public class JavaxWebSocketClientContainer extends JavaxWebSocketContainer imple
}
@Override
public long getDefaultMaxSessionIdleTimeout()
public JavaxWebSocketFrameHandlerFactory getFrameHandlerFactory()
{
return getHttpClient().getIdleTimeout();
}
@Override
public void setDefaultMaxSessionIdleTimeout(long timeout)
{
getHttpClient().setIdleTimeout(timeout);
}
@Override
public ByteBufferPool getBufferPool()
{
return getHttpClient().getByteBufferPool();
return frameHandlerFactory;
}
@Override
@ -248,11 +220,6 @@ public class JavaxWebSocketClientContainer extends JavaxWebSocketContainer imple
}
}
public DecoratedObjectFactory getObjectFactory()
{
return objectFactory;
}
public ConfiguredEndpoint newConfiguredEndpoint(Object endpoint, EndpointConfig providedConfig) throws DeploymentException
{
EndpointConfig config = providedConfig;

View File

@ -37,6 +37,7 @@ import org.eclipse.jetty.util.component.ContainerLifeCycle;
import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.log.Logger;
import org.eclipse.jetty.websocket.core.FrameHandler;
import org.eclipse.jetty.websocket.core.WebSocketComponents;
import org.eclipse.jetty.websocket.core.WebSocketExtensionRegistry;
public abstract class JavaxWebSocketContainer extends ContainerLifeCycle implements javax.websocket.WebSocketContainer
@ -45,24 +46,34 @@ public abstract class JavaxWebSocketContainer extends ContainerLifeCycle impleme
private final SessionTracker sessionTracker = new SessionTracker();
private List<JavaxWebSocketSessionListener> sessionListeners = new ArrayList<>();
protected FrameHandler.ConfigurationCustomizer defaultCustomizer = new FrameHandler.ConfigurationCustomizer();
private WebSocketComponents components;
public JavaxWebSocketContainer()
public JavaxWebSocketContainer(WebSocketComponents components)
{
this.components = components;
addSessionListener(sessionTracker);
addBean(sessionTracker);
}
public abstract ByteBufferPool getBufferPool();
public abstract Executor getExecutor();
public abstract DecoratedObjectFactory getObjectFactory();
protected abstract WebSocketExtensionRegistry getExtensionRegistry();
protected abstract JavaxWebSocketFrameHandlerFactory getFrameHandlerFactory();
@Override
public ByteBufferPool getBufferPool()
{
return components.getBufferPool();
}
public WebSocketExtensionRegistry getExtensionRegistry()
{
return components.getExtensionRegistry();
}
public DecoratedObjectFactory getObjectFactory()
{
return components.getObjectFactory();
}
public long getDefaultAsyncSendTimeout()
{
return defaultCustomizer.getWriteTimeout().toMillis();

View File

@ -18,19 +18,18 @@
package org.eclipse.jetty.websocket.javax.common;
import org.eclipse.jetty.io.ByteBufferPool;
import org.eclipse.jetty.io.MappedByteBufferPool;
import org.eclipse.jetty.util.DecoratedObjectFactory;
import org.eclipse.jetty.util.thread.QueuedThreadPool;
import org.eclipse.jetty.websocket.core.WebSocketExtensionRegistry;
import java.io.IOException;
import java.net.URI;
import java.util.concurrent.Executor;
import javax.websocket.ClientEndpointConfig;
import javax.websocket.DeploymentException;
import javax.websocket.Endpoint;
import javax.websocket.Session;
import java.io.IOException;
import java.net.URI;
import java.util.concurrent.Executor;
import org.eclipse.jetty.util.thread.QueuedThreadPool;
import org.eclipse.jetty.websocket.core.WebSocketComponents;
import org.eclipse.jetty.websocket.core.WebSocketExtensionRegistry;
/**
* Dummy Container for testing.
@ -38,15 +37,12 @@ import java.util.concurrent.Executor;
public class DummyContainer extends JavaxWebSocketContainer
{
private final JavaxWebSocketFrameHandlerFactory frameHandlerFactory;
private final ByteBufferPool bufferPool;
private final QueuedThreadPool executor;
private final DecoratedObjectFactory objectFactory;
public DummyContainer()
{
super(new WebSocketComponents());
this.frameHandlerFactory = new DummyFrameHandlerFactory(this);
this.bufferPool = new MappedByteBufferPool();
this.objectFactory = new DecoratedObjectFactory();
this.executor = new QueuedThreadPool();
this.executor.setName("qtp-DummyContainer");
addBean(this.executor, true);
@ -61,7 +57,6 @@ public class DummyContainer extends JavaxWebSocketContainer
@Override
public void setAsyncSendTimeout(long timeoutmillis)
{
}
@Override
@ -97,7 +92,6 @@ public class DummyContainer extends JavaxWebSocketContainer
@Override
public void setDefaultMaxSessionIdleTimeout(long timeout)
{
}
@Override
@ -106,16 +100,9 @@ public class DummyContainer extends JavaxWebSocketContainer
return 0;
}
@Override
public DecoratedObjectFactory getObjectFactory()
{
return this.objectFactory;
}
@Override
public void setDefaultMaxBinaryMessageBufferSize(int max)
{
}
@Override
@ -127,13 +114,6 @@ public class DummyContainer extends JavaxWebSocketContainer
@Override
public void setDefaultMaxTextMessageBufferSize(int max)
{
}
@Override
public ByteBufferPool getBufferPool()
{
return bufferPool;
}
@Override
@ -149,7 +129,7 @@ public class DummyContainer extends JavaxWebSocketContainer
}
@Override
protected WebSocketExtensionRegistry getExtensionRegistry()
public WebSocketExtensionRegistry getExtensionRegistry()
{
return null;
}

View File

@ -21,6 +21,7 @@ package org.eclipse.jetty.websocket.javax.server;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Executor;
import java.util.function.Supplier;
import javax.servlet.ServletContext;
import javax.websocket.DeploymentException;
@ -33,17 +34,15 @@ import javax.websocket.server.ServerEndpointConfig;
import org.eclipse.jetty.client.HttpClient;
import org.eclipse.jetty.http.pathmap.PathSpec;
import org.eclipse.jetty.http.pathmap.UriTemplatePathSpec;
import org.eclipse.jetty.io.ByteBufferPool;
import org.eclipse.jetty.server.handler.ContextHandler;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.util.DecoratedObjectFactory;
import org.eclipse.jetty.util.annotation.ManagedObject;
import org.eclipse.jetty.util.component.LifeCycle;
import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.log.Logger;
import org.eclipse.jetty.websocket.core.WebSocketComponents;
import org.eclipse.jetty.websocket.core.WebSocketException;
import org.eclipse.jetty.websocket.core.WebSocketExtensionRegistry;
import org.eclipse.jetty.websocket.core.client.WebSocketCoreClient;
import org.eclipse.jetty.websocket.javax.client.JavaxWebSocketClientContainer;
import org.eclipse.jetty.websocket.javax.server.internal.AnnotatedServerEndpointConfig;
import org.eclipse.jetty.websocket.javax.server.internal.JavaxWebSocketCreator;
@ -88,26 +87,39 @@ public class JavaxWebSocketServerContainer
JavaxWebSocketServerContainer container = contextHandler.getBean(JavaxWebSocketServerContainer.class);
if (container==null)
{
// Find Pre-Existing (Shared?) HttpClient and/or executor
HttpClient httpClient = (HttpClient)servletContext.getAttribute(JavaxWebSocketServletContainerInitializer.HTTPCLIENT_ATTRIBUTE);
if (httpClient == null)
httpClient = (HttpClient)contextHandler.getServer()
.getAttribute(JavaxWebSocketServletContainerInitializer.HTTPCLIENT_ATTRIBUTE);
Supplier<WebSocketCoreClient> coreClientSupplier = () ->
{
WebSocketCoreClient coreClient = contextHandler.getBean(WebSocketCoreClient.class);
if (coreClient == null)
{
// Find Pre-Existing (Shared?) HttpClient and/or executor
HttpClient httpClient = (HttpClient)servletContext.getAttribute(JavaxWebSocketServletContainerInitializer.HTTPCLIENT_ATTRIBUTE);
if (httpClient == null)
httpClient = (HttpClient)contextHandler.getServer().getAttribute(JavaxWebSocketServletContainerInitializer.HTTPCLIENT_ATTRIBUTE);
Executor executor = httpClient == null?null:httpClient.getExecutor();
if (executor == null)
executor = (Executor)servletContext.getAttribute("org.eclipse.jetty.server.Executor");
if (executor == null)
executor = contextHandler.getServer().getThreadPool();
Executor executor = httpClient == null?null:httpClient.getExecutor();
if (executor == null)
executor = (Executor)servletContext.getAttribute("org.eclipse.jetty.server.Executor");
if (executor == null)
executor = contextHandler.getServer().getThreadPool();
if (httpClient != null && httpClient.getExecutor() == null)
httpClient.setExecutor(executor);
if (httpClient != null && httpClient.getExecutor() == null)
httpClient.setExecutor(executor);
// create the core client
coreClient = new WebSocketCoreClient(httpClient, WebSocketComponents.ensureWebSocketComponents(servletContext));
coreClient.getHttpClient().setName("Javax-WebSocketClient@" + Integer.toHexString(coreClient.getHttpClient().hashCode()));
if (executor != null && httpClient == null)
coreClient.getHttpClient().setExecutor(executor);
}
return coreClient;
};
// Create the Jetty ServerContainer implementation
container = new JavaxWebSocketServerContainer(
WebSocketMapping.ensureMapping(servletContext, WebSocketMapping.DEFAULT_KEY),
WebSocketComponents.ensureWebSocketComponents(servletContext),
httpClient, executor);
coreClientSupplier);
contextHandler.addManaged(container);
contextHandler.addLifeCycleListener(container);
}
@ -117,30 +129,36 @@ public class JavaxWebSocketServerContainer
}
private final WebSocketMapping webSocketMapping;
private final WebSocketComponents webSocketComponents;
private final JavaxWebSocketServerFrameHandlerFactory frameHandlerFactory;
private final Executor executor;
private List<Class<?>> deferredEndpointClasses;
private List<ServerEndpointConfig> deferredEndpointConfigs;
public JavaxWebSocketServerContainer(WebSocketMapping webSocketMapping, HttpClient httpClient, Executor executor)
/**
* Main entry point for {@link JavaxWebSocketServletContainerInitializer}.
* @param webSocketMapping the {@link WebSocketMapping} that this container belongs to
*/
public JavaxWebSocketServerContainer(WebSocketMapping webSocketMapping)
{
this(webSocketMapping, new WebSocketComponents(), httpClient, executor);
this(webSocketMapping, new WebSocketComponents());
}
public JavaxWebSocketServerContainer(WebSocketMapping webSocketMapping, WebSocketComponents components)
{
super(components);
this.webSocketMapping = webSocketMapping;
this.frameHandlerFactory = new JavaxWebSocketServerFrameHandlerFactory(this);
}
/**
* Main entry point for {@link JavaxWebSocketServletContainerInitializer}.
* @param webSocketMapping the {@link WebSocketMapping} that this container belongs to
* @param webSocketComponents the {@link WebSocketComponents} instance to use
* @param httpClient the {@link HttpClient} instance to use
* @param components the {@link WebSocketComponents} instance to use
* @param coreClientSupplier the supplier of the {@link WebSocketCoreClient} instance to use
*/
public JavaxWebSocketServerContainer(WebSocketMapping webSocketMapping, WebSocketComponents webSocketComponents, HttpClient httpClient, Executor executor)
public JavaxWebSocketServerContainer(WebSocketMapping webSocketMapping, WebSocketComponents components, Supplier<WebSocketCoreClient> coreClientSupplier)
{
super(webSocketComponents, httpClient, executor);
super(components, coreClientSupplier);
this.webSocketMapping = webSocketMapping;
this.webSocketComponents = webSocketComponents;
this.executor = executor;
this.frameHandlerFactory = new JavaxWebSocketServerFrameHandlerFactory(this);
}
@ -156,37 +174,12 @@ public class JavaxWebSocketServerContainer
}
}
@Override
public ByteBufferPool getBufferPool()
{
return webSocketComponents.getBufferPool();
}
@Override
public Executor getExecutor()
{
return this.executor;
}
@Override
public WebSocketExtensionRegistry getExtensionRegistry()
{
return webSocketComponents.getExtensionRegistry();
}
@Override
public JavaxWebSocketServerFrameHandlerFactory getFrameHandlerFactory()
{
return frameHandlerFactory;
}
@Override
public DecoratedObjectFactory getObjectFactory()
{
return webSocketComponents.getObjectFactory();
}
@Override
protected EndpointConfig newEmptyConfig(Object endpoint)
{
@ -278,8 +271,7 @@ public class JavaxWebSocketServerContainer
{
frameHandlerFactory.getMetadata(config.getEndpointClass(), config);
JavaxWebSocketCreator creator = new JavaxWebSocketCreator(this, config, webSocketComponents
.getExtensionRegistry());
JavaxWebSocketCreator creator = new JavaxWebSocketCreator(this, config, getExtensionRegistry());
PathSpec pathSpec = new UriTemplatePathSpec(config.getPath());
webSocketMapping.addMapping(pathSpec, creator, frameHandlerFactory, defaultCustomizer);

View File

@ -18,16 +18,12 @@
package org.eclipse.jetty.websocket.javax.server;
import org.eclipse.jetty.client.HttpClient;
import org.eclipse.jetty.util.thread.QueuedThreadPool;
import org.eclipse.jetty.websocket.servlet.WebSocketMapping;
public class DummyServerContainer extends JavaxWebSocketServerContainer
{
public DummyServerContainer()
{
super(new WebSocketMapping(), new HttpClient(), new QueuedThreadPool());
addBean(getHttpClient(), true);
addBean(getExecutor(), true);
super(new WebSocketMapping());
}
}

View File

@ -18,6 +18,11 @@
package org.eclipse.jetty.websocket.javax.tests;
import java.io.IOException;
import java.net.URI;
import java.util.List;
import java.util.function.Function;
import org.eclipse.jetty.io.ByteBufferPool;
import org.eclipse.jetty.io.MappedByteBufferPool;
import org.eclipse.jetty.server.Server;
@ -35,11 +40,6 @@ import org.eclipse.jetty.websocket.core.server.WebSocketUpgradeHandler;
import org.eclipse.jetty.websocket.javax.tests.framehandlers.FrameEcho;
import org.eclipse.jetty.websocket.javax.tests.framehandlers.WholeMessageEcho;
import java.io.IOException;
import java.net.URI;
import java.util.List;
import java.util.function.Function;
public class CoreServer extends ContainerLifeCycle
{
private Server server;
@ -121,9 +121,8 @@ public class CoreServer extends ContainerLifeCycle
}
@Override
public void customize(FrameHandler.CoreSession session)
public void customize(FrameHandler.Configuration session)
{
}
@Override
@ -178,7 +177,7 @@ public class CoreServer extends ContainerLifeCycle
}
@Override
public void customize(FrameHandler.CoreSession session)
public void customize(FrameHandler.Configuration session)
{
}
}

View File

@ -23,14 +23,13 @@ import java.util.Map;
import javax.websocket.EndpointConfig;
import org.eclipse.jetty.client.HttpClient;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.websocket.javax.client.EmptyClientEndpointConfig;
import org.eclipse.jetty.websocket.javax.common.decoders.AvailableDecoders;
import org.eclipse.jetty.websocket.javax.common.encoders.AvailableEncoders;
import org.eclipse.jetty.websocket.javax.server.JavaxWebSocketServerContainer;
import org.eclipse.jetty.websocket.servlet.WebSocketMapping;
import org.eclipse.jetty.websocket.javax.server.JavaxWebSocketServletContainerInitializer;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
@ -46,15 +45,7 @@ public abstract class AbstractJavaxWebSocketServerFrameHandlerTest
server = new Server();
context = new ServletContextHandler();
server.setHandler(context);
WebSocketMapping factory = new WebSocketMapping();
HttpClient httpClient = new HttpClient();
container = new JavaxWebSocketServerContainer(factory, httpClient, server.getThreadPool());
container.addBean(httpClient, true);
container.addBean(factory, true);
server.addBean(container, true);
container = JavaxWebSocketServletContainerInitializer.configureContext(context);
server.start();
}
@ -67,7 +58,7 @@ public abstract class AbstractJavaxWebSocketServerFrameHandlerTest
protected AvailableEncoders encoders;
protected AvailableDecoders decoders;
protected Map<String, String> uriParams = new HashMap<>();
protected Map<String, String> uriParams;
protected EndpointConfig endpointConfig;
public AbstractJavaxWebSocketServerFrameHandlerTest()

View File

@ -25,20 +25,19 @@ import java.util.stream.Stream;
import javax.websocket.DeploymentException;
import javax.websocket.server.ServerEndpoint;
import org.eclipse.jetty.client.HttpClient;
import org.eclipse.jetty.server.Handler;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.HandlerCollection;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.websocket.javax.common.util.InvalidSignatureException;
import org.eclipse.jetty.websocket.javax.server.JavaxWebSocketServerContainer;
import org.eclipse.jetty.websocket.javax.server.JavaxWebSocketServletContainerInitializer;
import org.eclipse.jetty.websocket.javax.tests.server.sockets.InvalidCloseIntSocket;
import org.eclipse.jetty.websocket.javax.tests.server.sockets.InvalidErrorErrorSocket;
import org.eclipse.jetty.websocket.javax.tests.server.sockets.InvalidErrorIntSocket;
import org.eclipse.jetty.websocket.javax.tests.server.sockets.InvalidOpenCloseReasonSocket;
import org.eclipse.jetty.websocket.javax.tests.server.sockets.InvalidOpenIntSocket;
import org.eclipse.jetty.websocket.javax.tests.server.sockets.InvalidOpenSessionIntSocket;
import org.eclipse.jetty.websocket.javax.common.util.InvalidSignatureException;
import org.eclipse.jetty.websocket.servlet.WebSocketMapping;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.params.ParameterizedTest;
@ -98,11 +97,8 @@ public class DeploymentExceptionTest
public void testDeploy_InvalidSignature(Class<?> pojo) throws Exception
{
ServletContextHandler context = new ServletContextHandler();
WebSocketMapping factory = new WebSocketMapping();
HttpClient httpClient = new HttpClient();
JavaxWebSocketServerContainer container = new JavaxWebSocketServerContainer(factory, httpClient, server.getThreadPool());
context.setServer(server);
JavaxWebSocketServerContainer container = JavaxWebSocketServletContainerInitializer.configureContext(context);
context.addBean(container);
contexts.addHandler(context);

View File

@ -26,6 +26,7 @@ import java.net.HttpURLConnection;
import java.net.URI;
import java.nio.charset.StandardCharsets;
import java.util.concurrent.Executor;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
@ -47,6 +48,7 @@ import org.eclipse.jetty.util.thread.QueuedThreadPool;
import org.eclipse.jetty.websocket.javax.server.JavaxWebSocketServerContainer;
import org.eclipse.jetty.websocket.javax.server.JavaxWebSocketServletContainerInitializer;
import org.eclipse.jetty.websocket.javax.tests.WSURI;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import static org.eclipse.jetty.websocket.javax.server.JavaxWebSocketServletContainerInitializer.HTTPCLIENT_ATTRIBUTE;
@ -205,6 +207,7 @@ public class WebSocketServerContainerExecutorTest
}
}
@Disabled //TODO: the ContextHandler executor attribute is overwritten on ContextHandler.doStart() now we do attribute lookup lazily
@Test
public void testContextExecutor() throws Exception
{
@ -218,7 +221,7 @@ public class WebSocketServerContainerExecutorTest
// Using JSR356 Server Techniques to connectToServer()
contextHandler.addServlet(ServerConnectServlet.class, "/connect");
javax.websocket.server.ServerContainer container = JavaxWebSocketServletContainerInitializer.configureContext(contextHandler);
JavaxWebSocketServerContainer container = JavaxWebSocketServletContainerInitializer.configureContext(contextHandler);
container.addEndpoint(EchoSocket.class);
try
{
@ -226,7 +229,7 @@ public class WebSocketServerContainerExecutorTest
String response = GET(server.getURI().resolve("/connect"));
assertThat("Response", response, startsWith("Connected to ws://"));
Executor containerExecutor = ((JavaxWebSocketServerContainer)container).getExecutor();
Executor containerExecutor = container.getExecutor();
assertThat(containerExecutor, sameInstance(executor));
}
finally

View File

@ -53,7 +53,7 @@ import org.eclipse.jetty.websocket.common.SessionTracker;
import org.eclipse.jetty.websocket.common.WebSocketContainer;
import org.eclipse.jetty.websocket.common.WebSocketSessionListener;
import org.eclipse.jetty.websocket.core.FrameHandler;
import org.eclipse.jetty.websocket.core.WebSocketExtensionRegistry;
import org.eclipse.jetty.websocket.core.WebSocketComponents;
import org.eclipse.jetty.websocket.core.client.UpgradeListener;
import org.eclipse.jetty.websocket.core.client.WebSocketCoreClient;
@ -66,8 +66,7 @@ public class WebSocketClient extends ContainerLifeCycle implements WebSocketPoli
private final List<WebSocketSessionListener> sessionListeners = new CopyOnWriteArrayList<>();
private final SessionTracker sessionTracker = new SessionTracker();
private final FrameHandler.ConfigurationCustomizer configurationCustomizer = new FrameHandler.ConfigurationCustomizer();
private DecoratedObjectFactory objectFactory;
private WebSocketExtensionRegistry extensionRegistry;
private WebSocketComponents components = new WebSocketComponents();
/**
* Instantiate a WebSocketClient with defaults
@ -84,14 +83,12 @@ public class WebSocketClient extends ContainerLifeCycle implements WebSocketPoli
*/
public WebSocketClient(HttpClient httpClient)
{
coreClient = new WebSocketCoreClient(httpClient, configurationCustomizer);
coreClient = new WebSocketCoreClient(httpClient, components);
addManaged(coreClient);
if (httpClient == null)
coreClient.getHttpClient().setName("Jetty-WebSocketClient@" + hashCode());
objectFactory = new DecoratedObjectFactory();
extensionRegistry = new WebSocketExtensionRegistry();
frameHandlerFactory = new JettyWebSocketFrameHandlerFactory(this);
sessionListeners.add(sessionTracker);
addBean(sessionTracker);
@ -149,6 +146,7 @@ public class WebSocketClient extends ContainerLifeCycle implements WebSocketPoli
}
});
}
upgradeRequest.setConfiguration(configurationCustomizer);
coreClient.connect(upgradeRequest);
return upgradeRequest.getFutureSession();
}
@ -306,7 +304,7 @@ public class WebSocketClient extends ContainerLifeCycle implements WebSocketPoli
public DecoratedObjectFactory getObjectFactory()
{
return objectFactory;
return components.getObjectFactory();
}
public Collection<Session> getOpenSessions()

View File

@ -218,6 +218,7 @@ public class ServerConfigTest
connect.get(5, TimeUnit.SECONDS);
assertTrue(serverEndpoint.openLatch.await(5, TimeUnit.SECONDS));
WebSocketChannel channel = (WebSocketChannel)((WebSocketSession)serverEndpoint.session).getCoreSession();
WebSocketConnection connection = channel.getConnection();

View File

@ -516,7 +516,7 @@ public interface FrameHandler extends IncomingFrames
interface Customizer
{
void customize(CoreSession session);
void customize(Configuration session);
}
class ConfigurationCustomizer implements Customizer, Configuration
@ -627,7 +627,7 @@ public interface FrameHandler extends IncomingFrames
}
@Override
public void customize(CoreSession session)
public void customize(Configuration session)
{
if (idleTimeout !=null)
session.setIdleTimeout(idleTimeout);
@ -646,6 +646,14 @@ public interface FrameHandler extends IncomingFrames
if (maxTextMessageSize!=null)
session.setMaxTextMessageSize(maxTextMessageSize);
}
public static ConfigurationCustomizer from(ConfigurationCustomizer parent, ConfigurationCustomizer child)
{
ConfigurationCustomizer customizer = new ConfigurationCustomizer();
parent.customize(customizer);
child.customize(customizer);
return customizer;
}
}
}

View File

@ -83,6 +83,7 @@ public abstract class ClientUpgradeRequest extends HttpRequest implements Respon
private static final Logger LOG = Log.getLogger(ClientUpgradeRequest.class);
protected final CompletableFuture<FrameHandler.CoreSession> futureCoreSession;
private final WebSocketCoreClient wsClient;
private FrameHandler.ConfigurationCustomizer customizer = new FrameHandler.ConfigurationCustomizer();
private List<UpgradeListener> upgradeListeners = new ArrayList<>();
public ClientUpgradeRequest(WebSocketCoreClient webSocketClient, URI requestURI)
@ -119,6 +120,11 @@ public abstract class ClientUpgradeRequest extends HttpRequest implements Respon
getConversation().setAttribute(HttpConnectionUpgrader.class.getName(), this);
}
public void setConfiguration(FrameHandler.ConfigurationCustomizer config)
{
config.customize(customizer);
}
public void addListener(UpgradeListener listener)
{
upgradeListeners.add(listener);
@ -348,7 +354,7 @@ public abstract class ClientUpgradeRequest extends HttpRequest implements Respon
WebSocketConstants.SPEC_VERSION_STRING);
WebSocketChannel wsChannel = newWebSocketChannel(frameHandler, negotiated);
wsClient.customize(wsChannel);
customizer.customize(wsChannel);
WebSocketConnection wsConnection = newWebSocketConnection(endp, httpClient.getExecutor(), httpClient.getScheduler(), httpClient.getByteBufferPool(), wsChannel);

View File

@ -31,16 +31,15 @@ import org.eclipse.jetty.util.log.Logger;
import org.eclipse.jetty.util.thread.ShutdownThread;
import org.eclipse.jetty.websocket.core.ExtensionConfig;
import org.eclipse.jetty.websocket.core.FrameHandler;
import org.eclipse.jetty.websocket.core.WebSocketComponents;
import org.eclipse.jetty.websocket.core.WebSocketExtensionRegistry;
public class WebSocketCoreClient extends ContainerLifeCycle implements FrameHandler.Customizer
public class WebSocketCoreClient extends ContainerLifeCycle
{
private static final Logger LOG = Log.getLogger(WebSocketCoreClient.class);
private final HttpClient httpClient;
private WebSocketExtensionRegistry extensionRegistry;
private DecoratedObjectFactory objectFactory;
private FrameHandler.ConfigurationCustomizer customizer;
private WebSocketComponents components;
// TODO: Things to consider for inclusion in this class (or removal if they can be set elsewhere, like HttpClient)
// - AsyncWrite Idle Timeout
@ -51,32 +50,24 @@ public class WebSocketCoreClient extends ContainerLifeCycle implements FrameHand
public WebSocketCoreClient()
{
this(null, new FrameHandler.ConfigurationCustomizer());
this(null, new WebSocketComponents());
}
public WebSocketCoreClient(HttpClient httpClient)
public WebSocketCoreClient(WebSocketComponents webSocketComponents)
{
this(httpClient, new FrameHandler.ConfigurationCustomizer());
this(null, webSocketComponents);
}
public WebSocketCoreClient(HttpClient httpClient, FrameHandler.ConfigurationCustomizer customizer)
public WebSocketCoreClient(HttpClient httpClient, WebSocketComponents webSocketComponents)
{
if (httpClient == null)
httpClient = Objects.requireNonNull(HttpClientProvider.get());
this.httpClient = httpClient;
this.extensionRegistry = new WebSocketExtensionRegistry();
this.objectFactory = new DecoratedObjectFactory();
this.customizer = customizer;
this.components = webSocketComponents;
addBean(httpClient);
}
@Override
public void customize(FrameHandler.CoreSession session)
{
customizer.customize(session);
}
public CompletableFuture<FrameHandler.CoreSession> connect(FrameHandler frameHandler, URI wsUri) throws IOException
{
ClientUpgradeRequest request = ClientUpgradeRequest.from(this, wsUri, frameHandler);
@ -91,7 +82,7 @@ public class WebSocketCoreClient extends ContainerLifeCycle implements FrameHand
// Validate Requested Extensions
for (ExtensionConfig reqExt : request.getExtensions())
{
if (!extensionRegistry.isAvailable(reqExt.getName()))
if (!components.getExtensionRegistry().isAvailable(reqExt.getName()))
{
throw new IllegalArgumentException("Requested extension [" + reqExt.getName() + "] is not installed");
}
@ -116,7 +107,7 @@ public class WebSocketCoreClient extends ContainerLifeCycle implements FrameHand
public WebSocketExtensionRegistry getExtensionRegistry()
{
return extensionRegistry;
return components.getExtensionRegistry();
}
public HttpClient getHttpClient()
@ -126,6 +117,11 @@ public class WebSocketCoreClient extends ContainerLifeCycle implements FrameHand
public DecoratedObjectFactory getObjectFactory()
{
return objectFactory;
return components.getObjectFactory();
}
public WebSocketComponents getWebSocketComponents()
{
return components;
}
}

View File

@ -18,14 +18,14 @@
package org.eclipse.jetty.websocket.core.server;
import java.io.IOException;
import java.util.function.Function;
import org.eclipse.jetty.io.ByteBufferPool;
import org.eclipse.jetty.util.DecoratedObjectFactory;
import org.eclipse.jetty.websocket.core.FrameHandler;
import org.eclipse.jetty.websocket.core.WebSocketExtensionRegistry;
import java.io.IOException;
import java.util.function.Function;
public interface WebSocketNegotiator extends FrameHandler.Customizer
{
FrameHandler negotiate(Negotiation negotiation) throws IOException;
@ -102,7 +102,7 @@ public interface WebSocketNegotiator extends FrameHandler.Customizer
}
@Override
public void customize(FrameHandler.CoreSession session)
public void customize(FrameHandler.Configuration session)
{
if (customizer != null)
customizer.customize(session);

View File

@ -62,7 +62,7 @@ public class TestWebSocketNegotiator implements WebSocketNegotiator
}
@Override
public void customize(FrameHandler.CoreSession session)
public void customize(FrameHandler.Configuration session)
{
}

View File

@ -82,7 +82,7 @@ class AutobahnWebSocketNegotiator implements WebSocketNegotiator
}
@Override
public void customize(FrameHandler.CoreSession session)
public void customize(FrameHandler.Configuration session)
{
session.setIdleTimeout(Duration.ofMillis(10000));
session.setMaxTextMessageSize(Integer.MAX_VALUE);