This is an automated email from the ASF dual-hosted git repository.
yufei pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/iceberg.git
The following commit(s) were added to refs/heads/main by this push:
new 5e08f886f3 Make proxy endpoint configurable for s3 Http clients
(#10332)
5e08f886f3 is described below
commit 5e08f886f367e548834afe1d43f99e0cb8d3ef5e
Author: Yufei Gu <[email protected]>
AuthorDate: Tue May 14 10:29:24 2024 -0700
Make proxy endpoint configurable for s3 Http clients (#10332)
---
.../apache/iceberg/aws/ApacheHttpClientConfigurations.java | 10 ++++++++++
.../java/org/apache/iceberg/aws/HttpClientProperties.java | 7 +++++++
.../iceberg/aws/UrlConnectionHttpClientConfigurations.java | 10 ++++++++++
.../apache/iceberg/aws/TestHttpClientConfigurations.java | 13 +++++++++++++
docs/docs/aws.md | 9 +++++----
5 files changed, 45 insertions(+), 4 deletions(-)
diff --git
a/aws/src/main/java/org/apache/iceberg/aws/ApacheHttpClientConfigurations.java
b/aws/src/main/java/org/apache/iceberg/aws/ApacheHttpClientConfigurations.java
index 04f5b911ff..95fe34b742 100644
---
a/aws/src/main/java/org/apache/iceberg/aws/ApacheHttpClientConfigurations.java
+++
b/aws/src/main/java/org/apache/iceberg/aws/ApacheHttpClientConfigurations.java
@@ -18,12 +18,14 @@
*/
package org.apache.iceberg.aws;
+import java.net.URI;
import java.time.Duration;
import java.util.Map;
import
org.apache.iceberg.relocated.com.google.common.annotations.VisibleForTesting;
import org.apache.iceberg.util.PropertyUtil;
import software.amazon.awssdk.awscore.client.builder.AwsSyncClientBuilder;
import software.amazon.awssdk.http.apache.ApacheHttpClient;
+import software.amazon.awssdk.http.apache.ProxyConfiguration;
class ApacheHttpClientConfigurations {
private Long connectionTimeoutMs;
@@ -35,6 +37,7 @@ class ApacheHttpClientConfigurations {
private Integer maxConnections;
private Boolean tcpKeepAliveEnabled;
private Boolean useIdleConnectionReaperEnabled;
+ private String proxyEndpoint;
private ApacheHttpClientConfigurations() {}
@@ -72,6 +75,9 @@ class ApacheHttpClientConfigurations {
this.useIdleConnectionReaperEnabled =
PropertyUtil.propertyAsNullableBoolean(
httpClientProperties,
HttpClientProperties.APACHE_USE_IDLE_CONNECTION_REAPER_ENABLED);
+ this.proxyEndpoint =
+ PropertyUtil.propertyAsString(
+ httpClientProperties, HttpClientProperties.PROXY_ENDPOINT, null);
}
@VisibleForTesting
@@ -103,6 +109,10 @@ class ApacheHttpClientConfigurations {
if (useIdleConnectionReaperEnabled != null) {
apacheHttpClientBuilder.useIdleConnectionReaper(useIdleConnectionReaperEnabled);
}
+ if (proxyEndpoint != null) {
+ apacheHttpClientBuilder.proxyConfiguration(
+
ProxyConfiguration.builder().endpoint(URI.create(proxyEndpoint)).build());
+ }
}
public static ApacheHttpClientConfigurations create(Map<String, String>
properties) {
diff --git a/aws/src/main/java/org/apache/iceberg/aws/HttpClientProperties.java
b/aws/src/main/java/org/apache/iceberg/aws/HttpClientProperties.java
index 2a5ca2ece8..3e615cad70 100644
--- a/aws/src/main/java/org/apache/iceberg/aws/HttpClientProperties.java
+++ b/aws/src/main/java/org/apache/iceberg/aws/HttpClientProperties.java
@@ -52,6 +52,13 @@ public class HttpClientProperties implements Serializable {
public static final String CLIENT_TYPE_URLCONNECTION = "urlconnection";
public static final String CLIENT_TYPE_DEFAULT = CLIENT_TYPE_APACHE;
+
+ /**
+ * Used to configure the proxy endpoint. Used by both {@link
+ *
software.amazon.awssdk.http.urlconnection.UrlConnectionHttpClient.Builder} and
{@link
+ * software.amazon.awssdk.http.apache.ApacheHttpClient.Builder}
+ */
+ public static final String PROXY_ENDPOINT = "http-client.proxy-endpoint";
/**
* Used to configure the connection timeout in milliseconds for {@link
*
software.amazon.awssdk.http.urlconnection.UrlConnectionHttpClient.Builder}.
This flag only
diff --git
a/aws/src/main/java/org/apache/iceberg/aws/UrlConnectionHttpClientConfigurations.java
b/aws/src/main/java/org/apache/iceberg/aws/UrlConnectionHttpClientConfigurations.java
index e71b02caef..ff8dafcf06 100644
---
a/aws/src/main/java/org/apache/iceberg/aws/UrlConnectionHttpClientConfigurations.java
+++
b/aws/src/main/java/org/apache/iceberg/aws/UrlConnectionHttpClientConfigurations.java
@@ -18,17 +18,20 @@
*/
package org.apache.iceberg.aws;
+import java.net.URI;
import java.time.Duration;
import java.util.Map;
import
org.apache.iceberg.relocated.com.google.common.annotations.VisibleForTesting;
import org.apache.iceberg.util.PropertyUtil;
import software.amazon.awssdk.awscore.client.builder.AwsSyncClientBuilder;
+import software.amazon.awssdk.http.urlconnection.ProxyConfiguration;
import software.amazon.awssdk.http.urlconnection.UrlConnectionHttpClient;
class UrlConnectionHttpClientConfigurations {
private Long httpClientUrlConnectionConnectionTimeoutMs;
private Long httpClientUrlConnectionSocketTimeoutMs;
+ private String proxyEndpoint;
private UrlConnectionHttpClientConfigurations() {}
@@ -46,6 +49,9 @@ class UrlConnectionHttpClientConfigurations {
this.httpClientUrlConnectionSocketTimeoutMs =
PropertyUtil.propertyAsNullableLong(
httpClientProperties,
HttpClientProperties.URLCONNECTION_SOCKET_TIMEOUT_MS);
+ this.proxyEndpoint =
+ PropertyUtil.propertyAsString(
+ httpClientProperties, HttpClientProperties.PROXY_ENDPOINT, null);
}
@VisibleForTesting
@@ -59,6 +65,10 @@ class UrlConnectionHttpClientConfigurations {
urlConnectionHttpClientBuilder.socketTimeout(
Duration.ofMillis(httpClientUrlConnectionSocketTimeoutMs));
}
+ if (proxyEndpoint != null) {
+ urlConnectionHttpClientBuilder.proxyConfiguration(
+
ProxyConfiguration.builder().endpoint(URI.create(proxyEndpoint)).build());
+ }
}
public static UrlConnectionHttpClientConfigurations create(
diff --git
a/aws/src/test/java/org/apache/iceberg/aws/TestHttpClientConfigurations.java
b/aws/src/test/java/org/apache/iceberg/aws/TestHttpClientConfigurations.java
index 17ac7ca728..0f96ac0f6c 100644
--- a/aws/src/test/java/org/apache/iceberg/aws/TestHttpClientConfigurations.java
+++ b/aws/src/test/java/org/apache/iceberg/aws/TestHttpClientConfigurations.java
@@ -24,6 +24,7 @@ import
org.apache.iceberg.relocated.com.google.common.collect.Maps;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
import software.amazon.awssdk.http.apache.ApacheHttpClient;
+import software.amazon.awssdk.http.apache.ProxyConfiguration;
import software.amazon.awssdk.http.urlconnection.UrlConnectionHttpClient;
public class TestHttpClientConfigurations {
@@ -34,6 +35,7 @@ public class TestHttpClientConfigurations {
properties.put(HttpClientProperties.URLCONNECTION_CONNECTION_TIMEOUT_MS,
"80");
properties.put(HttpClientProperties.APACHE_SOCKET_TIMEOUT_MS, "100");
properties.put(HttpClientProperties.APACHE_CONNECTION_TIMEOUT_MS, "200");
+ properties.put(HttpClientProperties.PROXY_ENDPOINT, "http://proxy:8080");
UrlConnectionHttpClientConfigurations
urlConnectionHttpClientConfigurations =
UrlConnectionHttpClientConfigurations.create(properties);
UrlConnectionHttpClient.Builder urlConnectionHttpClientBuilder =
@@ -46,6 +48,9 @@ public class TestHttpClientConfigurations {
Mockito.verify(spyUrlConnectionHttpClientBuilder).socketTimeout(Duration.ofMillis(90));
Mockito.verify(spyUrlConnectionHttpClientBuilder).connectionTimeout(Duration.ofMillis(80));
+ Mockito.verify(spyUrlConnectionHttpClientBuilder)
+ .proxyConfiguration(
+
Mockito.any(software.amazon.awssdk.http.urlconnection.ProxyConfiguration.class));
}
@Test
@@ -64,6 +69,9 @@ public class TestHttpClientConfigurations {
.connectionTimeout(Mockito.any(Duration.class));
Mockito.verify(spyUrlConnectionHttpClientBuilder, Mockito.never())
.socketTimeout(Mockito.any(Duration.class));
+ Mockito.verify(spyUrlConnectionHttpClientBuilder, Mockito.never())
+ .proxyConfiguration(
+
Mockito.any(software.amazon.awssdk.http.urlconnection.ProxyConfiguration.class));
}
@Test
@@ -80,6 +88,7 @@ public class TestHttpClientConfigurations {
properties.put(HttpClientProperties.APACHE_MAX_CONNECTIONS, "104");
properties.put(HttpClientProperties.APACHE_TCP_KEEP_ALIVE_ENABLED, "true");
properties.put(HttpClientProperties.APACHE_USE_IDLE_CONNECTION_REAPER_ENABLED,
"false");
+ properties.put(HttpClientProperties.PROXY_ENDPOINT, "http://proxy:8080");
ApacheHttpClientConfigurations apacheHttpClientConfigurations =
ApacheHttpClientConfigurations.create(properties);
ApacheHttpClient.Builder apacheHttpClientBuilder =
ApacheHttpClient.builder();
@@ -96,6 +105,8 @@ public class TestHttpClientConfigurations {
Mockito.verify(spyApacheHttpClientBuilder).maxConnections(104);
Mockito.verify(spyApacheHttpClientBuilder).tcpKeepAlive(true);
Mockito.verify(spyApacheHttpClientBuilder).useIdleConnectionReaper(false);
+ Mockito.verify(spyApacheHttpClientBuilder)
+ .proxyConfiguration(Mockito.any(ProxyConfiguration.class));
}
@Test
@@ -123,5 +134,7 @@ public class TestHttpClientConfigurations {
Mockito.verify(spyApacheHttpClientBuilder,
Mockito.never()).tcpKeepAlive(Mockito.anyBoolean());
Mockito.verify(spyApacheHttpClientBuilder, Mockito.never())
.useIdleConnectionReaper(Mockito.anyBoolean());
+ Mockito.verify(spyApacheHttpClientBuilder, Mockito.never())
+ .proxyConfiguration(Mockito.any(ProxyConfiguration.class));
}
}
diff --git a/docs/docs/aws.md b/docs/docs/aws.md
index 2bd6636670..b2f3241654 100644
--- a/docs/docs/aws.md
+++ b/docs/docs/aws.md
@@ -578,11 +578,12 @@ In contrast, URL Connection HTTP Client optimizes for
minimum dependencies and s
For more details of configuration, see sections [URL Connection HTTP Client
Configurations](#url-connection-http-client-configurations) and [Apache HTTP
Client Configurations](#apache-http-client-configurations).
-Configure the following property to set the type of HTTP client:
+Configurations for the HTTP client can be set via catalog properties. Below is
an overview of available configurations:
-| Property | Default | Description
|
-|------------------|---------|------------------------------------------------------------------------------------------------------------|
-| http-client.type | apache | Types of HTTP Client. <br/> `urlconnection`:
URL Connection HTTP Client <br/> `apache`: Apache HTTP Client |
+| Property | Default | Description
|
+|----------------------------|---------|------------------------------------------------------------------------------------------------------------|
+| http-client.type | apache | Types of HTTP Client. <br/>
`urlconnection`: URL Connection HTTP Client <br/> `apache`: Apache HTTP Client |
+| http-client.proxy-endpoint | null | An optional proxy endpoint to use for
the HTTP client. |
#### URL Connection HTTP Client Configurations