diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2023-01-26 16:57:19 +0100 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2023-01-26 16:57:19 +0100 |
commit | f521407e98bfdeea801f6c8e46e2d1edd234bf12 (patch) | |
tree | 7b9c0382a3164942ec5f37d8d64993fd0f6c0c35 /http-utils | |
parent | 8dce093d125005b1d490e6edd4e87eb0c522a6e6 (diff) |
Avoid deprecated apache http 5.2 methods, by adding it to the builder.
Diffstat (limited to 'http-utils')
-rw-r--r-- | http-utils/src/main/java/ai/vespa/util/http/hc5/VespaHttpClientBuilder.java | 76 |
1 files changed, 61 insertions, 15 deletions
diff --git a/http-utils/src/main/java/ai/vespa/util/http/hc5/VespaHttpClientBuilder.java b/http-utils/src/main/java/ai/vespa/util/http/hc5/VespaHttpClientBuilder.java index a33c4c119c2..4f2bdfb213e 100644 --- a/http-utils/src/main/java/ai/vespa/util/http/hc5/VespaHttpClientBuilder.java +++ b/http-utils/src/main/java/ai/vespa/util/http/hc5/VespaHttpClientBuilder.java @@ -1,18 +1,23 @@ // Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package ai.vespa.util.http.hc5; +import org.apache.hc.client5.http.config.ConnectionConfig; +import org.apache.hc.client5.http.impl.classic.CloseableHttpClient; import org.apache.hc.client5.http.impl.classic.HttpClientBuilder; import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager; -import org.apache.hc.client5.http.io.HttpClientConnectionManager; import org.apache.hc.client5.http.socket.ConnectionSocketFactory; import org.apache.hc.client5.http.socket.PlainConnectionSocketFactory; import org.apache.hc.client5.http.ssl.NoopHostnameVerifier; import org.apache.hc.client5.http.ssl.SSLConnectionSocketFactory; import org.apache.hc.core5.http.config.Registry; import org.apache.hc.core5.http.config.RegistryBuilder; +import org.apache.hc.core5.util.TimeValue; +import org.apache.hc.core5.util.Timeout; import javax.net.ssl.HostnameVerifier; +import java.util.concurrent.TimeUnit; + import static com.yahoo.security.tls.MixedMode.PLAINTEXT_CLIENT_MIXED_SERVER; import static com.yahoo.security.tls.TransportSecurityUtils.getInsecureMixedMode; import static com.yahoo.security.tls.TransportSecurityUtils.getSystemTlsContext; @@ -20,36 +25,65 @@ import static com.yahoo.security.tls.TransportSecurityUtils.isTransportSecurityE /** * Sync HTTP client builder <em>for internal Vespa communications over http/https.</em> - * * Configures Vespa mTLS and handles TLS mixed mode automatically. - * Custom connection managers must be configured through {@link #create(HttpClientConnectionManagerFactory)}. + * Custom connection managers must be configured through {@link #connectionManagerFactory(HttpClientConnectionManagerFactory)}. * * @author jonmv */ public class VespaHttpClientBuilder { + private HttpClientConnectionManagerFactory connectionManagerFactory = PoolingHttpClientConnectionManager::new; + private HostnameVerifier hostnameVerifier = new NoopHostnameVerifier(); + private boolean rewriteHttpToHttps = true; + private final ConnectionConfig.Builder connectionConfigBuilder = ConnectionConfig.custom(); public interface HttpClientConnectionManagerFactory { - HttpClientConnectionManager create(Registry<ConnectionSocketFactory> socketFactories); + PoolingHttpClientConnectionManager create(Registry<ConnectionSocketFactory> socketFactories); } - public static HttpClientBuilder create() { - return create(PoolingHttpClientConnectionManager::new); + private VespaHttpClientBuilder() { } - public static HttpClientBuilder create(HttpClientConnectionManagerFactory connectionManagerFactory) { - return create(connectionManagerFactory, new NoopHostnameVerifier()); + public static VespaHttpClientBuilder custom() { + return new VespaHttpClientBuilder(); } - public static HttpClientBuilder create(HttpClientConnectionManagerFactory connectionManagerFactory, - HostnameVerifier hostnameVerifier) { - return create(connectionManagerFactory, hostnameVerifier, true); + public VespaHttpClientBuilder connectionManagerFactory(HttpClientConnectionManagerFactory connectionManagerFactory) { + this.connectionManagerFactory = connectionManagerFactory; + return this; } - public static HttpClientBuilder create(HttpClientConnectionManagerFactory connectionManagerFactory, - HostnameVerifier hostnameVerifier, - boolean rewriteHttpToHttps) { + public VespaHttpClientBuilder hostnameVerifier(HostnameVerifier hostnameVerifier) { + this.hostnameVerifier = hostnameVerifier; + return this; + } + public VespaHttpClientBuilder rewriteHttpToHttps(boolean enable) { + this.rewriteHttpToHttps = enable; + return this; + } + public VespaHttpClientBuilder connectTimeout(long connectTimeout, TimeUnit timeUnit) { + connectionConfigBuilder.setConnectTimeout(connectTimeout, timeUnit); + return this; + } + public VespaHttpClientBuilder connectTimeout(Timeout connectTimeout) { + connectionConfigBuilder.setConnectTimeout(connectTimeout); + return this; + } + public VespaHttpClientBuilder socketTimeout(long connectTimeout, TimeUnit timeUnit) { + connectionConfigBuilder.setConnectTimeout(connectTimeout, timeUnit); + return this; + } + public VespaHttpClientBuilder validateAfterInactivity(TimeValue validateAfterInactivity) { + connectionConfigBuilder.setValidateAfterInactivity(validateAfterInactivity); + return this; + } + public VespaHttpClientBuilder socketTimeout(Timeout connectTimeout) { + connectionConfigBuilder.setConnectTimeout(connectTimeout); + return this; + } + + public HttpClientBuilder apacheBuilder() { HttpClientBuilder builder = HttpClientBuilder.create(); - addSslSocketFactory(builder, connectionManagerFactory, hostnameVerifier); + addSslSocketFactory(builder, new HttpClientConnectionManagerFactoryProxy(), hostnameVerifier); if (rewriteHttpToHttps) addHttpsRewritingRoutePlanner(builder); @@ -60,6 +94,18 @@ public class VespaHttpClientBuilder { return builder; } + public CloseableHttpClient buildClient() { + return apacheBuilder().build(); + } + + private class HttpClientConnectionManagerFactoryProxy implements HttpClientConnectionManagerFactory { + @Override + public PoolingHttpClientConnectionManager create(Registry<ConnectionSocketFactory> socketFactories) { + PoolingHttpClientConnectionManager manager = connectionManagerFactory.create(socketFactories); + manager.setDefaultConnectionConfig(connectionConfigBuilder.build()); + return manager; + } + } private static void addSslSocketFactory(HttpClientBuilder builder, HttpClientConnectionManagerFactory connectionManagerFactory, HostnameVerifier hostnameVerifier) { |