Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@
*/
package org.springframework.data.redis.connection.jedis;

import redis.clients.jedis.SslOptions;

import java.time.Duration;
import java.util.Optional;

Expand All @@ -30,6 +32,7 @@
*
* @author Mark Paluch
* @author Christoph Strobl
* @author Geonhyeon Kim
* @since 2.0
*/
class DefaultJedisClientConfiguration implements JedisClientConfiguration {
Expand All @@ -40,6 +43,7 @@ class DefaultJedisClientConfiguration implements JedisClientConfiguration {
private final Optional<SSLSocketFactory> sslSocketFactory;
private final Optional<SSLParameters> sslParameters;
private final Optional<HostnameVerifier> hostnameVerifier;
private final Optional<SslOptions> sslOptions;
private final boolean usePooling;
private final Optional<GenericObjectPoolConfig<?>> poolConfig;
private final Optional<String> clientName;
Expand All @@ -49,15 +53,17 @@ class DefaultJedisClientConfiguration implements JedisClientConfiguration {
DefaultJedisClientConfiguration(@Nullable JedisClientConfigBuilderCustomizer clientConfigCustomizer,
@Nullable JedisClientBuilderCustomizer clientCustomizer, boolean useSsl,
@Nullable SSLSocketFactory sslSocketFactory, @Nullable SSLParameters sslParameters,
@Nullable HostnameVerifier hostnameVerifier, boolean usePooling, @Nullable GenericObjectPoolConfig<?> poolConfig,
@Nullable String clientName, Duration readTimeout, Duration connectTimeout) {
@Nullable HostnameVerifier hostnameVerifier, @Nullable SslOptions sslOptions, boolean usePooling,
@Nullable GenericObjectPoolConfig<?> poolConfig, @Nullable String clientName, Duration readTimeout,
Duration connectTimeout) {

this.clientConfigCustomizer = Optional.ofNullable(clientConfigCustomizer);
this.clientCustomizer = Optional.ofNullable(clientCustomizer);
this.useSsl = useSsl;
this.sslSocketFactory = Optional.ofNullable(sslSocketFactory);
this.sslParameters = Optional.ofNullable(sslParameters);
this.hostnameVerifier = Optional.ofNullable(hostnameVerifier);
this.sslOptions = Optional.ofNullable(sslOptions);
this.usePooling = usePooling;
this.poolConfig = Optional.ofNullable(poolConfig);
this.clientName = Optional.ofNullable(clientName);
Expand Down Expand Up @@ -95,6 +101,11 @@ public Optional<HostnameVerifier> getHostnameVerifier() {
return hostnameVerifier;
}

@Override
public Optional<SslOptions> getSslOptions() {
return sslOptions;
}

@Override
public boolean isUsePooling() {
return usePooling;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@

import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.Protocol;
import redis.clients.jedis.SslOptions;

import java.net.SocketAddress;
import java.time.Duration;
Expand All @@ -41,6 +42,7 @@
* <li>Optional {@link SSLSocketFactory}</li>
* <li>Optional {@link SSLParameters}</li>
* <li>Optional {@link HostnameVerifier}</li>
* <li>Optional {@link SslOptions}</li>
* <li>Whether to use connection-pooling</li>
* <li>Optional {@link GenericObjectPoolConfig}</li>
* <li>Optional client name</li>
Expand All @@ -51,6 +53,7 @@
* @author Mark Paluch
* @author Christoph Strobl
* @author Chao Chang
* @author Geonhyeon Kim
* @since 2.0
* @see redis.clients.jedis.Jedis
* @see org.springframework.data.redis.connection.RedisStandaloneConfiguration
Expand Down Expand Up @@ -100,6 +103,12 @@ default Optional<JedisClientConfigBuilderCustomizer> getCustomizer() {
*/
Optional<HostnameVerifier> getHostnameVerifier();

/**
* @return the optional {@link SslOptions}.
* @since 4.1
*/
Optional<SslOptions> getSslOptions();

/**
* @return {@literal true} to use connection-pooling. Applies only to single node Redis. Sentinel and Cluster modes
* use always connection-pooling regardless of the pooling setting.
Expand Down Expand Up @@ -302,6 +311,14 @@ interface JedisSslClientConfigurationBuilder {
*/
JedisSslClientConfigurationBuilder hostnameVerifier(HostnameVerifier hostnameVerifier);

/**
* @param sslOptions must not be {@literal null}.
* @return {@literal this} builder.
* @throws IllegalArgumentException if sslOptions is {@literal null}.
* @since 4.1
*/
JedisSslClientConfigurationBuilder sslOptions(SslOptions sslOptions);

/**
* Return to {@link JedisClientConfigurationBuilder}.
*
Expand Down Expand Up @@ -330,6 +347,7 @@ class DefaultJedisClientConfigurationBuilder implements JedisClientConfiguration
private @Nullable SSLSocketFactory sslSocketFactory;
private @Nullable SSLParameters sslParameters;
private @Nullable HostnameVerifier hostnameVerifier;
private @Nullable SslOptions sslOptions;
private boolean usePooling;
private GenericObjectPoolConfig<?> poolConfig = new JedisPoolConfig();
private @Nullable String clientName;
Expand Down Expand Up @@ -387,6 +405,15 @@ public JedisSslClientConfigurationBuilder hostnameVerifier(HostnameVerifier host
return this;
}

@Override
public JedisSslClientConfigurationBuilder sslOptions(SslOptions sslOptions) {

Assert.notNull(sslOptions, "SslOptions must not be null");

this.sslOptions = sslOptions;
return this;
}

@Override
public JedisPoolingClientConfigurationBuilder usePooling() {

Expand Down Expand Up @@ -439,7 +466,7 @@ public JedisClientConfigurationBuilder connectTimeout(Duration connectTimeout) {
public JedisClientConfiguration build() {

return new DefaultJedisClientConfiguration(clientConfigCustomizer, clientCustomizer, useSsl, sslSocketFactory,
sslParameters, hostnameVerifier,
sslParameters, hostnameVerifier, sslOptions,
usePooling, poolConfig, clientName, readTimeout, connectTimeout);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,7 @@
* @author Fu Jian
* @author Ajith Kumar
* @author Tihomir Mateev
* @author Geonhyeon Kim
* @see JedisClientConfiguration
* @see Jedis
*/
Expand Down Expand Up @@ -753,6 +754,7 @@ private JedisClientConfig createClientConfig(int database, @Nullable String user
this.clientConfiguration.getSslSocketFactory().ifPresent(builder::sslSocketFactory);
this.clientConfiguration.getHostnameVerifier().ifPresent(builder::hostnameVerifier);
this.clientConfiguration.getSslParameters().ifPresent(builder::sslParameters);
this.clientConfiguration.getSslOptions().ifPresent(builder::sslOptions);
}

this.clientConfiguration.getClientConfigCustomizer().ifPresent(customizer -> customizer.customize(builder));
Expand Down Expand Up @@ -1286,9 +1288,6 @@ private void assertInitialized() {
static class MutableJedisClientConfiguration implements JedisClientConfiguration {

private boolean useSsl;
private @Nullable SSLSocketFactory sslSocketFactory;
private @Nullable SSLParameters sslParameters;
private @Nullable HostnameVerifier hostnameVerifier;
private boolean usePooling = true;
private GenericObjectPoolConfig<?> poolConfig = new JedisPoolConfig();
private @Nullable String clientName;
Expand Down Expand Up @@ -1323,29 +1322,22 @@ public void setUseSsl(boolean useSsl) {

@Override
public Optional<SSLSocketFactory> getSslSocketFactory() {
return Optional.ofNullable(sslSocketFactory);
}

public void setSslSocketFactory(SSLSocketFactory sslSocketFactory) {
this.sslSocketFactory = sslSocketFactory;
return Optional.empty();
}

@Override
public Optional<SSLParameters> getSslParameters() {
return Optional.ofNullable(sslParameters);
}

public void setSslParameters(SSLParameters sslParameters) {
this.sslParameters = sslParameters;
return Optional.empty();
}

@Override
public Optional<HostnameVerifier> getHostnameVerifier() {
return Optional.ofNullable(hostnameVerifier);
return Optional.empty();
}

public void setHostnameVerifier(HostnameVerifier hostnameVerifier) {
this.hostnameVerifier = hostnameVerifier;
@Override
public Optional<SslOptions> getSslOptions() {
return Optional.empty();
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import static org.assertj.core.api.Assertions.*;

import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.SslOptions;

import java.security.NoSuchAlgorithmException;
import java.time.Duration;
Expand All @@ -34,6 +35,7 @@
* Unit tests for {@link JedisClientConfiguration}.
*
* @author Mark Paluch
* @author Geonhyeon Kim
*/
class JedisClientConfigurationUnitTests {

Expand All @@ -49,6 +51,7 @@ void shouldCreateEmptyConfiguration() {
assertThat(configuration.getPoolConfig()).isPresent();
assertThat(configuration.getSslParameters()).isEmpty();
assertThat(configuration.getSslSocketFactory()).isEmpty();
assertThat(configuration.getSslOptions()).isEmpty();
}

@Test // DATAREDIS-574
Expand All @@ -57,12 +60,14 @@ void shouldConfigureAllProperties() throws NoSuchAlgorithmException {
SSLParameters sslParameters = new SSLParameters();
SSLContext context = SSLContext.getDefault();
SSLSocketFactory socketFactory = context.getSocketFactory();
SslOptions sslOptions = SslOptions.builder().build();
JedisPoolConfig poolConfig = new JedisPoolConfig();

JedisClientConfiguration configuration = JedisClientConfiguration.builder().useSsl() //
.hostnameVerifier(MyHostnameVerifier.INSTANCE) //
.sslParameters(sslParameters) //
.sslSocketFactory(socketFactory).and() //
.sslSocketFactory(socketFactory) //
.sslOptions(sslOptions).and() //
.clientName("my-client") //
.connectTimeout(Duration.ofMinutes(10)) //
.readTimeout(Duration.ofHours(5)) //
Expand All @@ -73,6 +78,7 @@ void shouldConfigureAllProperties() throws NoSuchAlgorithmException {
assertThat(configuration.getHostnameVerifier()).contains(MyHostnameVerifier.INSTANCE);
assertThat(configuration.getSslParameters()).contains(sslParameters);
assertThat(configuration.getSslSocketFactory()).contains(socketFactory);
assertThat(configuration.getSslOptions()).contains(sslOptions);

assertThat(configuration.getClientName()).contains("my-client");
assertThat(configuration.getConnectTimeout()).isEqualTo(Duration.ofMinutes(10));
Expand Down
Loading