Issue #3412 - fix WebSocketClient configuration methods

WebSocketClient implements WebSocketPolicy but the methods were never
wired through to use the websocket core FrameHandler.Customizer

the WSClient now has a ConfigurationCustomizer which it uses to
configure the WebSocketCoreClient

Signed-off-by: lachan-roberts <lachlan@webtide.com>
This commit is contained in:
lachan-roberts 2019-03-06 11:50:04 +11:00
parent 16fa1133d7
commit 13f8202c06

View File

@ -33,6 +33,7 @@ import java.util.function.Consumer;
import org.eclipse.jetty.client.HttpClient; import org.eclipse.jetty.client.HttpClient;
import org.eclipse.jetty.io.ByteBufferPool; import org.eclipse.jetty.io.ByteBufferPool;
import org.eclipse.jetty.io.Connection;
import org.eclipse.jetty.util.DecoratedObjectFactory; import org.eclipse.jetty.util.DecoratedObjectFactory;
import org.eclipse.jetty.util.component.ContainerLifeCycle; import org.eclipse.jetty.util.component.ContainerLifeCycle;
import org.eclipse.jetty.util.log.Log; import org.eclipse.jetty.util.log.Log;
@ -49,6 +50,7 @@ import org.eclipse.jetty.websocket.common.JettyWebSocketFrameHandlerFactory;
import org.eclipse.jetty.websocket.common.SessionTracker; import org.eclipse.jetty.websocket.common.SessionTracker;
import org.eclipse.jetty.websocket.common.WebSocketContainer; import org.eclipse.jetty.websocket.common.WebSocketContainer;
import org.eclipse.jetty.websocket.common.WebSocketSessionListener; 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.WebSocketExtensionRegistry;
import org.eclipse.jetty.websocket.core.client.UpgradeListener; import org.eclipse.jetty.websocket.core.client.UpgradeListener;
import org.eclipse.jetty.websocket.core.client.WebSocketCoreClient; import org.eclipse.jetty.websocket.core.client.WebSocketCoreClient;
@ -61,23 +63,17 @@ public class WebSocketClient extends ContainerLifeCycle implements WebSocketPoli
private final JettyWebSocketFrameHandlerFactory frameHandlerFactory; private final JettyWebSocketFrameHandlerFactory frameHandlerFactory;
private final List<WebSocketSessionListener> sessionListeners = new CopyOnWriteArrayList<>(); private final List<WebSocketSessionListener> sessionListeners = new CopyOnWriteArrayList<>();
private final SessionTracker sessionTracker = new SessionTracker(); private final SessionTracker sessionTracker = new SessionTracker();
private ClassLoader contextClassLoader; private final FrameHandler.ConfigurationCustomizer configurationCustomizer = new FrameHandler.ConfigurationCustomizer();
private DecoratedObjectFactory objectFactory; private DecoratedObjectFactory objectFactory;
private WebSocketExtensionRegistry extensionRegistry; private WebSocketExtensionRegistry extensionRegistry;
private int inputBufferSize = 4 * 1024;
private int outputBufferSize = 4 * 1024;
private long maxBinaryMessageSize = 64 * 1024;
private long maxTextMessageSize = 64 * 1024;
/** /**
* Instantiate a WebSocketClient with defaults * Instantiate a WebSocketClient with defaults
*/ */
public WebSocketClient() public WebSocketClient()
{ {
this(new WebSocketCoreClient()); this(null);
this.coreClient.getHttpClient().setName("Jetty-WebSocketClient@" + hashCode()); coreClient.getHttpClient().setName("Jetty-WebSocketClient@" + hashCode());
// We created WebSocketCoreClient, let lifecycle be managed by us
addManaged(coreClient);
} }
/** /**
@ -87,19 +83,13 @@ public class WebSocketClient extends ContainerLifeCycle implements WebSocketPoli
*/ */
public WebSocketClient(HttpClient httpClient) public WebSocketClient(HttpClient httpClient)
{ {
this(new WebSocketCoreClient(httpClient)); coreClient = new WebSocketCoreClient(httpClient, configurationCustomizer);
// We created WebSocketCoreClient, let lifecycle be managed by us
addManaged(coreClient); addManaged(coreClient);
}
private WebSocketClient(WebSocketCoreClient coreClient) objectFactory = new DecoratedObjectFactory();
{ extensionRegistry = new WebSocketExtensionRegistry();
this.coreClient = coreClient; frameHandlerFactory = new JettyWebSocketFrameHandlerFactory(this);
this.contextClassLoader = this.getClass().getClassLoader(); sessionListeners.add(sessionTracker);
this.objectFactory = new DecoratedObjectFactory();
this.extensionRegistry = new WebSocketExtensionRegistry();
this.frameHandlerFactory = new JettyWebSocketFrameHandlerFactory(this);
this.sessionListeners.add(sessionTracker);
addBean(sessionTracker); addBean(sessionTracker);
} }
@ -134,6 +124,9 @@ public class WebSocketClient extends ContainerLifeCycle implements WebSocketPoli
*/ */
public CompletableFuture<Session> connect(Object websocket, URI toUri, UpgradeRequest request, UpgradeListener listener) throws IOException public CompletableFuture<Session> connect(Object websocket, URI toUri, UpgradeRequest request, UpgradeListener listener) throws IOException
{ {
for (Connection.Listener listener : getBeans(Connection.Listener.class))
coreClient.addBean(listener);
JettyClientUpgradeRequest upgradeRequest = new JettyClientUpgradeRequest(this, coreClient, request, toUri, websocket); JettyClientUpgradeRequest upgradeRequest = new JettyClientUpgradeRequest(this, coreClient, request, toUri, websocket);
if (listener != null) if (listener != null)
upgradeRequest.addListener(listener); upgradeRequest.addListener(listener);
@ -184,61 +177,61 @@ public class WebSocketClient extends ContainerLifeCycle implements WebSocketPoli
@Override @Override
public Duration getIdleTimeout() public Duration getIdleTimeout()
{ {
return Duration.ofMillis(getHttpClient().getIdleTimeout()); return configurationCustomizer.getIdleTimeout();
} }
@Override @Override
public int getInputBufferSize() public int getInputBufferSize()
{ {
return this.inputBufferSize; return configurationCustomizer.getInputBufferSize();
} }
@Override @Override
public int getOutputBufferSize() public int getOutputBufferSize()
{ {
return this.outputBufferSize; return configurationCustomizer.getOutputBufferSize();
} }
@Override @Override
public long getMaxBinaryMessageSize() public long getMaxBinaryMessageSize()
{ {
return this.maxBinaryMessageSize; return configurationCustomizer.getMaxBinaryMessageSize();
} }
@Override @Override
public long getMaxTextMessageSize() public long getMaxTextMessageSize()
{ {
return this.maxTextMessageSize; return configurationCustomizer.getMaxTextMessageSize();
} }
@Override @Override
public void setIdleTimeout(Duration duration) public void setIdleTimeout(Duration duration)
{ {
getHttpClient().setIdleTimeout(duration.toMillis()); configurationCustomizer.setIdleTimeout(duration);
} }
@Override @Override
public void setInputBufferSize(int size) public void setInputBufferSize(int size)
{ {
this.inputBufferSize = size; configurationCustomizer.setInputBufferSize(size);
} }
@Override @Override
public void setOutputBufferSize(int size) public void setOutputBufferSize(int size)
{ {
this.outputBufferSize = size; configurationCustomizer.setOutputBufferSize(size);
} }
@Override @Override
public void setMaxBinaryMessageSize(long size) public void setMaxBinaryMessageSize(long size)
{ {
this.maxBinaryMessageSize = size; configurationCustomizer.setMaxBinaryMessageSize(size);
} }
@Override @Override
public void setMaxTextMessageSize(long size) public void setMaxTextMessageSize(long size)
{ {
this.maxTextMessageSize = size; configurationCustomizer.setMaxTextMessageSize(size);
} }
public SocketAddress getBindAddress() public SocketAddress getBindAddress()