You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hop.apache.org by ha...@apache.org on 2026/03/19 10:48:44 UTC

(hop) branch main updated: Fix REST Client - proxy settings are ignored when using REST connection metadata (#6827)

This is an automated email from the ASF dual-hosted git repository.

hansva pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/hop.git


The following commit(s) were added to refs/heads/main by this push:
     new 79fe3008b3 Fix REST Client - proxy settings are ignored when using REST connection metadata (#6827)
79fe3008b3 is described below

commit 79fe3008b3d301143612855896ab298a96dc2a55
Author: lance <le...@gmail.com>
AuthorDate: Thu Mar 19 18:48:37 2026 +0800

    Fix REST Client - proxy settings are ignored when using REST connection metadata (#6827)
    
    Signed-off-by: lance <le...@gmail.com>
---
 .../apache/hop/metadata/rest/RestConnection.java   | 52 ++++++++++++++--------
 .../apache/hop/pipeline/transforms/rest/Rest.java  |  3 +-
 2 files changed, 35 insertions(+), 20 deletions(-)

diff --git a/plugins/misc/rest/src/main/java/org/apache/hop/metadata/rest/RestConnection.java b/plugins/misc/rest/src/main/java/org/apache/hop/metadata/rest/RestConnection.java
index fe0647210a..6fa2f65890 100644
--- a/plugins/misc/rest/src/main/java/org/apache/hop/metadata/rest/RestConnection.java
+++ b/plugins/misc/rest/src/main/java/org/apache/hop/metadata/rest/RestConnection.java
@@ -47,6 +47,7 @@ import org.apache.hop.metadata.api.HopMetadataBase;
 import org.apache.hop.metadata.api.HopMetadataProperty;
 import org.apache.hop.metadata.api.HopMetadataPropertyType;
 import org.apache.hop.metadata.api.IHopMetadata;
+import org.glassfish.jersey.client.ClientProperties;
 import org.glassfish.jersey.client.authentication.HttpAuthenticationFeature;
 
 @Getter
@@ -60,6 +61,9 @@ import org.glassfish.jersey.client.authentication.HttpAuthenticationFeature;
     hopMetadataPropertyType = HopMetadataPropertyType.REST_CONNECTION,
     supportsGlobalReplace = true)
 public class RestConnection extends HopMetadataBase implements IHopMetadata {
+  public static final String BASIC = "Basic";
+  public static final String API_KEY = "API Key";
+  public static final String BEARER = "Bearer";
 
   private IVariables variables;
   private ClientBuilder builder;
@@ -133,8 +137,13 @@ public class RestConnection extends HopMetadataBase implements IHopMetadata {
   }
 
   public Invocation.Builder getInvocationBuilder(String url) throws HopException {
+    return getInvocationBuilder(url, null, 8080);
+  }
 
+  public Invocation.Builder getInvocationBuilder(String url, String proxyHost, Integer proxyPort)
+      throws HopException {
     builder = ClientBuilder.newBuilder();
+    setProxyHost(proxyHost, proxyPort);
 
     // Configure SSL if needed (client cert, trust store, or ignore SSL)
     if (needsSslConfiguration()) {
@@ -175,25 +184,21 @@ public class RestConnection extends HopMetadataBase implements IHopMetadata {
     if (StringUtils.isEmpty(authType)) {
       if (!StringUtils.isEmpty(authorizationHeaderName)
           && !StringUtils.isEmpty(authorizationHeaderValue)) {
-        authType = "API Key";
+        authType = API_KEY;
       } else {
         authType = "No Auth";
       }
     }
 
-    if (authType.equals("No Auth")) {
-      // Nothing required
-    }
-    if (authType.equals("Basic")) {
-      if (!StringUtils.isEmpty(username) && !StringUtils.isEmpty(password)) {
-
-        client.register(
-            HttpAuthenticationFeature.basic(
-                resolve(username), Encr.decryptPasswordOptionallyEncrypted(resolve(password))));
-        target = client.target(url);
-        invocationBuilder = target.request();
-      }
-    } else if (authType.equals("API Key")) {
+    if (authType.equals(BASIC)
+        && !StringUtils.isEmpty(username)
+        && !StringUtils.isEmpty(password)) {
+      client.register(
+          HttpAuthenticationFeature.basic(
+              resolve(username), Encr.decryptPasswordOptionallyEncrypted(resolve(password))));
+      target = client.target(url);
+      invocationBuilder = target.request();
+    } else if (authType.equals(API_KEY)) {
       if (!StringUtils.isEmpty(resolve(authorizationPrefix))) {
         invocationBuilder.header(
             resolve(authorizationHeaderName),
@@ -205,14 +210,19 @@ public class RestConnection extends HopMetadataBase implements IHopMetadata {
             resolve(authorizationHeaderName),
             Encr.decryptPasswordOptionallyEncrypted(resolve(authorizationHeaderValue)));
       }
-    } else if (authType.equals("Bearer")) {
-      if (!StringUtils.isEmpty(bearerToken)) {
-        invocationBuilder.header(HttpHeaders.AUTHORIZATION, "Bearer " + resolve(bearerToken));
-      }
+    } else if (authType.equals(BEARER) && !StringUtils.isEmpty(bearerToken)) {
+      invocationBuilder.header(HttpHeaders.AUTHORIZATION, "Bearer " + resolve(bearerToken));
     }
     return invocationBuilder;
   }
 
+  private void setProxyHost(String proxyHost, Integer proxyPort) {
+    if (!Utils.isEmpty(proxyHost) && proxyPort != null) {
+      builder =
+          builder.property(ClientProperties.PROXY_URI, "http://" + proxyHost + ":" + proxyPort);
+    }
+  }
+
   public String getResponse(String url) throws HopException {
     return getResponseFromUrl(url).readEntity(String.class);
   }
@@ -329,14 +339,17 @@ public class RestConnection extends HopMetadataBase implements IHopMetadata {
       getLog().logDetailed("ignoreSsl=true -> using trust-all TrustManager.");
       return new TrustManager[] {
         new X509TrustManager() {
+          @Override
           public X509Certificate[] getAcceptedIssuers() {
             return new X509Certificate[0];
           }
 
+          @Override
           public void checkClientTrusted(X509Certificate[] certs, String authType) {
             // Trust all - do nothing
           }
 
+          @Override
           public void checkServerTrusted(X509Certificate[] certs, String authType) {
             // Trust all - do nothing
           }
@@ -348,7 +361,8 @@ public class RestConnection extends HopMetadataBase implements IHopMetadata {
     if (Utils.isEmpty(trustStoreFile)) {
       getLog()
           .logDetailed("No trust store configured. Falling back to default system trust store.");
-      return null; // Use default system trust store
+      // Use default system trust store
+      return null;
     }
 
     // Load custom trust store
diff --git a/plugins/transforms/rest/src/main/java/org/apache/hop/pipeline/transforms/rest/Rest.java b/plugins/transforms/rest/src/main/java/org/apache/hop/pipeline/transforms/rest/Rest.java
index 709dd4d40c..bdcd8735d9 100644
--- a/plugins/transforms/rest/src/main/java/org/apache/hop/pipeline/transforms/rest/Rest.java
+++ b/plugins/transforms/rest/src/main/java/org/apache/hop/pipeline/transforms/rest/Rest.java
@@ -135,7 +135,8 @@ public class Rest extends BaseTransform<RestMeta, RestData> {
         logDetailed(BaseMessages.getString(PKG, "Rest.Log.ConnectingToURL", data.realUrl));
       }
       if (!StringUtils.isEmpty(meta.getConnectionName())) {
-        invocationBuilder = connection.getInvocationBuilder(data.realUrl);
+        invocationBuilder =
+            connection.getInvocationBuilder(data.realUrl, data.realProxyHost, data.realProxyPort);
       } else {
         ClientBuilder clientBuilder = createClientBuilder();
         clientBuilder