Add an affordance for providing a custom trust store to FaultTolerantHttpClient.

This commit is contained in:
Jon Chambers 2020-12-23 17:30:55 -05:00 committed by Jon Chambers
parent 738ec2a38e
commit cdc6afefe2
1 changed files with 26 additions and 11 deletions

View File

@ -7,14 +7,21 @@ package org.whispersystems.textsecuregcm.http;
import com.codahale.metrics.MetricRegistry; import com.codahale.metrics.MetricRegistry;
import com.codahale.metrics.SharedMetricRegistries; import com.codahale.metrics.SharedMetricRegistries;
import io.github.resilience4j.circuitbreaker.CircuitBreaker;
import io.github.resilience4j.retry.Retry;
import io.github.resilience4j.retry.RetryConfig;
import org.glassfish.jersey.SslConfigurator;
import org.whispersystems.textsecuregcm.configuration.CircuitBreakerConfiguration; import org.whispersystems.textsecuregcm.configuration.CircuitBreakerConfiguration;
import org.whispersystems.textsecuregcm.configuration.RetryConfiguration; import org.whispersystems.textsecuregcm.configuration.RetryConfiguration;
import org.whispersystems.textsecuregcm.util.CertificateUtil;
import org.whispersystems.textsecuregcm.util.CircuitBreakerUtil; import org.whispersystems.textsecuregcm.util.CircuitBreakerUtil;
import org.whispersystems.textsecuregcm.util.Constants; import org.whispersystems.textsecuregcm.util.Constants;
import java.net.http.HttpClient; import java.net.http.HttpClient;
import java.net.http.HttpRequest; import java.net.http.HttpRequest;
import java.net.http.HttpResponse; import java.net.http.HttpResponse;
import java.security.KeyStore;
import java.security.cert.CertificateException;
import java.time.Duration; import java.time.Duration;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CompletionStage; import java.util.concurrent.CompletionStage;
@ -23,10 +30,6 @@ import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledExecutorService;
import java.util.function.Supplier; import java.util.function.Supplier;
import io.github.resilience4j.circuitbreaker.CircuitBreaker;
import io.github.resilience4j.retry.Retry;
import io.github.resilience4j.retry.RetryConfig;
public class FaultTolerantHttpClient { public class FaultTolerantHttpClient {
private final HttpClient httpClient; private final HttpClient httpClient;
@ -82,6 +85,7 @@ public class FaultTolerantHttpClient {
private String name; private String name;
private Executor executor; private Executor executor;
private KeyStore trustStore;
private RetryConfiguration retryConfiguration; private RetryConfiguration retryConfiguration;
private CircuitBreakerConfiguration circuitBreakerConfiguration; private CircuitBreakerConfiguration circuitBreakerConfiguration;
@ -122,19 +126,30 @@ public class FaultTolerantHttpClient {
return this; return this;
} }
public Builder withTrustedServerCertificate(final String certificatePem) throws CertificateException {
this.trustStore = CertificateUtil.buildKeyStoreForPem(certificatePem);
return this;
}
public FaultTolerantHttpClient build() { public FaultTolerantHttpClient build() {
if (this.circuitBreakerConfiguration == null || this.name == null || this.executor == null) { if (this.circuitBreakerConfiguration == null || this.name == null || this.executor == null) {
throw new IllegalArgumentException("Must specify circuit breaker config, name, and executor"); throw new IllegalArgumentException("Must specify circuit breaker config, name, and executor");
} }
HttpClient client = HttpClient.newBuilder() final HttpClient.Builder builder = HttpClient.newBuilder()
.connectTimeout(connectTimeout) .connectTimeout(connectTimeout)
.followRedirects(redirect) .followRedirects(redirect)
.version(version) .version(version)
.executor(executor) .executor(executor);
.build();
return new FaultTolerantHttpClient(name, client, retryConfiguration, circuitBreakerConfiguration); if (this.trustStore != null) {
builder.sslContext(SslConfigurator.newInstance()
.securityProtocol("TLSv1.2")
.trustStore(trustStore)
.createSSLContext());
}
return new FaultTolerantHttpClient(name, builder.build(), retryConfiguration, circuitBreakerConfiguration);
} }
} }