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 a69d0ebcfc Fix Google Sheets Proxy: inject httpTransport into 
credentials and handle empty proxy config (#6694)
a69d0ebcfc is described below

commit a69d0ebcfc301aa85dc2adf7920a744096cc5788
Author: Joel Giovinazzo <[email protected]>
AuthorDate: Tue Mar 3 18:51:48 2026 +1100

    Fix Google Sheets Proxy: inject httpTransport into credentials and handle 
empty proxy config (#6694)
---
 .../GoogleSheetsConnectionFactory.java             |  2 +-
 .../googlesheets/GoogleSheetsCredentials.java      | 37 ++++++++++++++++++++--
 .../transforms/googlesheets/GoogleSheetsInput.java |  9 ++++--
 .../googlesheets/GoogleSheetsInputDialog.java      | 24 +++++++++-----
 .../googlesheets/GoogleSheetsOutput.java           |  9 ++++--
 .../googlesheets/GoogleSheetsOutputDialog.java     | 18 +++++++----
 6 files changed, 75 insertions(+), 24 deletions(-)

diff --git 
a/plugins/tech/google/src/main/java/org/apache/hop/pipeline/transforms/googlesheets/GoogleSheetsConnectionFactory.java
 
b/plugins/tech/google/src/main/java/org/apache/hop/pipeline/transforms/googlesheets/GoogleSheetsConnectionFactory.java
index e9aab4d322..36dd96be45 100644
--- 
a/plugins/tech/google/src/main/java/org/apache/hop/pipeline/transforms/googlesheets/GoogleSheetsConnectionFactory.java
+++ 
b/plugins/tech/google/src/main/java/org/apache/hop/pipeline/transforms/googlesheets/GoogleSheetsConnectionFactory.java
@@ -35,7 +35,7 @@ public class GoogleSheetsConnectionFactory {
 
   public static NetHttpTransport newTransport(String proxyHost, String 
proxyPort)
       throws GeneralSecurityException, IOException {
-    if (proxyHost != null && proxyPort != null) {
+    if (proxyHost != null && !proxyHost.isEmpty() && proxyPort != null && 
!proxyPort.isEmpty()) {
       int port = Integer.parseInt(proxyPort);
       return newProxyTransport(proxyHost, port);
     } else {
diff --git 
a/plugins/tech/google/src/main/java/org/apache/hop/pipeline/transforms/googlesheets/GoogleSheetsCredentials.java
 
b/plugins/tech/google/src/main/java/org/apache/hop/pipeline/transforms/googlesheets/GoogleSheetsCredentials.java
index 520ceb0044..48b5db259a 100644
--- 
a/plugins/tech/google/src/main/java/org/apache/hop/pipeline/transforms/googlesheets/GoogleSheetsCredentials.java
+++ 
b/plugins/tech/google/src/main/java/org/apache/hop/pipeline/transforms/googlesheets/GoogleSheetsCredentials.java
@@ -18,9 +18,13 @@
 package org.apache.hop.pipeline.transforms.googlesheets;
 
 import com.google.api.client.http.HttpRequestInitializer;
+import com.google.api.client.http.HttpTransport;
 import com.google.api.services.sqladmin.SQLAdminScopes;
 import com.google.auth.http.HttpCredentialsAdapter;
+import com.google.auth.http.HttpTransportFactory;
 import com.google.auth.oauth2.GoogleCredentials;
+import com.google.auth.oauth2.ServiceAccountCredentials;
+import com.google.auth.oauth2.UserCredentials;
 import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.InputStream;
@@ -36,7 +40,11 @@ public class GoogleSheetsCredentials {
   public static final String APPLICATION_NAME = "Apache-Hop-Google-Sheets";
 
   public static HttpCredentialsAdapter getCredentialsJson(
-      String scope, String jsonCredentialPath, String impersonation, 
IVariables variables)
+      String scope,
+      String jsonCredentialPath,
+      String impersonation,
+      IVariables variables,
+      HttpTransport httpTransport)
       throws IOException {
 
     GoogleCredentials credential;
@@ -51,11 +59,34 @@ public class GoogleSheetsCredentials {
     if (in == null) {
       throw new FileNotFoundException("Resource not found:" + 
jsonCredentialPath);
     }
+
+    credential = GoogleCredentials.fromStream(in);
+
+    if (httpTransport != null) {
+      HttpTransportFactory proxyTransportFactory =
+          new HttpTransportFactory() {
+            @Override
+            public HttpTransport create() {
+              return httpTransport;
+            }
+          };
+
+      if (credential instanceof ServiceAccountCredentials) {
+        credential =
+            ((ServiceAccountCredentials) credential)
+                
.toBuilder().setHttpTransportFactory(proxyTransportFactory).build();
+      } else if (credential instanceof UserCredentials) {
+        credential =
+            ((UserCredentials) credential)
+                
.toBuilder().setHttpTransportFactory(proxyTransportFactory).build();
+      }
+    }
+
     if (StringUtils.isEmpty(impersonation)) {
-      credential = 
GoogleCredentials.fromStream(in).createScoped(Collections.singleton(scope));
+      credential = credential.createScoped(Collections.singleton(scope));
     } else {
       credential =
-          GoogleCredentials.fromStream(in)
+          credential
               
.createScoped(Collections.singleton(SQLAdminScopes.SQLSERVICE_ADMIN))
               .createDelegated(impersonation);
     }
diff --git 
a/plugins/tech/google/src/main/java/org/apache/hop/pipeline/transforms/googlesheets/GoogleSheetsInput.java
 
b/plugins/tech/google/src/main/java/org/apache/hop/pipeline/transforms/googlesheets/GoogleSheetsInput.java
index 748d7beb52..8160aa9730 100644
--- 
a/plugins/tech/google/src/main/java/org/apache/hop/pipeline/transforms/googlesheets/GoogleSheetsInput.java
+++ 
b/plugins/tech/google/src/main/java/org/apache/hop/pipeline/transforms/googlesheets/GoogleSheetsInput.java
@@ -70,8 +70,10 @@ public class GoogleSheetsInput extends 
BaseTransform<GoogleSheetsInputMeta, Goog
 
     try {
       jsonFactory = JacksonFactory.getDefaultInstance();
-      httpTransport =
-          GoogleSheetsConnectionFactory.newTransport(meta.getProxyHost(), 
meta.getProxyPort());
+
+      String host = resolve(meta.getProxyHost());
+      String port = resolve(meta.getProxyPort());
+      httpTransport = GoogleSheetsConnectionFactory.newTransport(host, port);
     } catch (Exception e) {
       logError("cannot initiate HTTP transport" + e.getMessage());
       return false;
@@ -84,7 +86,8 @@ public class GoogleSheetsInput extends 
BaseTransform<GoogleSheetsInputMeta, Goog
                 scope,
                 resolve(meta.getJsonCredentialPath()),
                 resolve(meta.getImpersonation()),
-                variables);
+                variables,
+                httpTransport);
         Sheets service =
             new Sheets.Builder(
                     httpTransport,
diff --git 
a/plugins/tech/google/src/main/java/org/apache/hop/pipeline/transforms/googlesheets/GoogleSheetsInputDialog.java
 
b/plugins/tech/google/src/main/java/org/apache/hop/pipeline/transforms/googlesheets/GoogleSheetsInputDialog.java
index c9af265991..c650191645 100644
--- 
a/plugins/tech/google/src/main/java/org/apache/hop/pipeline/transforms/googlesheets/GoogleSheetsInputDialog.java
+++ 
b/plugins/tech/google/src/main/java/org/apache/hop/pipeline/transforms/googlesheets/GoogleSheetsInputDialog.java
@@ -521,7 +521,8 @@ public class GoogleSheetsInputDialog extends 
BaseTransformDialog {
   private void testServiceAccount() {
     try {
       NetHttpTransport netHttpTransport =
-          GoogleSheetsConnectionFactory.newTransport(meta.getProxyHost(), 
meta.getProxyPort());
+          GoogleSheetsConnectionFactory.newTransport(
+              variables.resolve(meta.getProxyHost()), 
variables.resolve(meta.getProxyPort()));
       JsonFactory jsonFactory = JacksonFactory.getDefaultInstance();
       String scope = SheetsScopes.SPREADSHEETS_READONLY;
 
@@ -531,7 +532,8 @@ public class GoogleSheetsInputDialog extends 
BaseTransformDialog {
               scope,
               variables.resolve(meta.getJsonCredentialPath()),
               variables.resolve(meta.getImpersonation()),
-              variables);
+              variables,
+              netHttpTransport);
       //
       new Drive.Builder(
               netHttpTransport,
@@ -551,7 +553,8 @@ public class GoogleSheetsInputDialog extends 
BaseTransformDialog {
   private void selectSpreadSheet() {
     try {
       NetHttpTransport netHttpTransport =
-          GoogleSheetsConnectionFactory.newTransport(meta.getProxyHost(), 
meta.getProxyPort());
+          GoogleSheetsConnectionFactory.newTransport(
+              variables.resolve(meta.getProxyHost()), 
variables.resolve(meta.getProxyPort()));
       JsonFactory jsonFactory = JacksonFactory.getDefaultInstance();
       String scope = "https://www.googleapis.com/auth/drive.readonly";;
       HttpRequestInitializer credential =
@@ -559,7 +562,8 @@ public class GoogleSheetsInputDialog extends 
BaseTransformDialog {
               scope,
               variables.resolve(meta.getJsonCredentialPath()),
               variables.resolve(meta.getImpersonation()),
-              variables);
+              variables,
+              netHttpTransport);
       //
       Drive service =
           new Drive.Builder(
@@ -618,7 +622,8 @@ public class GoogleSheetsInputDialog extends 
BaseTransformDialog {
     try {
 
       NetHttpTransport netHttpTransport =
-          GoogleSheetsConnectionFactory.newTransport(meta.getProxyHost(), 
meta.getProxyPort());
+          GoogleSheetsConnectionFactory.newTransport(
+              variables.resolve(meta.getProxyHost()), 
variables.resolve(meta.getProxyPort()));
       JsonFactory jsonFactory = JacksonFactory.getDefaultInstance();
       String scope = SheetsScopes.SPREADSHEETS_READONLY;
 
@@ -627,7 +632,8 @@ public class GoogleSheetsInputDialog extends 
BaseTransformDialog {
               scope,
               variables.resolve(meta.getJsonCredentialPath()),
               variables.resolve(meta.getImpersonation()),
-              variables);
+              variables,
+              netHttpTransport);
       //
       Sheets service =
           new Sheets.Builder(
@@ -834,7 +840,8 @@ public class GoogleSheetsInputDialog extends 
BaseTransformDialog {
       GoogleSheetsInputMeta meta = new GoogleSheetsInputMeta();
       setData(meta);
       NetHttpTransport netHttpTransport =
-          GoogleSheetsConnectionFactory.newTransport(meta.getProxyHost(), 
meta.getProxyPort());
+          GoogleSheetsConnectionFactory.newTransport(
+              variables.resolve(meta.getProxyHost()), 
variables.resolve(meta.getProxyPort()));
       JsonFactory jsonFactory = JacksonFactory.getDefaultInstance();
       String scope = SheetsScopes.SPREADSHEETS_READONLY;
       wFields.table.removeAll();
@@ -844,7 +851,8 @@ public class GoogleSheetsInputDialog extends 
BaseTransformDialog {
               scope,
               variables.resolve(meta.getJsonCredentialPath()),
               variables.resolve(meta.getImpersonation()),
-              variables);
+              variables,
+              netHttpTransport);
       Sheets service =
           new Sheets.Builder(
                   netHttpTransport,
diff --git 
a/plugins/tech/google/src/main/java/org/apache/hop/pipeline/transforms/googlesheets/GoogleSheetsOutput.java
 
b/plugins/tech/google/src/main/java/org/apache/hop/pipeline/transforms/googlesheets/GoogleSheetsOutput.java
index 12ea3c6707..1614644020 100644
--- 
a/plugins/tech/google/src/main/java/org/apache/hop/pipeline/transforms/googlesheets/GoogleSheetsOutput.java
+++ 
b/plugins/tech/google/src/main/java/org/apache/hop/pipeline/transforms/googlesheets/GoogleSheetsOutput.java
@@ -86,7 +86,8 @@ public class GoogleSheetsOutput
       // Check if file exists
       try {
         httpTransport =
-            GoogleSheetsConnectionFactory.newTransport(meta.getProxyHost(), 
meta.getProxyPort());
+            GoogleSheetsConnectionFactory.newTransport(
+                resolve(meta.getProxyHost()), resolve(meta.getProxyPort()));
         jsonFactory = JacksonFactory.getDefaultInstance();
         scope = "https://www.googleapis.com/auth/drive";;
 
@@ -95,7 +96,8 @@ public class GoogleSheetsOutput
                 scope,
                 resolve(meta.getJsonCredentialPath()),
                 resolve(meta.getImpersonation()),
-                variables);
+                variables,
+                httpTransport);
         Drive service =
             new Drive.Builder(
                     httpTransport,
@@ -362,7 +364,8 @@ public class GoogleSheetsOutput
                   scope,
                   resolve(meta.getJsonCredentialPath()),
                   resolve(meta.getImpersonation()),
-                  variables);
+                  variables,
+                  httpTransport);
           data.service =
               new Sheets.Builder(
                       httpTransport,
diff --git 
a/plugins/tech/google/src/main/java/org/apache/hop/pipeline/transforms/googlesheets/GoogleSheetsOutputDialog.java
 
b/plugins/tech/google/src/main/java/org/apache/hop/pipeline/transforms/googlesheets/GoogleSheetsOutputDialog.java
index 23c8ae5be0..af47fb9305 100644
--- 
a/plugins/tech/google/src/main/java/org/apache/hop/pipeline/transforms/googlesheets/GoogleSheetsOutputDialog.java
+++ 
b/plugins/tech/google/src/main/java/org/apache/hop/pipeline/transforms/googlesheets/GoogleSheetsOutputDialog.java
@@ -494,7 +494,8 @@ public class GoogleSheetsOutputDialog extends 
BaseTransformDialog {
   private void selectWorksheet() {
     try {
       NetHttpTransport netHttpTransport =
-          GoogleSheetsConnectionFactory.newTransport(meta.getProxyHost(), 
meta.getProxyPort());
+          GoogleSheetsConnectionFactory.newTransport(
+              variables.resolve(meta.getProxyHost()), 
variables.resolve(meta.getProxyPort()));
       JsonFactory jsonFactory = JacksonFactory.getDefaultInstance();
       String scope = SheetsScopes.SPREADSHEETS_READONLY;
 
@@ -503,7 +504,8 @@ public class GoogleSheetsOutputDialog extends 
BaseTransformDialog {
               scope,
               variables.resolve(meta.getJsonCredentialPath()),
               variables.resolve(meta.getImpersonation()),
-              variables);
+              variables,
+              netHttpTransport);
       Sheets service =
           new Sheets.Builder(
                   netHttpTransport,
@@ -552,7 +554,8 @@ public class GoogleSheetsOutputDialog extends 
BaseTransformDialog {
   private void selectSpreadSheetKey() {
     try {
       NetHttpTransport netHttpTransport =
-          GoogleSheetsConnectionFactory.newTransport(meta.getProxyHost(), 
meta.getProxyPort());
+          GoogleSheetsConnectionFactory.newTransport(
+              variables.resolve(meta.getProxyHost()), 
variables.resolve(meta.getProxyPort()));
       JsonFactory jsonFactory = JacksonFactory.getDefaultInstance();
       String scope = "https://www.googleapis.com/auth/drive";;
       HttpRequestInitializer credential =
@@ -560,7 +563,8 @@ public class GoogleSheetsOutputDialog extends 
BaseTransformDialog {
               scope,
               variables.resolve(meta.getJsonCredentialPath()),
               variables.resolve(meta.getImpersonation()),
-              variables);
+              variables,
+              netHttpTransport);
       Drive service =
           new Drive.Builder(
                   netHttpTransport,
@@ -616,7 +620,8 @@ public class GoogleSheetsOutputDialog extends 
BaseTransformDialog {
   private void testServiceAccount() {
     try {
       NetHttpTransport netHttpTransport =
-          GoogleSheetsConnectionFactory.newTransport(meta.getProxyHost(), 
meta.getProxyPort());
+          GoogleSheetsConnectionFactory.newTransport(
+              variables.resolve(meta.getProxyHost()), 
variables.resolve(meta.getProxyPort()));
       JsonFactory jsonFactory = JacksonFactory.getDefaultInstance();
       String scope = SheetsScopes.SPREADSHEETS_READONLY;
 
@@ -625,7 +630,8 @@ public class GoogleSheetsOutputDialog extends 
BaseTransformDialog {
               scope,
               variables.resolve(wPrivateKeyStore.getText()),
               variables.resolve(wImpersonation.getText()),
-              variables);
+              variables,
+              netHttpTransport);
       // Build a Drive connection to test it
       //
       new Drive.Builder(

Reply via email to