Skip to content

Commit 13b18f6

Browse files
committed
Make URI-to-ClientParameters conversion public
1 parent c30e6cf commit 13b18f6

File tree

4 files changed

+91
-53
lines changed

4 files changed

+91
-53
lines changed

src/main/java/com/rabbitmq/stream/impl/Client.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@
119119
import java.net.ConnectException;
120120
import java.net.InetSocketAddress;
121121
import java.net.SocketAddress;
122+
import java.net.URI;
122123
import java.nio.charset.Charset;
123124
import java.nio.charset.StandardCharsets;
124125
import java.time.Duration;
@@ -2467,6 +2468,11 @@ static ClientParameters cp() {
24672468
return new ClientParameters();
24682469
}
24692470

2471+
public static ClientParameters maybeSetUpClientParametersFromUris(
2472+
List<URI> uris, ClientParameters clientParametersPrototype) {
2473+
return Utils.maybeSetUpClientParametersFromUris(uris, clientParametersPrototype);
2474+
}
2475+
24702476
public static class ClientParameters {
24712477

24722478
private final Map<String, String> clientProperties = new ConcurrentHashMap<>();

src/main/java/com/rabbitmq/stream/impl/StreamEnvironment.java

Lines changed: 1 addition & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
import static com.rabbitmq.stream.impl.AsyncRetry.asyncRetry;
1818
import static com.rabbitmq.stream.impl.Client.DEFAULT_RPC_TIMEOUT;
19+
import static com.rabbitmq.stream.impl.Client.maybeSetUpClientParametersFromUris;
1920
import static com.rabbitmq.stream.impl.ThreadUtils.threadFactory;
2021
import static com.rabbitmq.stream.impl.Utils.AVAILABLE_PROCESSORS;
2122
import static com.rabbitmq.stream.impl.Utils.DEFAULT_ADDRESS_RESOLVER;
@@ -65,9 +66,7 @@
6566
import io.netty.channel.EventLoopGroup;
6667
import io.netty.handler.ssl.SslContext;
6768
import io.netty.handler.ssl.SslContextBuilder;
68-
import java.io.IOException;
6969
import java.net.URI;
70-
import java.net.URLDecoder;
7170
import java.time.Duration;
7271
import java.time.LocalDateTime;
7372
import java.util.Collections;
@@ -476,57 +475,6 @@ private Locator locator(int i) {
476475
return this.locators.get(i);
477476
}
478477

479-
private static String uriDecode(String s) {
480-
try {
481-
// URLDecode decodes '+' to a space, as for
482-
// form encoding. So protect plus signs.
483-
return URLDecoder.decode(s.replace("+", "%2B"), "US-ASCII");
484-
} catch (IOException e) {
485-
throw new IllegalArgumentException(e);
486-
}
487-
}
488-
489-
Client.ClientParameters maybeSetUpClientParametersFromUris(
490-
List<URI> uris, Client.ClientParameters clientParametersPrototype) {
491-
if (uris.isEmpty()) {
492-
return clientParametersPrototype;
493-
} else {
494-
URI uri = uris.get(0);
495-
clientParametersPrototype = clientParametersPrototype.duplicate();
496-
String host = uri.getHost();
497-
if (host != null) {
498-
clientParametersPrototype.host(host);
499-
}
500-
501-
int port = uri.getPort();
502-
if (port != -1) {
503-
clientParametersPrototype.port(port);
504-
}
505-
506-
String userInfo = uri.getRawUserInfo();
507-
if (userInfo != null) {
508-
String[] userPassword = userInfo.split(":");
509-
if (userPassword.length > 2) {
510-
throw new IllegalArgumentException("Bad user info in URI " + userInfo);
511-
}
512-
513-
clientParametersPrototype.username(uriDecode(userPassword[0]));
514-
if (userPassword.length == 2) {
515-
clientParametersPrototype.password(uriDecode(userPassword[1]));
516-
}
517-
}
518-
519-
String path = uri.getRawPath();
520-
if (path != null && path.length() > 0) {
521-
if (path.indexOf('/', 1) != -1) {
522-
throw new IllegalArgumentException("Multiple segments in path of URI: " + path);
523-
}
524-
clientParametersPrototype.virtualHost(uriDecode(uri.getPath().substring(1)));
525-
}
526-
return clientParametersPrototype;
527-
}
528-
}
529-
530478
public ByteBufAllocator byteBufAllocator() {
531479
return byteBufAllocator;
532480
}

src/main/java/com/rabbitmq/stream/impl/Utils.java

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
package com.rabbitmq.stream.impl;
1616

1717
import static java.lang.String.format;
18+
import static java.nio.charset.StandardCharsets.US_ASCII;
1819
import static java.util.Map.copyOf;
1920

2021
import com.rabbitmq.stream.Address;
@@ -33,6 +34,8 @@
3334
import io.netty.channel.MultiThreadIoEventLoopGroup;
3435
import io.netty.channel.nio.NioEventLoopGroup;
3536
import io.netty.channel.nio.NioIoHandler;
37+
import java.net.URI;
38+
import java.net.URLDecoder;
3639
import java.net.UnknownHostException;
3740
import java.security.cert.X509Certificate;
3841
import java.time.Duration;
@@ -534,6 +537,51 @@ static boolean is3_11_OrMore(String brokerVersion) {
534537
return versionCompare(currentVersion(brokerVersion), "3.11.0") >= 0;
535538
}
536539

540+
static Client.ClientParameters maybeSetUpClientParametersFromUris(
541+
List<URI> uris, Client.ClientParameters clientParametersPrototype) {
542+
if (!uris.isEmpty()) {
543+
URI uri = uris.get(0);
544+
clientParametersPrototype = clientParametersPrototype.duplicate();
545+
String host = uri.getHost();
546+
if (host != null) {
547+
clientParametersPrototype.host(host);
548+
}
549+
550+
int port = uri.getPort();
551+
if (port != -1) {
552+
clientParametersPrototype.port(port);
553+
}
554+
555+
String userInfo = uri.getRawUserInfo();
556+
if (userInfo != null) {
557+
String[] userPassword = userInfo.split(":");
558+
if (userPassword.length > 2) {
559+
throw new IllegalArgumentException("Bad user info in URI " + userInfo);
560+
}
561+
562+
clientParametersPrototype.username(uriDecode(userPassword[0]));
563+
if (userPassword.length == 2) {
564+
clientParametersPrototype.password(uriDecode(userPassword[1]));
565+
}
566+
}
567+
568+
String path = uri.getRawPath();
569+
if (path != null && path.length() > 0) {
570+
if (path.indexOf('/', 1) != -1) {
571+
throw new IllegalArgumentException("Multiple segments in path of URI: " + path);
572+
}
573+
clientParametersPrototype.virtualHost(uriDecode(uri.getPath().substring(1)));
574+
}
575+
}
576+
return clientParametersPrototype;
577+
}
578+
579+
private static String uriDecode(String s) {
580+
// URLDecode decodes '+' to a space, as for
581+
// form encoding. So protect plus signs.
582+
return URLDecoder.decode(s.replace("+", "%2B"), US_ASCII);
583+
}
584+
537585
static StreamException convertCodeToException(
538586
short responseCode, String stream, Supplier<String> fallbackMessage) {
539587
if (responseCode == Constants.RESPONSE_CODE_STREAM_DOES_NOT_EXIST) {

src/test/java/com/rabbitmq/stream/impl/UtilsTest.java

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,9 @@
2020
import static com.rabbitmq.stream.impl.Utils.defaultConnectionNamingStrategy;
2121
import static com.rabbitmq.stream.impl.Utils.formatConstant;
2222
import static com.rabbitmq.stream.impl.Utils.offsetBefore;
23+
import static java.net.URI.create;
2324
import static java.util.Collections.emptyList;
25+
import static java.util.List.of;
2426
import static org.assertj.core.api.Assertions.assertThat;
2527
import static org.mockito.ArgumentMatchers.any;
2628
import static org.mockito.Mockito.mock;
@@ -34,7 +36,10 @@
3436
import com.rabbitmq.stream.impl.Utils.ClientFactory;
3537
import com.rabbitmq.stream.impl.Utils.ClientFactoryContext;
3638
import com.rabbitmq.stream.impl.Utils.ConditionalClientFactory;
39+
import com.rabbitmq.stream.sasl.DefaultUsernamePasswordCredentialsProvider;
40+
import com.rabbitmq.stream.sasl.UsernamePasswordCredentialsProvider;
3741
import java.time.Duration;
42+
import java.util.UUID;
3843
import java.util.function.BiPredicate;
3944
import java.util.function.Function;
4045
import java.util.stream.IntStream;
@@ -126,4 +131,35 @@ void testOffsetBefore() {
126131
void is_3_11_OrMore(String input, boolean expected) {
127132
assertThat(Utils.is3_11_OrMore(input)).isEqualTo(expected);
128133
}
134+
135+
@Test
136+
void maybeSetUpClientParametersFromUrisShouldKeepCredentialsIfNotInUri() {
137+
String u = UUID.randomUUID().toString();
138+
String p = UUID.randomUUID().toString();
139+
UsernamePasswordCredentialsProvider provider =
140+
new DefaultUsernamePasswordCredentialsProvider(u, p);
141+
ClientParameters cp = new ClientParameters().credentialsProvider(provider);
142+
cp =
143+
Utils.maybeSetUpClientParametersFromUris(of(create("rabbitmq-stream://host1:5552/vh")), cp);
144+
145+
provider = (UsernamePasswordCredentialsProvider) cp.credentialsProvider();
146+
assertThat(provider.getUsername()).isEqualTo(u);
147+
assertThat(provider.getPassword()).isEqualTo(p);
148+
}
149+
150+
@Test
151+
void maybeSetUpClientParametersFromUrisShouldOverrideCredentialsIfInUri() {
152+
String u = UUID.randomUUID().toString();
153+
String p = UUID.randomUUID().toString();
154+
UsernamePasswordCredentialsProvider provider =
155+
new DefaultUsernamePasswordCredentialsProvider(u, p);
156+
ClientParameters cp = new ClientParameters().credentialsProvider(provider);
157+
cp =
158+
Utils.maybeSetUpClientParametersFromUris(
159+
of(create("rabbitmq-stream://foo:bar@host1:5552/vh")), cp);
160+
161+
provider = (UsernamePasswordCredentialsProvider) cp.credentialsProvider();
162+
assertThat(provider.getUsername()).isNotEqualTo(u).isEqualTo("foo");
163+
assertThat(provider.getPassword()).isNotEqualTo(p).isEqualTo("bar");
164+
}
129165
}

0 commit comments

Comments
 (0)