Skip to content

Commit b156dcb

Browse files
authored
Support RESP3 protocol through URI/URL (#3403)
* Support RESP3 protocol through URI/URL * edit * Address review * fix regression
1 parent 1cc35a5 commit b156dcb

File tree

11 files changed

+105
-83
lines changed

11 files changed

+105
-83
lines changed

src/main/java/redis/clients/jedis/Jedis.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,7 @@ public Jedis(URI uri) {
151151
connection = new Connection(new HostAndPort(uri.getHost(), uri.getPort()),
152152
DefaultJedisClientConfig.builder().user(JedisURIHelper.getUser(uri))
153153
.password(JedisURIHelper.getPassword(uri)).database(JedisURIHelper.getDBIndex(uri))
154+
.protocol(JedisURIHelper.getRedisProtocol(uri))
154155
.ssl(JedisURIHelper.isRedisSSLScheme(uri)).build());
155156
}
156157

@@ -203,6 +204,7 @@ public Jedis(final URI uri, JedisClientConfig config) {
203204
.blockingSocketTimeoutMillis(config.getBlockingSocketTimeoutMillis())
204205
.user(JedisURIHelper.getUser(uri)).password(JedisURIHelper.getPassword(uri))
205206
.database(JedisURIHelper.getDBIndex(uri)).clientName(config.getClientName())
207+
.protocol(JedisURIHelper.getRedisProtocol(uri))
206208
.ssl(JedisURIHelper.isRedisSSLScheme(uri)).sslSocketFactory(config.getSslSocketFactory())
207209
.sslParameters(config.getSslParameters()).hostnameVerifier(config.getHostnameVerifier())
208210
.build());

src/main/java/redis/clients/jedis/JedisFactory.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,7 @@ protected JedisFactory(final URI uri, final int connectionTimeout, final int soT
130130
.socketTimeoutMillis(soTimeout).blockingSocketTimeoutMillis(infiniteSoTimeout)
131131
.user(JedisURIHelper.getUser(uri)).password(JedisURIHelper.getPassword(uri))
132132
.database(JedisURIHelper.getDBIndex(uri)).clientName(clientName)
133+
.protocol(JedisURIHelper.getRedisProtocol(uri))
133134
.ssl(JedisURIHelper.isRedisSSLScheme(uri)).sslSocketFactory(sslSocketFactory)
134135
.sslParameters(sslParameters).hostnameVerifier(hostnameVerifier).build();
135136
this.jedisSocketFactory = new DefaultJedisSocketFactory(new HostAndPort(uri.getHost(), uri.getPort()), this.clientConfig);

src/main/java/redis/clients/jedis/JedisPooled.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -353,11 +353,13 @@ public JedisPooled(final GenericObjectPoolConfig<Connection> poolConfig, final U
353353
final int connectionTimeout, final int soTimeout, final int infiniteSoTimeout,
354354
final SSLSocketFactory sslSocketFactory, final SSLParameters sslParameters,
355355
final HostnameVerifier hostnameVerifier) {
356-
this(new HostAndPort(uri.getHost(), uri.getPort()), DefaultJedisClientConfig.create(
357-
connectionTimeout, soTimeout, infiniteSoTimeout, JedisURIHelper.getUser(uri),
358-
JedisURIHelper.getPassword(uri), JedisURIHelper.getDBIndex(uri), null,
359-
JedisURIHelper.isRedisSSLScheme(uri), sslSocketFactory, sslParameters, hostnameVerifier,
360-
null), poolConfig);
356+
this(new HostAndPort(uri.getHost(), uri.getPort()), DefaultJedisClientConfig.builder()
357+
.connectionTimeoutMillis(connectionTimeout).socketTimeoutMillis(soTimeout)
358+
.blockingSocketTimeoutMillis(infiniteSoTimeout).user(JedisURIHelper.getUser(uri))
359+
.password(JedisURIHelper.getPassword(uri)).database(JedisURIHelper.getDBIndex(uri))
360+
.protocol(JedisURIHelper.getRedisProtocol(uri)).ssl(JedisURIHelper.isRedisSSLScheme(uri))
361+
.sslSocketFactory(sslSocketFactory).sslParameters(sslParameters)
362+
.hostnameVerifier(hostnameVerifier).build(), poolConfig);
361363
}
362364

363365
public JedisPooled(final HostAndPort hostAndPort, final GenericObjectPoolConfig<Connection> poolConfig) {

src/main/java/redis/clients/jedis/RedisProtocol.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,16 @@
22

33
public enum RedisProtocol {
44

5-
RESP2(2),
6-
RESP3(3);
5+
RESP2("2"),
6+
RESP3("3");
77

8-
private final int version;
8+
private final String version;
99

10-
private RedisProtocol(int version) {
11-
this.version = version;
10+
private RedisProtocol(String ver) {
11+
this.version = ver;
1212
}
1313

14-
public int version() {
14+
public String version() {
1515
return version;
1616
}
1717
}

src/main/java/redis/clients/jedis/UnifiedJedis.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,8 @@ public UnifiedJedis(final String url) {
6565
public UnifiedJedis(final URI uri) {
6666
this(JedisURIHelper.getHostAndPort(uri), DefaultJedisClientConfig.builder()
6767
.user(JedisURIHelper.getUser(uri)).password(JedisURIHelper.getPassword(uri))
68-
.database(JedisURIHelper.getDBIndex(uri)).ssl(JedisURIHelper.isRedisSSLScheme(uri)).build());
68+
.database(JedisURIHelper.getDBIndex(uri)).protocol(JedisURIHelper.getRedisProtocol(uri))
69+
.ssl(JedisURIHelper.isRedisSSLScheme(uri)).build());
6970
}
7071

7172
public UnifiedJedis(final URI uri, JedisClientConfig config) {
@@ -75,6 +76,7 @@ public UnifiedJedis(final URI uri, JedisClientConfig config) {
7576
.blockingSocketTimeoutMillis(config.getBlockingSocketTimeoutMillis())
7677
.user(JedisURIHelper.getUser(uri)).password(JedisURIHelper.getPassword(uri))
7778
.database(JedisURIHelper.getDBIndex(uri)).clientName(config.getClientName())
79+
.protocol(JedisURIHelper.getRedisProtocol(uri))
7880
.ssl(JedisURIHelper.isRedisSSLScheme(uri)).sslSocketFactory(config.getSslSocketFactory())
7981
.sslParameters(config.getSslParameters()).hostnameVerifier(config.getHostnameVerifier())
8082
.build());

src/main/java/redis/clients/jedis/util/JedisURIHelper.java

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@
22

33
import java.net.URI;
44
import redis.clients.jedis.HostAndPort;
5+
import redis.clients.jedis.Protocol;
6+
import redis.clients.jedis.RedisProtocol;
57

68
public final class JedisURIHelper {
79

8-
private static final int DEFAULT_DB = 0;
9-
1010
private static final String REDIS = "redis";
1111
private static final String REDISS = "rediss";
1212

@@ -43,12 +43,31 @@ public static int getDBIndex(URI uri) {
4343
if (pathSplit.length > 1) {
4444
String dbIndexStr = pathSplit[1];
4545
if (dbIndexStr.isEmpty()) {
46-
return DEFAULT_DB;
46+
return Protocol.DEFAULT_DATABASE;
4747
}
4848
return Integer.parseInt(dbIndexStr);
4949
} else {
50-
return DEFAULT_DB;
50+
return Protocol.DEFAULT_DATABASE;
51+
}
52+
}
53+
54+
public static RedisProtocol getRedisProtocol(URI uri) {
55+
if (uri.getQuery() == null) return null;
56+
57+
String[] pairs = uri.getQuery().split("&");
58+
for (String pair : pairs) {
59+
int idx = pair.indexOf("=");
60+
if ("protocol".equals(pair.substring(0, idx))) {
61+
String ver = pair.substring(idx + 1);
62+
for (RedisProtocol proto : RedisProtocol.values()) {
63+
if (proto.version().equals(ver)) {
64+
return proto;
65+
}
66+
}
67+
throw new IllegalArgumentException("Unknown protocol " + ver);
68+
}
5169
}
70+
return null; // null (default) when not defined
5271
}
5372

5473
public static boolean isValid(URI uri) {

src/test/java/redis/clients/jedis/ACLJedisTest.java

Lines changed: 2 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -89,42 +89,14 @@ public void startWithUri() throws URISyntaxException {
8989
assertEquals("OK", j.select(2));
9090
j.set("foo", "bar");
9191
}
92-
try (Jedis j2 = new Jedis(new URI("redis://acljedis:fizzbuzz@localhost:6379/2"))) {
93-
assertEquals("PONG", j2.ping());
94-
assertEquals("bar", j2.get("foo"));
95-
}
96-
}
97-
98-
@Test
99-
public void connectWithURICredentials() throws URISyntaxException {
100-
jedis.set("foo", "bar");
101-
102-
try (Jedis j1 = new Jedis(new URI("redis://default:foobared@localhost:6379"))) {
92+
try (Jedis j1 = new Jedis(new URI("redis://acljedis:fizzbuzz@localhost:6379/2"))) {
10393
assertEquals("PONG", j1.ping());
10494
assertEquals("bar", j1.get("foo"));
10595
}
106-
107-
try (Jedis j2 = new Jedis(new URI("redis://acljedis:fizzbuzz@localhost:6379"))) {
96+
try (Jedis j2 = new Jedis(new URI("redis://acljedis:fizzbuzz@localhost:6379/2"))) {
10897
assertEquals("PONG", j2.ping());
10998
assertEquals("bar", j2.get("foo"));
11099
}
111100
}
112101

113-
@Test
114-
public void allowUrlWithNoDBAndNoPassword() {
115-
try (Jedis j1 = new Jedis("redis://localhost:6379")) {
116-
assertEquals("OK", j1.auth("acljedis", "fizzbuzz"));
117-
// assertEquals("localhost", j1.getClient().getHost());
118-
// assertEquals(6379, j1.getClient().getPort());
119-
assertEquals(0, j1.getDB());
120-
}
121-
122-
try (Jedis j2 = new Jedis("redis://localhost:6379/")) {
123-
assertEquals("OK", j2.auth("acljedis", "fizzbuzz"));
124-
// assertEquals("localhost", j2.getClient().getHost());
125-
// assertEquals(6379, j2.getClient().getPort());
126-
assertEquals(0, j2.getDB());
127-
}
128-
}
129-
130102
}

src/test/java/redis/clients/jedis/JedisTest.java

Lines changed: 36 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -81,18 +81,20 @@ public String getPassword() {
8181
}
8282

8383
@Test
84-
public void resp3Protocol() {
84+
public void connectOnResp3Protocol() {
8585
try (Jedis jedis = new Jedis(hnp, DefaultJedisClientConfig.builder()
86-
.protocol(RedisProtocol.RESP3).user("default").password("foobared").build())) {
86+
.protocol(RedisProtocol.RESP3).password("foobared").build())) {
8787
assertEquals("PONG", jedis.ping());
88+
assertEquals(RedisProtocol.RESP3, jedis.getConnection().getRedisProtocol());
8889
}
8990
}
9091

9192
@Test
92-
public void resp3Shortcut() {
93+
public void connectOnResp3ProtocolShortcut() {
9394
try (Jedis jedis = new Jedis(hnp, DefaultJedisClientConfig.builder().resp3()
94-
.user("default").password("foobared").build())) {
95+
.password("foobared").build())) {
9596
assertEquals("PONG", jedis.ping());
97+
assertEquals(RedisProtocol.RESP3, jedis.getConnection().getRedisProtocol());
9698
}
9799
}
98100

@@ -153,7 +155,7 @@ public void shouldThrowInvalidURIExceptionForInvalidURI() throws URISyntaxExcept
153155
// }
154156

155157
@Test
156-
public void startWithUrl() {
158+
public void connectWithUrl() {
157159
try (Jedis j = new Jedis("localhost", 6380)) {
158160
j.auth("foobared");
159161
j.select(2);
@@ -167,7 +169,7 @@ public void startWithUrl() {
167169
}
168170

169171
@Test
170-
public void startWithUri() throws URISyntaxException {
172+
public void connectWithUri() throws URISyntaxException {
171173
try (Jedis j = new Jedis("localhost", 6380)) {
172174
j.auth("foobared");
173175
j.select(2);
@@ -180,6 +182,34 @@ public void startWithUri() throws URISyntaxException {
180182
}
181183
}
182184

185+
@Test
186+
public void connectWithUrlOnResp3() {
187+
try (Jedis j = new Jedis("localhost", 6380)) {
188+
j.auth("foobared");
189+
j.select(2);
190+
j.set("foo", "bar");
191+
}
192+
193+
try (Jedis j2 = new Jedis("redis://:foobared@localhost:6380/2?protocol=3")) {
194+
assertEquals("PONG", j2.ping());
195+
assertEquals("bar", j2.get("foo"));
196+
}
197+
}
198+
199+
@Test
200+
public void connectWithUriOnResp3() throws URISyntaxException {
201+
try (Jedis j = new Jedis("localhost", 6380)) {
202+
j.auth("foobared");
203+
j.select(2);
204+
j.set("foo", "bar");
205+
}
206+
207+
try (Jedis jedis = new Jedis(new URI("redis://:foobared@localhost:6380/2?protocol=3"))) {
208+
assertEquals("PONG", jedis.ping());
209+
assertEquals("bar", jedis.get("foo"));
210+
}
211+
}
212+
183213
@Test
184214
public void shouldNotUpdateDbIndexIfSelectFails() {
185215
int currentDb = jedis.getDB();

src/test/java/redis/clients/jedis/SSLACLJedisTest.java

Lines changed: 2 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -42,28 +42,15 @@ public void connectWithSsl() {
4242

4343
@Test
4444
public void connectWithConfig() {
45-
try (Jedis jedis = new Jedis(new HostAndPort("localhost", 6390), DefaultJedisClientConfig
46-
.builder().ssl(true).build())) {
45+
try (Jedis jedis = new Jedis(new HostAndPort("localhost", 6390),
46+
DefaultJedisClientConfig.builder().ssl(true).build())) {
4747
jedis.auth("acljedis", "fizzbuzz");
4848
assertEquals("PONG", jedis.ping());
4949
}
5050
}
5151

5252
@Test
5353
public void connectWithUrl() {
54-
// The "rediss" scheme instructs jedis to open a SSL/TLS connection.
55-
try (Jedis jedis = new Jedis("rediss://localhost:6390")) {
56-
jedis.auth("default", "foobared");
57-
assertEquals("PONG", jedis.ping());
58-
}
59-
try (Jedis jedis = new Jedis("rediss://localhost:6390")) {
60-
jedis.auth("acljedis", "fizzbuzz");
61-
assertEquals("PONG", jedis.ping());
62-
}
63-
}
64-
65-
@Test
66-
public void connectWithCompleteCredentialsUrl() {
6754
// The "rediss" scheme instructs jedis to open a SSL/TLS connection.
6855
try (Jedis jedis = new Jedis("rediss://default:foobared@localhost:6390")) {
6956
assertEquals("PONG", jedis.ping());
@@ -75,15 +62,6 @@ public void connectWithCompleteCredentialsUrl() {
7562

7663
@Test
7764
public void connectWithUri() {
78-
// The "rediss" scheme instructs jedis to open a SSL/TLS connection.
79-
try (Jedis jedis = new Jedis(URI.create("rediss://localhost:6390"))) {
80-
jedis.auth("acljedis", "fizzbuzz");
81-
assertEquals("PONG", jedis.ping());
82-
}
83-
}
84-
85-
@Test
86-
public void connectWithCompleteCredentialsUri() {
8765
// The "rediss" scheme instructs jedis to open a SSL/TLS connection.
8866
try (Jedis jedis = new Jedis(URI.create("rediss://default:foobared@localhost:6390"))) {
8967
assertEquals("PONG", jedis.ping());

src/test/java/redis/clients/jedis/SSLJedisTest.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,8 @@ public void connectWithSsl() {
5252

5353
@Test
5454
public void connectWithConfig() {
55-
try (Jedis jedis = new Jedis(new HostAndPort("localhost", 6390), DefaultJedisClientConfig
56-
.builder().ssl(true).build())) {
55+
try (Jedis jedis = new Jedis(new HostAndPort("localhost", 6390),
56+
DefaultJedisClientConfig.builder().ssl(true).build())) {
5757
jedis.auth("foobared");
5858
assertEquals("PONG", jedis.ping());
5959
}
@@ -63,11 +63,11 @@ public void connectWithConfig() {
6363
public void connectWithConfigInterface() {
6464
try (Jedis jedis = new Jedis(new HostAndPort("localhost", 6390),
6565
new JedisClientConfig() {
66-
@Override
67-
public boolean isSsl() {
68-
return true;
69-
}
70-
})) {
66+
@Override
67+
public boolean isSsl() {
68+
return true;
69+
}
70+
})) {
7171
jedis.auth("foobared");
7272
assertEquals("PONG", jedis.ping());
7373
}

0 commit comments

Comments
 (0)