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(