GH-3813: ClientWebSocketContainer URI setting (#8561)

* GH-3813: ClientWebSocketContainer URI setting

Fixes https://github.com/spring-projects/spring-integration/issues/3813

Introduce a `ClientWebSocketContainer(WebSocketClient client, URI uri)` ctor
to let end-user to decide what and how should be encoded the URI for WebSocket connection

* Fix language in docs

Co-authored-by: Gary Russell <grussell@vmware.com>

---------

Co-authored-by: Gary Russell <grussell@vmware.com>
This commit is contained in:
Artem Bilan
2023-02-22 14:05:53 -05:00
committed by GitHub
parent 86b4ad5258
commit fe9b59ea01
4 changed files with 36 additions and 8 deletions

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2014-2022 the original author or authors.
* Copyright 2014-2023 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -16,6 +16,7 @@
package org.springframework.integration.websocket;
import java.net.URI;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CountDownLatch;
@@ -56,14 +57,14 @@ public final class ClientWebSocketContainer extends IntegrationWebSocketContaine
private final IntegrationWebSocketConnectionManager connectionManager;
private int connectionTimeout = DEFAULT_CONNECTION_TIMEOUT;
private volatile CountDownLatch connectionLatch;
private volatile WebSocketSession clientSession;
private volatile Throwable openConnectionException;
private volatile int connectionTimeout = DEFAULT_CONNECTION_TIMEOUT;
private volatile boolean connecting;
public ClientWebSocketContainer(WebSocketClient client, String uriTemplate, Object... uriVariables) {
@@ -71,6 +72,17 @@ public final class ClientWebSocketContainer extends IntegrationWebSocketContaine
this.connectionManager = new IntegrationWebSocketConnectionManager(client, uriTemplate, uriVariables);
}
/**
* Constructor with a prepared {@link URI}.
* @param client the {@link WebSocketClient} to use.
* @param uri the url to connect to
* @since 6.1
*/
public ClientWebSocketContainer(WebSocketClient client, URI uri) {
Assert.notNull(client, "'client' must not be null");
this.connectionManager = new IntegrationWebSocketConnectionManager(client, uri);
}
public void setOrigin(String origin) {
this.headers.setOrigin(origin);
}
@@ -204,13 +216,18 @@ public final class ClientWebSocketContainer extends IntegrationWebSocketContaine
private final boolean syncClientLifecycle;
IntegrationWebSocketConnectionManager(WebSocketClient client, String uriTemplate,
Object... uriVariables) {
IntegrationWebSocketConnectionManager(WebSocketClient client, String uriTemplate, Object... uriVariables) {
super(uriTemplate, uriVariables);
this.client = client;
this.syncClientLifecycle = ((client instanceof Lifecycle) && !((Lifecycle) client).isRunning());
}
IntegrationWebSocketConnectionManager(WebSocketClient client, URI uri) {
super(uri);
this.client = client;
this.syncClientLifecycle = ((client instanceof Lifecycle) && !((Lifecycle) client).isRunning());
}
@Override
public void startInternal() {
if (this.syncClientLifecycle) {

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2014-2022 the original author or authors.
* Copyright 2014-2023 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -93,7 +93,7 @@ public class ClientWebSocketContainerTests {
webSocketClient.setUserProperties(userProperties);
ClientWebSocketContainer container =
new ClientWebSocketContainer(webSocketClient, server.getWsBaseUrl() + "/ws/websocket");
new ClientWebSocketContainer(webSocketClient, new URI(server.getWsBaseUrl() + "/ws/websocket"));
TestWebSocketListener messageListener = new TestWebSocketListener();
container.setMessageListener(messageListener);