headers = getHeaders(settings, credentials);
if (transportChannelProvider.needsHeaders()) {
transportChannelProvider = transportChannelProvider.withHeaders(headers);
}
@@ -291,11 +280,51 @@ public static ClientContext create(StubSettings settings) throws IOException {
.build();
}
+ /** Determines which credentials to use. API key overrides credentials provided by provider. */
+ private static Credentials getCredentials(StubSettings settings) throws IOException {
+ Credentials credentials;
+ if (settings.getApiKey() != null) {
+ // if API key exists it becomes the default credential
+ credentials = ApiKeyCredentials.create(settings.getApiKey());
+ } else {
+ credentials = settings.getCredentialsProvider().getCredentials();
+ }
+ return credentials;
+ }
+
+ /**
+ * Constructs a new {@link com.google.auth.Credentials} object based on credentials provided with
+ * a GDC-H audience
+ */
+ @VisibleForTesting
+ static GdchCredentials getGdchCredentials(
+ String settingsGdchApiAudience, String endpoint, Credentials credentials) throws IOException {
+ String audienceString;
+ if (!Strings.isNullOrEmpty(settingsGdchApiAudience)) {
+ audienceString = settingsGdchApiAudience;
+ } else if (!Strings.isNullOrEmpty(endpoint)) {
+ audienceString = endpoint;
+ } else {
+ throw new IllegalArgumentException("Could not infer GDCH api audience from settings");
+ }
+
+ URI gdchAudienceUri;
+ try {
+ gdchAudienceUri = URI.create(audienceString);
+ } catch (IllegalArgumentException ex) { // thrown when passing a malformed uri string
+ throw new IllegalArgumentException("The GDC-H API audience string is not a valid URI", ex);
+ }
+ return ((GdchCredentials) credentials).createWithGdchAudience(gdchAudienceUri);
+ }
+
/**
* Getting a header map from HeaderProvider and InternalHeaderProvider from settings with Quota
* Project Id.
+ *
+ * Then if credentials is present and its type for metrics is not {@code
+ * CredentialTypeForMetrics.DO_NOT_SEND}, append this type info to x-goog-api-client header.
*/
- private static Map getHeadersFromSettings(StubSettings settings) {
+ private static Map getHeaders(StubSettings settings, Credentials credentials) {
// Resolve conflicts when merging headers from multiple sources
Map userHeaders = settings.getHeaderProvider().getHeaders();
Map internalHeaders = settings.getInternalHeaderProvider().getHeaders();
@@ -322,6 +351,20 @@ private static Map getHeadersFromSettings(StubSettings settings)
effectiveHeaders.putAll(userHeaders);
effectiveHeaders.putAll(conflictResolution);
+ return appendCredentialTypeToHeaderIfPresent(effectiveHeaders, credentials);
+ }
+
+ private static Map appendCredentialTypeToHeaderIfPresent(
+ Map effectiveHeaders, Credentials credentials) {
+ CredentialTypeForMetrics credentialTypeForMetrics =
+ credentials == null
+ ? CredentialTypeForMetrics.DO_NOT_SEND
+ : credentials.getMetricsCredentialType();
+ if (credentialTypeForMetrics != CredentialTypeForMetrics.DO_NOT_SEND) {
+ effectiveHeaders.computeIfPresent(
+ ApiClientHeaderProvider.getDefaultApiClientHeaderKey(),
+ (key, value) -> value + " cred-type/" + credentialTypeForMetrics.getLabel());
+ }
return ImmutableMap.copyOf(effectiveHeaders);
}
diff --git a/gax-java/gax/src/main/java/com/google/api/gax/rpc/ClientSettings.java b/gax-java/gax/src/main/java/com/google/api/gax/rpc/ClientSettings.java
index b5e54484dd..234fd4d19d 100644
--- a/gax-java/gax/src/main/java/com/google/api/gax/rpc/ClientSettings.java
+++ b/gax-java/gax/src/main/java/com/google/api/gax/rpc/ClientSettings.java
@@ -112,6 +112,11 @@ public final WatchdogProvider getWatchdogProvider() {
return stubSettings.getStreamWatchdogProvider();
}
+ /** Gets the API Key that should be used for authentication. */
+ public final String getApiKey() {
+ return stubSettings.getApiKey();
+ }
+
/** This method is obsolete. Use {@link #getWatchdogCheckIntervalDuration()} instead. */
@Nonnull
@ObsoleteApi("Use getWatchdogCheckIntervalDuration() instead")
@@ -144,6 +149,7 @@ public String toString() {
.add("watchdogProvider", getWatchdogProvider())
.add("watchdogCheckInterval", getWatchdogCheckInterval())
.add("gdchApiAudience", getGdchApiAudience())
+ .add("apiKey", getApiKey())
.toString();
}
@@ -302,6 +308,21 @@ public B setGdchApiAudience(@Nullable String gdchApiAudience) {
return self();
}
+ /**
+ * Sets the API key. The API key will get translated to an {@link
+ * com.google.auth.ApiKeyCredentials} and stored in {@link ClientContext}.
+ *
+ * API Key authorization is not supported for every product. Please check the documentation
+ * for each product to confirm if it is supported.
+ *
+ *
Note: If you set an API key and {@link CredentialsProvider} in the same ClientSettings the
+ * API key will override any credentials provided.
+ */
+ public B setApiKey(String apiKey) {
+ stubSettings.setApiKey(apiKey);
+ return self();
+ }
+
/**
* Gets the ExecutorProvider that was previously set on this Builder. This ExecutorProvider is
* to use for running asynchronous API call logic (such as retries and long-running operations),
@@ -364,6 +385,11 @@ public WatchdogProvider getWatchdogProvider() {
return stubSettings.getStreamWatchdogProvider();
}
+ /** Gets the API Key that was previously set on this Builder. */
+ public String getApiKey() {
+ return stubSettings.getApiKey();
+ }
+
/** This method is obsolete. Use {@link #getWatchdogCheckIntervalDuration()} instead */
@Nullable
@ObsoleteApi("Use getWatchdogCheckIntervalDuration() instead")
@@ -405,6 +431,7 @@ public String toString() {
.add("watchdogProvider", getWatchdogProvider())
.add("watchdogCheckInterval", getWatchdogCheckIntervalDuration())
.add("gdchApiAudience", getGdchApiAudience())
+ .add("apiKey", getApiKey())
.toString();
}
}
diff --git a/gax-java/gax/src/main/java/com/google/api/gax/rpc/EndpointContext.java b/gax-java/gax/src/main/java/com/google/api/gax/rpc/EndpointContext.java
index efe0f517f5..dd6c199b35 100644
--- a/gax-java/gax/src/main/java/com/google/api/gax/rpc/EndpointContext.java
+++ b/gax-java/gax/src/main/java/com/google/api/gax/rpc/EndpointContext.java
@@ -32,6 +32,7 @@
import com.google.api.core.InternalApi;
import com.google.api.gax.rpc.mtls.MtlsProvider;
import com.google.auth.Credentials;
+import com.google.auth.oauth2.ComputeEngineCredentials;
import com.google.auto.value.AutoValue;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Strings;
@@ -145,6 +146,11 @@ public void validateUniverseDomain(
// GDC-H has no universe domain, return
return;
}
+ // (TODO: b/349488459) - Disable automatic requests to MDS until 01/2025
+ // If MDS is required for Universe Domain, do not do any validation
+ if (credentials instanceof ComputeEngineCredentials) {
+ return;
+ }
String credentialsUniverseDomain = Credentials.GOOGLE_DEFAULT_UNIVERSE;
// If credentials is not NoCredentialsProvider, use the Universe Domain inside Credentials
if (credentials != null) {
diff --git a/gax-java/gax/src/main/java/com/google/api/gax/rpc/StubSettings.java b/gax-java/gax/src/main/java/com/google/api/gax/rpc/StubSettings.java
index daeda4c445..03c9519e38 100644
--- a/gax-java/gax/src/main/java/com/google/api/gax/rpc/StubSettings.java
+++ b/gax-java/gax/src/main/java/com/google/api/gax/rpc/StubSettings.java
@@ -82,6 +82,7 @@ public abstract class StubSettings> {
// Track if deprecated setExecutorProvider is called
private boolean deprecatedExecutorProviderSet;
@Nonnull private final EndpointContext endpointContext;
+ private final String apiKey;
/**
* Indicate when creating transport whether it is allowed to use mTLS endpoint instead of the
@@ -107,6 +108,7 @@ protected StubSettings(Builder builder) {
this.deprecatedExecutorProviderSet = builder.deprecatedExecutorProviderSet;
this.gdchApiAudience = builder.gdchApiAudience;
this.endpointContext = buildEndpointContext(builder);
+ this.apiKey = builder.apiKey;
}
/**
@@ -234,6 +236,11 @@ public final String getGdchApiAudience() {
return gdchApiAudience;
}
+ /** Gets the API Key that should be used for authentication. */
+ public final String getApiKey() {
+ return apiKey;
+ }
+
@Override
public String toString() {
return MoreObjects.toStringHelper(this)
@@ -252,6 +259,7 @@ public String toString() {
.add("streamWatchdogCheckInterval", streamWatchdogCheckInterval)
.add("tracerFactory", tracerFactory)
.add("gdchApiAudience", gdchApiAudience)
+ .add("apiKey", apiKey)
.toString();
}
@@ -277,6 +285,7 @@ public abstract static class Builder<
private boolean deprecatedExecutorProviderSet;
private String universeDomain;
private final EndpointContext endpointContext;
+ private String apiKey;
/**
* Indicate when creating transport whether it is allowed to use mTLS endpoint instead of the
@@ -301,6 +310,7 @@ protected Builder(StubSettings settings) {
this.tracerFactory = settings.tracerFactory;
this.deprecatedExecutorProviderSet = settings.deprecatedExecutorProviderSet;
this.gdchApiAudience = settings.gdchApiAudience;
+ this.apiKey = settings.apiKey;
// The follow settings will be set to the original user configurations as the
// EndpointContext will be rebuilt in the constructor.
@@ -353,6 +363,7 @@ protected Builder(ClientContext clientContext) {
this.mtlsEndpoint = null;
this.switchToMtlsEndpointAllowed = false;
this.universeDomain = null;
+ this.apiKey = null;
// Attempt to create an empty, non-functioning EndpointContext by default. The client will
// have
// a valid EndpointContext with user configurations after the client has been initialized.
@@ -574,6 +585,21 @@ public B setTracerFactory(@Nonnull ApiTracerFactory tracerFactory) {
return self();
}
+ /**
+ * Sets the API key. The API key will get translated to an {@link
+ * com.google.auth.ApiKeyCredentials} and stored in {@link ClientContext}.
+ *
+ * API Key authorization is not supported for every product. Please check the documentation
+ * for each product to confirm if it is supported.
+ *
+ *
Note: If you set an API key and {@link CredentialsProvider} in the same ClientSettings the
+ * API key will override any credentials provided.
+ */
+ public B setApiKey(String apiKey) {
+ this.apiKey = apiKey;
+ return self();
+ }
+
/** @deprecated Please use {@link #getBackgroundExecutorProvider()}. */
@Deprecated
public ExecutorProvider getExecutorProvider() {
@@ -616,6 +642,11 @@ public ApiClock getClock() {
return clock;
}
+ /** Gets the API Key that was previously set on this Builder. */
+ public final String getApiKey() {
+ return apiKey;
+ }
+
/**
* @return the resolved endpoint when the Builder was created. If invoked after
* `StubSettings.newBuilder()` is called, it will return the clientSettingsEndpoint value.
diff --git a/gax-java/gax/src/main/java/com/google/api/gax/rpc/internal/QuotaProjectIdHidingCredentials.java b/gax-java/gax/src/main/java/com/google/api/gax/rpc/internal/QuotaProjectIdHidingCredentials.java
index 51bbade9a0..8c9d2c5799 100644
--- a/gax-java/gax/src/main/java/com/google/api/gax/rpc/internal/QuotaProjectIdHidingCredentials.java
+++ b/gax-java/gax/src/main/java/com/google/api/gax/rpc/internal/QuotaProjectIdHidingCredentials.java
@@ -89,4 +89,9 @@ public boolean hasRequestMetadataOnly() {
public void refresh() throws IOException {
this.wrappedCredentials.refresh();
}
+
+ @Override
+ public String getUniverseDomain() throws IOException {
+ return this.wrappedCredentials.getUniverseDomain();
+ }
}
diff --git a/gax-java/gax/src/test/java/com/google/api/gax/rpc/ClientContextTest.java b/gax-java/gax/src/test/java/com/google/api/gax/rpc/ClientContextTest.java
index 5efce3fbe9..826864a49c 100644
--- a/gax-java/gax/src/test/java/com/google/api/gax/rpc/ClientContextTest.java
+++ b/gax-java/gax/src/test/java/com/google/api/gax/rpc/ClientContextTest.java
@@ -39,6 +39,7 @@
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
import com.google.api.core.ApiClock;
import com.google.api.gax.core.BackgroundResource;
@@ -52,6 +53,8 @@
import com.google.api.gax.rpc.testing.FakeClientSettings;
import com.google.api.gax.rpc.testing.FakeStubSettings;
import com.google.api.gax.rpc.testing.FakeTransportChannel;
+import com.google.auth.ApiKeyCredentials;
+import com.google.auth.CredentialTypeForMetrics;
import com.google.auth.Credentials;
import com.google.auth.oauth2.ComputeEngineCredentials;
import com.google.auth.oauth2.GdchCredentials;
@@ -205,9 +208,6 @@ public TransportChannelProvider withPoolSize(int size) {
@Override
public TransportChannel getTransportChannel() throws IOException {
- if (needsCredentials()) {
- throw new IllegalStateException("Needs Credentials");
- }
transport.setExecutor(executor);
return transport;
}
@@ -679,6 +679,86 @@ void testUserAgentConcat() throws Exception {
.containsEntry("user-agent", "user-supplied-agent internal-agent");
}
+ @Test
+ void testApiClientHeaderAppendsCredType() throws Exception {
+ GoogleCredentials googleCredentials = Mockito.mock(GoogleCredentials.class);
+ when(googleCredentials.getMetricsCredentialType())
+ .thenReturn(CredentialTypeForMetrics.USER_CREDENTIALS);
+
+ Map headers =
+ setupTestForCredentialTokenUsageMetricsAndGetTransportChannelHeaders(
+ FixedCredentialsProvider.create(googleCredentials),
+ FixedHeaderProvider.create("x-goog-api-client", "internal-agent"));
+
+ assertThat(headers).containsEntry("x-goog-api-client", "internal-agent cred-type/u");
+ }
+
+ @Test
+ void testApiClientHeaderDoNotAppendsCredType_whenNoApiClientHeader() throws Exception {
+ GoogleCredentials googleCredentials = Mockito.mock(GoogleCredentials.class);
+ when(googleCredentials.getMetricsCredentialType())
+ .thenReturn(CredentialTypeForMetrics.USER_CREDENTIALS);
+
+ Map headers =
+ setupTestForCredentialTokenUsageMetricsAndGetTransportChannelHeaders(
+ FixedCredentialsProvider.create(googleCredentials),
+ FixedHeaderProvider.create("some-other-header", "internal-agent"));
+
+ assertThat(headers).doesNotContainKey("x-goog-api-client");
+ assertThat(headers).containsEntry("some-other-header", "internal-agent");
+ }
+
+ @Test
+ void testApiClientHeaderDoNotAppendsCredType_whenNullCredentials() throws IOException {
+ Map headers =
+ setupTestForCredentialTokenUsageMetricsAndGetTransportChannelHeaders(
+ NoCredentialsProvider.create(),
+ FixedHeaderProvider.create("x-goog-api-client", "internal-agent"));
+
+ assertThat(headers).containsKey("x-goog-api-client");
+ assertThat(headers.get("x-goog-api-client")).doesNotContain("cred-type/");
+ }
+
+ @Test
+ void testApiClientHeaderDoNotAppendsCredType_whenCredTypeDoNotSend() throws Exception {
+ GoogleCredentials googleCredentials = Mockito.mock(GoogleCredentials.class);
+ when(googleCredentials.getMetricsCredentialType())
+ .thenReturn(CredentialTypeForMetrics.DO_NOT_SEND);
+
+ Map headers =
+ setupTestForCredentialTokenUsageMetricsAndGetTransportChannelHeaders(
+ FixedCredentialsProvider.create(googleCredentials),
+ FixedHeaderProvider.create("x-goog-api-client", "internal-agent"));
+
+ assertThat(headers).containsKey("x-goog-api-client");
+ assertThat(headers.get("x-goog-api-client")).doesNotContain("cred-type/");
+ }
+
+ private Map setupTestForCredentialTokenUsageMetricsAndGetTransportChannelHeaders(
+ CredentialsProvider credentialsProvider, HeaderProvider headerProvider) throws IOException {
+ TransportChannelProvider transportChannelProvider =
+ new FakeTransportProvider(
+ FakeTransportChannel.create(new FakeChannel()),
+ null,
+ true,
+ null,
+ null,
+ DEFAULT_ENDPOINT);
+
+ ClientSettings.Builder builder =
+ new FakeClientSettings.Builder()
+ .setExecutorProvider(
+ FixedExecutorProvider.create(Mockito.mock(ScheduledExecutorService.class)))
+ .setTransportChannelProvider(transportChannelProvider)
+ .setCredentialsProvider(credentialsProvider)
+ .setInternalHeaderProvider(headerProvider);
+
+ ClientContext clientContext = ClientContext.create(builder.build());
+ FakeTransportChannel transportChannel =
+ (FakeTransportChannel) clientContext.getTransportChannel();
+ return transportChannel.getHeaders();
+ }
+
private static String endpoint = "https://foo.googleapis.com";
private static String mtlsEndpoint = "https://foo.mtls.googleapis.com";
@@ -1074,4 +1154,46 @@ public void testStreamWatchdogInterval_backportMethodsBehaveCorrectly() {
ct -> ct.getStreamWatchdogCheckIntervalDuration(),
ct -> ct.getStreamWatchdogCheckInterval());
}
+
+ @Test
+ void testSetApiKey_createsApiCredentials() throws IOException {
+ String apiKey = "key";
+ FakeStubSettings.Builder builder = new FakeStubSettings.Builder();
+ InterceptingExecutor executor = new InterceptingExecutor(1);
+ FakeTransportChannel transportChannel = FakeTransportChannel.create(new FakeChannel());
+ FakeTransportProvider transportProvider =
+ new FakeTransportProvider(
+ transportChannel, executor, true, ImmutableMap.of(), null, DEFAULT_ENDPOINT);
+ builder.setTransportChannelProvider(transportProvider);
+ HeaderProvider headerProvider = Mockito.mock(HeaderProvider.class);
+ Mockito.when(headerProvider.getHeaders()).thenReturn(ImmutableMap.of());
+ builder.setHeaderProvider(headerProvider);
+ builder.setApiKey(apiKey);
+
+ ClientContext context = ClientContext.create(builder.build());
+
+ FakeCallContext fakeCallContext = (FakeCallContext) context.getDefaultCallContext();
+ assertThat(fakeCallContext.getCredentials()).isInstanceOf(ApiKeyCredentials.class);
+ }
+
+ @Test
+ void testSetApiKey_withDefaultCredentials_overridesCredentials() throws IOException {
+ String apiKey = "key";
+ FakeStubSettings.Builder builder = FakeStubSettings.newBuilder();
+ InterceptingExecutor executor = new InterceptingExecutor(1);
+ FakeTransportChannel transportChannel = FakeTransportChannel.create(new FakeChannel());
+ FakeTransportProvider transportProvider =
+ new FakeTransportProvider(
+ transportChannel, executor, true, ImmutableMap.of(), null, DEFAULT_ENDPOINT);
+ builder.setTransportChannelProvider(transportProvider);
+ HeaderProvider headerProvider = Mockito.mock(HeaderProvider.class);
+ Mockito.when(headerProvider.getHeaders()).thenReturn(ImmutableMap.of());
+ builder.setHeaderProvider(headerProvider);
+ builder.setApiKey(apiKey);
+
+ ClientContext context = ClientContext.create(builder.build());
+
+ FakeCallContext fakeCallContext = (FakeCallContext) context.getDefaultCallContext();
+ assertThat(fakeCallContext.getCredentials()).isInstanceOf(ApiKeyCredentials.class);
+ }
}
diff --git a/gax-java/gax/src/test/java/com/google/api/gax/rpc/ClientSettingsTest.java b/gax-java/gax/src/test/java/com/google/api/gax/rpc/ClientSettingsTest.java
index 3e99f7471c..e48df7af54 100644
--- a/gax-java/gax/src/test/java/com/google/api/gax/rpc/ClientSettingsTest.java
+++ b/gax-java/gax/src/test/java/com/google/api/gax/rpc/ClientSettingsTest.java
@@ -120,6 +120,7 @@ void testEmptyBuilder() throws Exception {
Truth.assertThat(builder.getWatchdogCheckIntervalDuration())
.isGreaterThan(java.time.Duration.ZERO);
Truth.assertThat(builder.getQuotaProjectId()).isNull();
+ Truth.assertThat(builder.getApiKey()).isNull();
FakeClientSettings settings = builder.build();
Truth.assertThat(settings.getExecutorProvider())
@@ -150,6 +151,7 @@ void testEmptyBuilder() throws Exception {
Truth.assertThat(settingsString).contains("watchdogProvider");
Truth.assertThat(settingsString).contains("watchdogCheckInterval");
Truth.assertThat(settingsString).contains(("quotaProjectId"));
+ Truth.assertThat(settingsString).contains(("apiKey"));
}
@Test
@@ -165,6 +167,7 @@ void testBuilder() throws Exception {
WatchdogProvider watchdogProvider = Mockito.mock(WatchdogProvider.class);
java.time.Duration watchdogCheckInterval = java.time.Duration.ofSeconds(13);
String quotaProjectId = "test_quota_project_id";
+ String apiKey = "api_key";
builder.setExecutorProvider(executorProvider);
builder.setTransportChannelProvider(transportProvider);
@@ -175,6 +178,7 @@ void testBuilder() throws Exception {
builder.setWatchdogProvider(watchdogProvider);
builder.setWatchdogCheckIntervalDuration(watchdogCheckInterval);
builder.setQuotaProjectId(quotaProjectId);
+ builder.setApiKey(apiKey);
// For backward compatibility, backgroundExecutorProvider is set to executorProvider
Truth.assertThat(builder.getExecutorProvider()).isSameInstanceAs(executorProvider);
@@ -188,6 +192,7 @@ void testBuilder() throws Exception {
Truth.assertThat(builder.getWatchdogCheckIntervalDuration())
.isSameInstanceAs(watchdogCheckInterval);
Truth.assertThat(builder.getQuotaProjectId()).isEqualTo(quotaProjectId);
+ Truth.assertThat(builder.getApiKey()).isEqualTo(apiKey);
String builderString = builder.toString();
Truth.assertThat(builderString).contains("executorProvider");
@@ -200,6 +205,7 @@ void testBuilder() throws Exception {
Truth.assertThat(builderString).contains("watchdogProvider");
Truth.assertThat(builderString).contains("watchdogCheckInterval");
Truth.assertThat(builderString).contains("quotaProjectId");
+ Truth.assertThat(builderString).contains("apiKey");
}
@Test
diff --git a/gax-java/gax/src/test/java/com/google/api/gax/rpc/EndpointContextTest.java b/gax-java/gax/src/test/java/com/google/api/gax/rpc/EndpointContextTest.java
index 98a32bc05a..3276e4a73e 100644
--- a/gax-java/gax/src/test/java/com/google/api/gax/rpc/EndpointContextTest.java
+++ b/gax-java/gax/src/test/java/com/google/api/gax/rpc/EndpointContextTest.java
@@ -29,12 +29,14 @@
*/
package com.google.api.gax.rpc;
+import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
import static org.junit.jupiter.api.Assertions.assertThrows;
import com.google.api.gax.core.NoCredentialsProvider;
import com.google.api.gax.rpc.mtls.MtlsProvider;
import com.google.api.gax.rpc.testing.FakeMtlsProvider;
import com.google.auth.Credentials;
+import com.google.auth.oauth2.ComputeEngineCredentials;
import com.google.common.truth.Truth;
import io.grpc.Status;
import java.io.IOException;
@@ -437,4 +439,19 @@ void hasValidUniverseDomain_credentialsInGDU_configNonGDU() throws IOException {
UnauthenticatedException.class,
() -> endpointContext.validateUniverseDomain(credentials, statusCode));
}
+
+ // (TODO: b/349488459) - Disable automatic requests to MDS until 01/2025
+ // Test is to ensure that no validation is being run for ComputeEngineCredentials
+ @Test
+ void hasValidUniverseDomain_computeEngineCredentials_noValidationOnUniverseDomain()
+ throws IOException {
+ Credentials credentials = Mockito.mock(ComputeEngineCredentials.class);
+ Mockito.when(credentials.getUniverseDomain()).thenReturn(Credentials.GOOGLE_DEFAULT_UNIVERSE);
+ EndpointContext endpointContext =
+ defaultEndpointContextBuilder
+ // Set a custom Universe Domain that doesn't match
+ .setUniverseDomain("test.com")
+ .build();
+ assertDoesNotThrow(() -> endpointContext.validateUniverseDomain(credentials, statusCode));
+ }
}
diff --git a/gax-java/gax/src/test/java/com/google/api/gax/rpc/internal/QuotaProjectIdHidingCredentialsTest.java b/gax-java/gax/src/test/java/com/google/api/gax/rpc/internal/QuotaProjectIdHidingCredentialsTest.java
index 9a02bd13dd..0d9d357115 100644
--- a/gax-java/gax/src/test/java/com/google/api/gax/rpc/internal/QuotaProjectIdHidingCredentialsTest.java
+++ b/gax-java/gax/src/test/java/com/google/api/gax/rpc/internal/QuotaProjectIdHidingCredentialsTest.java
@@ -101,4 +101,15 @@ void quotaProjectIdHidingCredentials_getAuthenticationType() throws IOException
Mockito.verify(credentials, Mockito.atLeastOnce()).refresh();
}
+
+ @Test
+ void quotaProjectIdHidingCredentials_getUniverseDomain() throws IOException {
+ Credentials credentials = Mockito.mock(GoogleCredentials.class);
+ Mockito.when(credentials.getUniverseDomain()).thenReturn("example.com");
+
+ QuotaProjectIdHidingCredentials quotaProjectIdHidingCredentials =
+ new QuotaProjectIdHidingCredentials(credentials);
+
+ assertEquals(quotaProjectIdHidingCredentials.getUniverseDomain(), "example.com");
+ }
}
diff --git a/gax-java/gax/src/test/java/com/google/api/gax/rpc/testing/FakeStubSettings.java b/gax-java/gax/src/test/java/com/google/api/gax/rpc/testing/FakeStubSettings.java
index c5f0cc81f4..4004a24404 100644
--- a/gax-java/gax/src/test/java/com/google/api/gax/rpc/testing/FakeStubSettings.java
+++ b/gax-java/gax/src/test/java/com/google/api/gax/rpc/testing/FakeStubSettings.java
@@ -30,17 +30,26 @@
package com.google.api.gax.rpc.testing;
import com.google.api.core.InternalApi;
+import com.google.api.gax.core.GoogleCredentialsProvider;
import com.google.api.gax.rpc.ClientContext;
import com.google.api.gax.rpc.StubSettings;
+import com.google.common.collect.ImmutableList;
import java.io.IOException;
@InternalApi("for testing")
public class FakeStubSettings extends StubSettings {
+ private static final ImmutableList DEFAULT_SERVICE_SCOPES =
+ ImmutableList.builder().build();
+
private FakeStubSettings(Builder builder) throws IOException {
super(builder);
}
+ public static Builder newBuilder() {
+ return Builder.createDefault();
+ }
+
@Override
public String getServiceName() {
return "test";
@@ -69,5 +78,20 @@ public Builder() {
public com.google.api.gax.rpc.testing.FakeStubSettings build() throws IOException {
return new com.google.api.gax.rpc.testing.FakeStubSettings(this);
}
+
+ /** Returns default settings values. */
+ public static Builder createDefault() {
+ Builder builder = new Builder(((ClientContext) null));
+ builder.setCredentialsProvider(defaultCredentialsProviderBuilder());
+ return builder;
+ }
+
+ /** Returns default credentials provider. */
+ public static GoogleCredentialsProvider defaultCredentialsProviderBuilder() {
+ return GoogleCredentialsProvider.newBuilder()
+ .setScopesToApply(DEFAULT_SERVICE_SCOPES)
+ .setUseJwtAccessWithScope(true)
+ .build();
+ }
}
}
diff --git a/gax-java/pom.xml b/gax-java/pom.xml
index a7e173cfde..2c8dcc34da 100644
--- a/gax-java/pom.xml
+++ b/gax-java/pom.xml
@@ -4,14 +4,14 @@
com.google.api
gax-parent
pom
- 2.54.1
+ 2.55.0
GAX (Google Api eXtensions) for Java (Parent)
Google Api eXtensions for Java (Parent)
com.google.api
gapic-generator-java-pom-parent
- 2.46.1
+ 2.47.0
../gapic-generator-java-pom-parent
@@ -50,7 +50,7 @@
com.google.api
api-common
- 2.37.1
+ 2.38.0
com.google.auth
@@ -98,24 +98,24 @@
com.google.api
gax
- 2.54.1
+ 2.55.0
com.google.api
gax
- 2.54.1
+ 2.55.0
test-jar
testlib
com.google.api.grpc
proto-google-common-protos
- 2.45.1
+ 2.46.0
com.google.api.grpc
grpc-google-common-protos
- 2.45.1
+ 2.46.0
io.grpc
diff --git a/generation_config.yaml b/generation_config.yaml
index 089160fb1c..55bd2c6314 100644
--- a/generation_config.yaml
+++ b/generation_config.yaml
@@ -1,4 +1,4 @@
-googleapis_commitish: 5c181aaf78bd1ae2e08c3a2971cd9e87b6e00986
+googleapis_commitish: b6a27d13a2f0223051ef720e4e9d0d52323560e6
# the libraries are ordered with respect to library name, which is
# java-{library.library_name} or java-{library.api-shortname} when
# library.library_name is not defined.
diff --git a/java-common-protos/grpc-google-common-protos/pom.xml b/java-common-protos/grpc-google-common-protos/pom.xml
index 516d6b2e5e..f14a7791cc 100644
--- a/java-common-protos/grpc-google-common-protos/pom.xml
+++ b/java-common-protos/grpc-google-common-protos/pom.xml
@@ -4,13 +4,13 @@
4.0.0
com.google.api.grpc
grpc-google-common-protos
- 2.45.1
+ 2.46.0
grpc-google-common-protos
GRPC library for grpc-google-common-protos
com.google.api.grpc
google-common-protos-parent
- 2.45.1
+ 2.46.0
diff --git a/java-common-protos/pom.xml b/java-common-protos/pom.xml
index aba56f536e..e6a27843a8 100644
--- a/java-common-protos/pom.xml
+++ b/java-common-protos/pom.xml
@@ -4,7 +4,7 @@
com.google.api.grpc
google-common-protos-parent
pom
- 2.45.1
+ 2.46.0
Google Common Protos Parent
Java idiomatic client for Google Cloud Platform services.
@@ -13,7 +13,7 @@
com.google.api
gapic-generator-java-pom-parent
- 2.46.1
+ 2.47.0
../gapic-generator-java-pom-parent
@@ -61,7 +61,7 @@
com.google.cloud
third-party-dependencies
- 3.36.1
+ 3.37.0
pom
import
@@ -75,7 +75,7 @@
com.google.api.grpc
grpc-google-common-protos
- 2.45.1
+ 2.46.0
io.grpc
@@ -87,7 +87,7 @@
com.google.api.grpc
proto-google-common-protos
- 2.45.1
+ 2.46.0
com.google.guava
diff --git a/java-common-protos/proto-google-common-protos/pom.xml b/java-common-protos/proto-google-common-protos/pom.xml
index e7cc2eaa48..d6a8babcae 100644
--- a/java-common-protos/proto-google-common-protos/pom.xml
+++ b/java-common-protos/proto-google-common-protos/pom.xml
@@ -3,13 +3,13 @@
4.0.0
com.google.api.grpc
proto-google-common-protos
- 2.45.1
+ 2.46.0
proto-google-common-protos
PROTO library for proto-google-common-protos
com.google.api.grpc
google-common-protos-parent
- 2.45.1
+ 2.46.0
diff --git a/java-core/google-cloud-core-bom/pom.xml b/java-core/google-cloud-core-bom/pom.xml
index 58fc917f55..f913ca9a4e 100644
--- a/java-core/google-cloud-core-bom/pom.xml
+++ b/java-core/google-cloud-core-bom/pom.xml
@@ -3,13 +3,13 @@
4.0.0
com.google.cloud
google-cloud-core-bom
- 2.44.1
+ 2.45.0
pom
com.google.api
gapic-generator-java-pom-parent
- 2.46.1
+ 2.47.0
../../gapic-generator-java-pom-parent
@@ -23,17 +23,17 @@
com.google.cloud
google-cloud-core
- 2.44.1
+ 2.45.0
com.google.cloud
google-cloud-core-grpc
- 2.44.1
+ 2.45.0
com.google.cloud
google-cloud-core-http
- 2.44.1
+ 2.45.0
diff --git a/java-core/google-cloud-core-grpc/pom.xml b/java-core/google-cloud-core-grpc/pom.xml
index d55e952667..bb6f207460 100644
--- a/java-core/google-cloud-core-grpc/pom.xml
+++ b/java-core/google-cloud-core-grpc/pom.xml
@@ -3,7 +3,7 @@
4.0.0
com.google.cloud
google-cloud-core-grpc
- 2.44.1
+ 2.45.0
jar
Google Cloud Core gRPC
@@ -12,7 +12,7 @@
com.google.cloud
google-cloud-core-parent
- 2.44.1
+ 2.45.0
google-cloud-core-grpc
diff --git a/java-core/google-cloud-core-http/pom.xml b/java-core/google-cloud-core-http/pom.xml
index 1adffec65c..40e4804403 100644
--- a/java-core/google-cloud-core-http/pom.xml
+++ b/java-core/google-cloud-core-http/pom.xml
@@ -3,7 +3,7 @@
4.0.0
com.google.cloud
google-cloud-core-http
- 2.44.1
+ 2.45.0
jar
Google Cloud Core HTTP
@@ -12,7 +12,7 @@
com.google.cloud
google-cloud-core-parent
- 2.44.1
+ 2.45.0
google-cloud-core-http
diff --git a/java-core/google-cloud-core/pom.xml b/java-core/google-cloud-core/pom.xml
index 5e0bc1d913..b15e18e90c 100644
--- a/java-core/google-cloud-core/pom.xml
+++ b/java-core/google-cloud-core/pom.xml
@@ -3,7 +3,7 @@
4.0.0
com.google.cloud
google-cloud-core
- 2.44.1
+ 2.45.0
jar
Google Cloud Core
@@ -12,7 +12,7 @@
com.google.cloud
google-cloud-core-parent
- 2.44.1
+ 2.45.0
google-cloud-core
diff --git a/java-core/pom.xml b/java-core/pom.xml
index a3e7d4ff01..c45011ee29 100644
--- a/java-core/pom.xml
+++ b/java-core/pom.xml
@@ -4,7 +4,7 @@
com.google.cloud
google-cloud-core-parent
pom
- 2.44.1
+ 2.45.0
Google Cloud Core Parent
Java idiomatic client for Google Cloud Platform services.
@@ -13,7 +13,7 @@
com.google.api
gapic-generator-java-pom-parent
- 2.46.1
+ 2.47.0
../gapic-generator-java-pom-parent
@@ -33,7 +33,7 @@
com.google.cloud
google-cloud-shared-dependencies
- 3.36.1
+ 3.37.0
pom
import
diff --git a/java-iam/grpc-google-iam-v1/pom.xml b/java-iam/grpc-google-iam-v1/pom.xml
index 8dae78fe1b..8d15ee1a5b 100644
--- a/java-iam/grpc-google-iam-v1/pom.xml
+++ b/java-iam/grpc-google-iam-v1/pom.xml
@@ -4,13 +4,13 @@
4.0.0
com.google.api.grpc
grpc-google-iam-v1
- 1.40.1
+ 1.41.0
grpc-google-iam-v1
GRPC library for grpc-google-iam-v1
com.google.cloud
google-iam-parent
- 1.40.1
+ 1.41.0
diff --git a/java-iam/grpc-google-iam-v2/pom.xml b/java-iam/grpc-google-iam-v2/pom.xml
index 67af13d6bb..16f4f38b3e 100644
--- a/java-iam/grpc-google-iam-v2/pom.xml
+++ b/java-iam/grpc-google-iam-v2/pom.xml
@@ -4,13 +4,13 @@
4.0.0
com.google.api.grpc
grpc-google-iam-v2
- 1.40.1
+ 1.41.0
grpc-google-iam-v2
GRPC library for proto-google-iam-v2
com.google.cloud
google-iam-parent
- 1.40.1
+ 1.41.0
diff --git a/java-iam/grpc-google-iam-v2beta/pom.xml b/java-iam/grpc-google-iam-v2beta/pom.xml
index d22aa91876..a69d2b2f9f 100644
--- a/java-iam/grpc-google-iam-v2beta/pom.xml
+++ b/java-iam/grpc-google-iam-v2beta/pom.xml
@@ -4,13 +4,13 @@
4.0.0
com.google.api.grpc
grpc-google-iam-v2beta
- 1.40.1
+ 1.41.0
grpc-google-iam-v2beta
GRPC library for proto-google-iam-v1
com.google.cloud
google-iam-parent
- 1.40.1
+ 1.41.0
diff --git a/java-iam/pom.xml b/java-iam/pom.xml
index bae0163891..6c7301fa02 100644
--- a/java-iam/pom.xml
+++ b/java-iam/pom.xml
@@ -4,7 +4,7 @@
com.google.cloud
google-iam-parent
pom
- 1.40.1
+ 1.41.0
Google IAM Parent
Java idiomatic client for Google Cloud Platform services.
@@ -13,7 +13,7 @@
com.google.api
gapic-generator-java-pom-parent
- 2.46.1
+ 2.47.0
../gapic-generator-java-pom-parent
@@ -60,7 +60,7 @@
com.google.cloud
third-party-dependencies
- 3.36.1
+ 3.37.0
pom
import
@@ -88,44 +88,44 @@
com.google.api
gax-bom
- 2.54.1
+ 2.55.0
pom
import
com.google.api.grpc
proto-google-iam-v2
- 1.40.1
+ 1.41.0
com.google.api.grpc
grpc-google-iam-v2
- 1.40.1
+ 1.41.0
com.google.api.grpc
proto-google-common-protos
- 2.45.1
+ 2.46.0
com.google.api.grpc
proto-google-iam-v2beta
- 1.40.1
+ 1.41.0
com.google.api.grpc
grpc-google-iam-v1
- 1.40.1
+ 1.41.0
com.google.api.grpc
grpc-google-iam-v2beta
- 1.40.1
+ 1.41.0
com.google.api.grpc
proto-google-iam-v1
- 1.40.1
+ 1.41.0
javax.annotation
diff --git a/java-iam/proto-google-iam-v1/pom.xml b/java-iam/proto-google-iam-v1/pom.xml
index 5abf9490b6..82c3236340 100644
--- a/java-iam/proto-google-iam-v1/pom.xml
+++ b/java-iam/proto-google-iam-v1/pom.xml
@@ -3,13 +3,13 @@
4.0.0
com.google.api.grpc
proto-google-iam-v1
- 1.40.1
+ 1.41.0
proto-google-iam-v1
PROTO library for proto-google-iam-v1
com.google.cloud
google-iam-parent
- 1.40.1
+ 1.41.0
diff --git a/java-iam/proto-google-iam-v2/pom.xml b/java-iam/proto-google-iam-v2/pom.xml
index 909f7fbfec..89b21be4f2 100644
--- a/java-iam/proto-google-iam-v2/pom.xml
+++ b/java-iam/proto-google-iam-v2/pom.xml
@@ -4,13 +4,13 @@
4.0.0
com.google.api.grpc
proto-google-iam-v2
- 1.40.1
+ 1.41.0
proto-google-iam-v2
Proto library for proto-google-iam-v1
com.google.cloud
google-iam-parent
- 1.40.1
+ 1.41.0
diff --git a/java-iam/proto-google-iam-v2beta/pom.xml b/java-iam/proto-google-iam-v2beta/pom.xml
index f189969584..826887b14e 100644
--- a/java-iam/proto-google-iam-v2beta/pom.xml
+++ b/java-iam/proto-google-iam-v2beta/pom.xml
@@ -4,13 +4,13 @@
4.0.0
com.google.api.grpc
proto-google-iam-v2beta
- 1.40.1
+ 1.41.0
proto-google-iam-v2beta
Proto library for proto-google-iam-v1
com.google.cloud
google-iam-parent
- 1.40.1
+ 1.41.0
diff --git a/java-shared-dependencies/README.md b/java-shared-dependencies/README.md
index 501f11178d..64dff9f91c 100644
--- a/java-shared-dependencies/README.md
+++ b/java-shared-dependencies/README.md
@@ -14,7 +14,7 @@ If you are using Maven, add this to the `dependencyManagement` section.
com.google.cloud
google-cloud-shared-dependencies
- 3.36.1
+ 3.37.0
pom
import
diff --git a/java-shared-dependencies/dependency-analyzer/pom.xml b/java-shared-dependencies/dependency-analyzer/pom.xml
index 3254fe7eef..fb2aa307ac 100644
--- a/java-shared-dependencies/dependency-analyzer/pom.xml
+++ b/java-shared-dependencies/dependency-analyzer/pom.xml
@@ -62,13 +62,13 @@
com.google.guava
guava
- 33.3.0-jre
+ 33.3.1-jre
org.mockito
mockito-core
- 5.13.0
+ 5.14.1
test
diff --git a/java-shared-dependencies/dependency-convergence-check/pom.xml b/java-shared-dependencies/dependency-convergence-check/pom.xml
index 069905305c..ce285dcea5 100644
--- a/java-shared-dependencies/dependency-convergence-check/pom.xml
+++ b/java-shared-dependencies/dependency-convergence-check/pom.xml
@@ -3,7 +3,7 @@
4.0.0
com.google.cloud
shared-dependencies-dependency-convergence-test
- 3.36.1
+ 3.37.0
Dependency convergence test for certain artifacts in Google Cloud Shared Dependencies
An dependency convergence test case for the shared dependencies BOM. A failure of this test case means
diff --git a/java-shared-dependencies/first-party-dependencies/pom.xml b/java-shared-dependencies/first-party-dependencies/pom.xml
index 4083da5cfc..18f2c1679d 100644
--- a/java-shared-dependencies/first-party-dependencies/pom.xml
+++ b/java-shared-dependencies/first-party-dependencies/pom.xml
@@ -6,7 +6,7 @@
com.google.cloud
first-party-dependencies
pom
- 3.36.1
+ 3.37.0
Google Cloud First-party Shared Dependencies
Shared first-party dependencies for Google Cloud Java libraries.
@@ -15,7 +15,7 @@
com.google.cloud
google-cloud-shared-config
- 1.11.2
+ 1.11.3
@@ -33,7 +33,7 @@
com.google.api
gapic-generator-java-bom
- 2.46.1
+ 2.47.0
pom
import
@@ -45,7 +45,7 @@
com.google.cloud
google-cloud-core-bom
- 2.44.1
+ 2.45.0
pom
import
@@ -69,13 +69,13 @@
com.google.cloud
google-cloud-core
- 2.44.1
+ 2.45.0
test-jar
com.google.cloud
google-cloud-core
- 2.44.1
+ 2.45.0
tests
diff --git a/java-shared-dependencies/pom.xml b/java-shared-dependencies/pom.xml
index 79a1bd15e0..a17c36b278 100644
--- a/java-shared-dependencies/pom.xml
+++ b/java-shared-dependencies/pom.xml
@@ -4,7 +4,7 @@
com.google.cloud
google-cloud-shared-dependencies
pom
- 3.36.1
+ 3.37.0
first-party-dependencies
third-party-dependencies
@@ -17,7 +17,7 @@
com.google.api
gapic-generator-java-pom-parent
- 2.46.1
+ 2.47.0
../gapic-generator-java-pom-parent
@@ -31,14 +31,14 @@
com.google.cloud
first-party-dependencies
- 3.36.1
+ 3.37.0
pom
import
com.google.cloud
third-party-dependencies
- 3.36.1
+ 3.37.0
pom
import
diff --git a/java-shared-dependencies/third-party-dependencies/pom.xml b/java-shared-dependencies/third-party-dependencies/pom.xml
index 2ffb57ad8c..49473690c6 100644
--- a/java-shared-dependencies/third-party-dependencies/pom.xml
+++ b/java-shared-dependencies/third-party-dependencies/pom.xml
@@ -6,7 +6,7 @@
com.google.cloud
third-party-dependencies
pom
- 3.36.1
+ 3.37.0
Google Cloud Third-party Shared Dependencies
Shared third-party dependencies for Google Cloud Java libraries.
@@ -15,7 +15,7 @@
com.google.api
gapic-generator-java-pom-parent
- 2.46.1
+ 2.47.0
../../gapic-generator-java-pom-parent
@@ -27,8 +27,8 @@
1.24
0.31.1
3.0.2
- 2.17.2
- 2.32.0
+ 2.18.0
+ 2.33.0
1.17.1
4.4.16
4.5.14
diff --git a/java-shared-dependencies/upper-bound-check/pom.xml b/java-shared-dependencies/upper-bound-check/pom.xml
index 2cddd53e6a..4978d1ea48 100644
--- a/java-shared-dependencies/upper-bound-check/pom.xml
+++ b/java-shared-dependencies/upper-bound-check/pom.xml
@@ -4,7 +4,7 @@
com.google.cloud
shared-dependencies-upper-bound-test
pom
- 3.36.1
+ 3.37.0
Upper bound test for Google Cloud Shared Dependencies
An upper bound test case for the shared dependencies BOM. A failure of this test case means
@@ -16,7 +16,7 @@
com.google.cloud
google-cloud-shared-config
- 1.11.2
+ 1.11.3
@@ -30,7 +30,7 @@
com.google.cloud
google-cloud-shared-dependencies
- 3.36.1
+ 3.37.0
pom
import
diff --git a/library_generation/owlbot/templates/java_library/renovate.json b/library_generation/owlbot/templates/java_library/renovate.json
index 57929084fd..cb92a78173 100644
--- a/library_generation/owlbot/templates/java_library/renovate.json
+++ b/library_generation/owlbot/templates/java_library/renovate.json
@@ -44,6 +44,16 @@
],
"depNameTemplate": "com.google.cloud:sdk-platform-java-config",
"datasourceTemplate": "maven"
+ },
+ {
+ "fileMatch": [
+ "^.github/workflows/hermetic_library_generation.yaml$"
+ ],
+ "matchStrings": [
+ "uses: googleapis/sdk-platform-java/.github/scripts@v(?.+?)\\n"
+ ],
+ "depNameTemplate": "com.google.api:gapic-generator-java",
+ "datasourceTemplate": "maven"
}
],
"packageRules": [
@@ -104,6 +114,13 @@
"^com.fasterxml.jackson.core"
],
"groupName": "jackson dependencies"
+ },
+ {
+ "matchPackagePatterns": [
+ "^com.google.api:gapic-generator-java",
+ "^com.google.cloud:sdk-platform-java-config"
+ ],
+ "groupName": "SDK platform Java dependencies"
}
],
"semanticCommits": true,
diff --git a/library_generation/requirements.in b/library_generation/requirements.in
index 0d95852e61..e5e6487246 100644
--- a/library_generation/requirements.in
+++ b/library_generation/requirements.in
@@ -3,21 +3,21 @@
absl-py==2.1.0
attr==0.3.2
attrs==23.2.0
-black==24.4.2
+black==24.8.0
click==8.1.7
gitdb==4.0.11
GitPython==3.1.43
-lxml==5.2.2
+lxml==5.3.0
MarkupSafe==2.1.5
mypy-extensions==1.0.0
packaging==23.2
pathspec==0.12.1
-PyYAML==6.0.1
+PyYAML==6.0.2
smmap==5.0.1
typing==3.7.4.3
parameterized==0.9.0 # used in parameterized test
colorlog==6.8.2
-watchdog==4.0.1
+watchdog==4.0.2
nox==2024.4.15
requests==2.32.3
setuptools==65.5.1
diff --git a/library_generation/requirements.txt b/library_generation/requirements.txt
index fd987f45db..5407b68e05 100644
--- a/library_generation/requirements.txt
+++ b/library_generation/requirements.txt
@@ -415,7 +415,7 @@ platformdirs==4.3.6 \
# via
# black
# virtualenv
-PyYAML==6.0.2 \
+pyyaml==6.0.2 \
--hash=sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff \
--hash=sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48 \
--hash=sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086 \
@@ -498,9 +498,9 @@ urllib3==2.2.3 \
--hash=sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac \
--hash=sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9
# via requests
-virtualenv==20.26.5 \
- --hash=sha256:4f3ac17b81fba3ce3bd6f4ead2749a72da5929c01774948e243db9ba41df4ff6 \
- --hash=sha256:ce489cac131aa58f4b25e321d6d186171f78e6cb13fafbf32a840cee67733ff4
+virtualenv==20.26.6 \
+ --hash=sha256:280aede09a2a5c317e409a00102e7077c6432c5a38f0ef938e643805a7ad2c48 \
+ --hash=sha256:7345cc5b25405607a624d8418154577459c3e0277f5466dd79c49d5e492995f2
# via nox
watchdog==4.0.2 \
--hash=sha256:0b4359067d30d5b864e09c8597b112fe0a0a59321a0f331498b013fb097406b4 \
diff --git a/sdk-platform-java-config/pom.xml b/sdk-platform-java-config/pom.xml
index e285868239..14ec0603ba 100644
--- a/sdk-platform-java-config/pom.xml
+++ b/sdk-platform-java-config/pom.xml
@@ -4,7 +4,7 @@
com.google.cloud
sdk-platform-java-config
pom
- 3.36.1
+ 3.37.0
SDK Platform For Java Configurations
Shared build configuration for Google Cloud Java libraries.
@@ -13,10 +13,10 @@
com.google.cloud
google-cloud-shared-config
- 1.11.2
+ 1.11.3
- 3.36.1
+ 3.37.0
\ No newline at end of file
diff --git a/showcase/gapic-showcase/src/test/java/com/google/showcase/v1beta1/it/ITApiKeyCredentials.java b/showcase/gapic-showcase/src/test/java/com/google/showcase/v1beta1/it/ITApiKeyCredentials.java
new file mode 100644
index 0000000000..5867bcfea9
--- /dev/null
+++ b/showcase/gapic-showcase/src/test/java/com/google/showcase/v1beta1/it/ITApiKeyCredentials.java
@@ -0,0 +1,219 @@
+/*
+ * Copyright 2024 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.showcase.v1beta1.it;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.api.client.http.javanet.NetHttpTransport;
+import com.google.api.gax.rpc.FixedHeaderProvider;
+import com.google.api.gax.rpc.TransportChannelProvider;
+import com.google.auth.http.AuthHttpConstants;
+import com.google.common.collect.ImmutableList;
+import com.google.showcase.v1beta1.EchoClient;
+import com.google.showcase.v1beta1.EchoRequest;
+import com.google.showcase.v1beta1.EchoSettings;
+import com.google.showcase.v1beta1.it.util.GrpcCapturingClientInterceptor;
+import com.google.showcase.v1beta1.it.util.HttpJsonCapturingClientInterceptor;
+import com.google.showcase.v1beta1.it.util.TestClientInitializer;
+import io.grpc.ManagedChannelBuilder;
+import io.grpc.Metadata;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
+import java.util.stream.StreamSupport;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+/**
+ * Test suite to confirm a client can be instantiated with API key credentials and correct
+ * authorization sent via headers to back end
+ */
+class ITApiKeyCredentials {
+
+ private static final String API_KEY = "fake_api_key";
+ private static final String API_KEY_AUTH_HEADER = "x-goog-api-key";
+ private static final String HTTP_RESPONSE_HEADER_STRING =
+ "x-showcase-request-" + API_KEY_AUTH_HEADER;
+ private static final String GRPC_ENDPOINT = "localhost:7469";
+ private static final String HTTP_ENDPOINT = "http://localhost:7469";
+
+ private static HttpJsonCapturingClientInterceptor httpJsonInterceptor;
+ private static EchoClient grpcClient;
+ private static EchoClient httpJsonClient;
+ private static GrpcCapturingClientInterceptor grpcInterceptor;
+
+ @BeforeEach
+ void setup() throws IOException {
+ grpcInterceptor = new GrpcCapturingClientInterceptor();
+ httpJsonInterceptor = new HttpJsonCapturingClientInterceptor();
+ }
+
+ @AfterEach
+ void tearDown() throws InterruptedException {
+ if (httpJsonClient != null) {
+ httpJsonClient.close();
+ httpJsonClient.awaitTermination(
+ TestClientInitializer.AWAIT_TERMINATION_SECONDS, TimeUnit.SECONDS);
+ }
+ if (grpcClient != null) {
+ grpcClient.close();
+ grpcClient.awaitTermination(
+ TestClientInitializer.AWAIT_TERMINATION_SECONDS, TimeUnit.SECONDS);
+ }
+ }
+
+ @Test
+ void testCreateGrpcClient_withApiKey_sendsApiHeaderToServer() throws IOException {
+ Metadata.Key apiKeyAuthHeader =
+ Metadata.Key.of(API_KEY_AUTH_HEADER, Metadata.ASCII_STRING_MARSHALLER);
+ Metadata.Key defaultAuthorizationHeader =
+ Metadata.Key.of(AuthHttpConstants.AUTHORIZATION, Metadata.ASCII_STRING_MARSHALLER);
+ EchoSettings.Builder echoBuilder =
+ EchoSettings.newBuilder()
+ .setApiKey(API_KEY)
+ .setEndpoint(GRPC_ENDPOINT)
+ .setTransportChannelProvider(
+ EchoSettings.defaultGrpcTransportProviderBuilder()
+ .setChannelConfigurator(ManagedChannelBuilder::usePlaintext)
+ .setInterceptorProvider(() -> ImmutableList.of(grpcInterceptor))
+ .build());
+ EchoSettings settings = echoBuilder.build();
+ grpcClient = EchoClient.create(settings);
+
+ grpcClient.echo(EchoRequest.newBuilder().build());
+
+ assertThat(echoBuilder.getApiKey()).isEqualTo(API_KEY);
+ assertThat(settings.getApiKey()).isEqualTo(API_KEY);
+ String headerValue = grpcInterceptor.metadata.get(apiKeyAuthHeader);
+ assertThat(headerValue).isEqualTo(API_KEY);
+ String defaultAuthorizationHeaderValue =
+ grpcInterceptor.metadata.get(defaultAuthorizationHeader);
+ assertThat(defaultAuthorizationHeaderValue).isNull();
+ }
+
+ @Test
+ void testCreateGrpcClient_withApiKeySetViaSetterAndHeader_dedupsHeader() throws IOException {
+ String apiHeaderKey = "fake_api_key_2";
+ Metadata.Key apiKeyAuthHeader =
+ Metadata.Key.of(API_KEY_AUTH_HEADER, Metadata.ASCII_STRING_MARSHALLER);
+ Metadata.Key defaultAuthorizationHeader =
+ Metadata.Key.of(AuthHttpConstants.AUTHORIZATION, Metadata.ASCII_STRING_MARSHALLER);
+ Map header =
+ new HashMap() {
+ {
+ put(API_KEY_AUTH_HEADER, apiHeaderKey);
+ }
+ };
+ FixedHeaderProvider headerProvider = FixedHeaderProvider.create(header);
+
+ TransportChannelProvider transportChannelProvider =
+ EchoSettings.defaultGrpcTransportProviderBuilder()
+ .setHeaderProvider(headerProvider)
+ .setChannelConfigurator(ManagedChannelBuilder::usePlaintext)
+ .setInterceptorProvider(() -> ImmutableList.of(grpcInterceptor))
+ .build();
+ EchoSettings settings =
+ EchoSettings.newBuilder()
+ .setApiKey(API_KEY)
+ .setEndpoint(GRPC_ENDPOINT)
+ .setTransportChannelProvider(transportChannelProvider)
+ .build();
+ grpcClient = EchoClient.create(settings);
+
+ grpcClient.echo(EchoRequest.newBuilder().build());
+
+ Iterable matchingHeaders = grpcInterceptor.metadata.getAll(apiKeyAuthHeader);
+ List matchingHeadersList =
+ StreamSupport.stream(matchingHeaders.spliterator(), false).collect(Collectors.toList());
+
+ String headerValue = matchingHeadersList.get(0);
+ assertThat(headerValue).isEqualTo(API_KEY);
+ assertThat(matchingHeadersList.size()).isEqualTo(1);
+ }
+
+ @Test
+ void testCreateHttpClient_withApiKey_sendsApiHeaderToServer() throws Exception {
+ EchoSettings httpJsonEchoSettings =
+ EchoSettings.newHttpJsonBuilder()
+ .setApiKey(API_KEY)
+ .setTransportChannelProvider(
+ EchoSettings.defaultHttpJsonTransportProviderBuilder()
+ .setHttpTransport(
+ new NetHttpTransport.Builder().doNotValidateCertificate().build())
+ .setEndpoint(HTTP_ENDPOINT)
+ .setInterceptorProvider(() -> ImmutableList.of(httpJsonInterceptor))
+ .build())
+ .build();
+ httpJsonClient = EchoClient.create(httpJsonEchoSettings);
+
+ httpJsonClient.echo(EchoRequest.newBuilder().build());
+
+ ArrayList headerValues =
+ (ArrayList)
+ httpJsonInterceptor.metadata.getHeaders().get(HTTP_RESPONSE_HEADER_STRING);
+ String headerValue = headerValues.get(0);
+ assertThat(headerValue).isEqualTo(API_KEY);
+ }
+
+ @Test
+ void testCreateHttpClient_withApiKeySetViaSetterAndHeader_dedupsHeader() throws Exception {
+ String apiHeaderKey = "fake_api_key_2";
+ Metadata.Key apiKeyAuthHeader =
+ Metadata.Key.of(API_KEY_AUTH_HEADER, Metadata.ASCII_STRING_MARSHALLER);
+ Metadata.Key defaultAuthorizationHeader =
+ Metadata.Key.of(AuthHttpConstants.AUTHORIZATION, Metadata.ASCII_STRING_MARSHALLER);
+ Map header =
+ new HashMap() {
+ {
+ put(API_KEY_AUTH_HEADER, apiHeaderKey);
+ }
+ };
+ FixedHeaderProvider headerProvider = FixedHeaderProvider.create(header);
+
+ TransportChannelProvider transportChannelProvider =
+ EchoSettings.defaultHttpJsonTransportProviderBuilder()
+ .setHeaderProvider(headerProvider)
+ .setInterceptorProvider(() -> ImmutableList.of(httpJsonInterceptor))
+ .build();
+ EchoSettings httpJsonEchoSettings =
+ EchoSettings.newHttpJsonBuilder()
+ .setApiKey(API_KEY)
+ .setTransportChannelProvider(
+ EchoSettings.defaultHttpJsonTransportProviderBuilder()
+ .setHttpTransport(
+ new NetHttpTransport.Builder().doNotValidateCertificate().build())
+ .setEndpoint(HTTP_ENDPOINT)
+ .setInterceptorProvider(() -> ImmutableList.of(httpJsonInterceptor))
+ .build())
+ .build();
+ httpJsonClient = EchoClient.create(httpJsonEchoSettings);
+
+ httpJsonClient.echo(EchoRequest.newBuilder().build());
+
+ ArrayList headerValues =
+ (ArrayList)
+ httpJsonInterceptor.metadata.getHeaders().get(HTTP_RESPONSE_HEADER_STRING);
+ String headerValue = headerValues.get(0);
+ assertThat(headerValue).isEqualTo(API_KEY);
+ assertThat(headerValues.size()).isEqualTo(1);
+ }
+}
diff --git a/showcase/gapic-showcase/src/test/java/com/google/showcase/v1beta1/it/ITApiVersionHeaders.java b/showcase/gapic-showcase/src/test/java/com/google/showcase/v1beta1/it/ITApiVersionHeaders.java
index 5f892c5886..cb823db498 100644
--- a/showcase/gapic-showcase/src/test/java/com/google/showcase/v1beta1/it/ITApiVersionHeaders.java
+++ b/showcase/gapic-showcase/src/test/java/com/google/showcase/v1beta1/it/ITApiVersionHeaders.java
@@ -24,6 +24,8 @@
import com.google.api.gax.rpc.StubSettings;
import com.google.common.collect.ImmutableList;
import com.google.showcase.v1beta1.*;
+import com.google.showcase.v1beta1.it.util.GrpcCapturingClientInterceptor;
+import com.google.showcase.v1beta1.it.util.HttpJsonCapturingClientInterceptor;
import com.google.showcase.v1beta1.it.util.TestClientInitializer;
import com.google.showcase.v1beta1.stub.ComplianceStubSettings;
import com.google.showcase.v1beta1.stub.EchoStubSettings;
@@ -52,102 +54,6 @@ class ITApiVersionHeaders {
"Header provider can't override the header: "
+ ApiClientHeaderProvider.API_VERSION_HEADER_KEY;
- // Implement a client interceptor to retrieve the trailing metadata from response.
- private static class GrpcCapturingClientInterceptor implements ClientInterceptor {
- private Metadata metadata;
-
- @Override
- public ClientCall interceptCall(
- MethodDescriptor method, final CallOptions callOptions, Channel next) {
- ClientCall call = next.newCall(method, callOptions);
- return new ForwardingClientCall.SimpleForwardingClientCall(call) {
- @Override
- public void start(Listener responseListener, Metadata headers) {
- Listener wrappedListener =
- new SimpleForwardingClientCallListener(responseListener) {
- @Override
- public void onClose(Status status, Metadata trailers) {
- if (status.isOk()) {
- metadata = trailers;
- }
- super.onClose(status, trailers);
- }
- };
-
- super.start(wrappedListener, headers);
- }
- };
- }
- }
-
- private static class SimpleForwardingClientCallListener
- extends ClientCall.Listener {
- private final ClientCall.Listener delegate;
-
- SimpleForwardingClientCallListener(ClientCall.Listener delegate) {
- this.delegate = delegate;
- }
-
- @Override
- public void onHeaders(Metadata headers) {
- delegate.onHeaders(headers);
- }
-
- @Override
- public void onMessage(RespT message) {
- delegate.onMessage(message);
- }
-
- @Override
- public void onClose(Status status, Metadata trailers) {
- delegate.onClose(status, trailers);
- }
-
- @Override
- public void onReady() {
- delegate.onReady();
- }
- }
- // Implement a client interceptor to retrieve the response headers
- private static class HttpJsonCapturingClientInterceptor implements HttpJsonClientInterceptor {
- private HttpJsonMetadata metadata;
-
- @Override
- public HttpJsonClientCall interceptCall(
- ApiMethodDescriptor method,
- HttpJsonCallOptions callOptions,
- HttpJsonChannel next) {
- HttpJsonClientCall call = next.newCall(method, callOptions);
- return new ForwardingHttpJsonClientCall.SimpleForwardingHttpJsonClientCall<
- RequestT, ResponseT>(call) {
- @Override
- public void start(Listener responseListener, HttpJsonMetadata requestHeaders) {
- Listener forwardingResponseListener =
- new ForwardingHttpJsonClientCallListener.SimpleForwardingHttpJsonClientCallListener<
- ResponseT>(responseListener) {
- @Override
- public void onHeaders(HttpJsonMetadata responseHeaders) {
- metadata = responseHeaders;
- super.onHeaders(responseHeaders);
- }
-
- @Override
- public void onMessage(ResponseT message) {
- super.onMessage(message);
- }
-
- @Override
- public void onClose(int statusCode, HttpJsonMetadata trailers) {
- super.onClose(statusCode, trailers);
- }
- };
-
- super.start(forwardingResponseListener, requestHeaders);
- }
- };
- }
- }
-
private static HttpJsonCapturingClientInterceptor httpJsonInterceptor;
private static GrpcCapturingClientInterceptor grpcInterceptor;
private static HttpJsonCapturingClientInterceptor httpJsonComplianceInterceptor;
diff --git a/showcase/gapic-showcase/src/test/java/com/google/showcase/v1beta1/it/ITEndpointContext.java b/showcase/gapic-showcase/src/test/java/com/google/showcase/v1beta1/it/ITEndpointContext.java
index abf3844a6f..55fdd350b8 100644
--- a/showcase/gapic-showcase/src/test/java/com/google/showcase/v1beta1/it/ITEndpointContext.java
+++ b/showcase/gapic-showcase/src/test/java/com/google/showcase/v1beta1/it/ITEndpointContext.java
@@ -444,4 +444,23 @@ void endpointResolution_builderBuilderBackToBuilder() throws IOException {
echoStubSettingsBuilder = echoStubSettings.toBuilder();
Truth.assertThat(echoStubSettingsBuilder.getEndpoint()).isEqualTo(customEndpoint);
}
+
+ @Test
+ void universeDomainValidation_quotaProjectId_credentialsNonGDUMatchesUserConfiguration()
+ throws IOException {
+ String universeDomain = "random.com";
+ EchoSettings echoSettings =
+ ExtendedEchoSettings.newBuilder()
+ .setQuotaProjectId("exampleProject")
+ .setCredentialsProvider(UniverseDomainCredentialsProvider.create(universeDomain))
+ .setEndpoint(TestClientInitializer.DEFAULT_GRPC_ENDPOINT)
+ .setUniverseDomain(universeDomain)
+ .setTransportChannelProvider(
+ EchoSettings.defaultGrpcTransportProviderBuilder()
+ .setChannelConfigurator(ManagedChannelBuilder::usePlaintext)
+ .build())
+ .build();
+ echoClient = EchoClient.create(echoSettings);
+ Truth.assertThat(echoClient.echo(DEFAULT_REQUEST).getContent()).isEqualTo("echo");
+ }
}
diff --git a/showcase/gapic-showcase/src/test/java/com/google/showcase/v1beta1/it/util/GrpcCapturingClientInterceptor.java b/showcase/gapic-showcase/src/test/java/com/google/showcase/v1beta1/it/util/GrpcCapturingClientInterceptor.java
new file mode 100644
index 0000000000..156ee16e47
--- /dev/null
+++ b/showcase/gapic-showcase/src/test/java/com/google/showcase/v1beta1/it/util/GrpcCapturingClientInterceptor.java
@@ -0,0 +1,102 @@
+/*
+ * Copyright 2024 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.showcase.v1beta1.it.util;
+
+import static com.google.common.truth.Truth.assertThat;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+import com.google.api.gax.rpc.ApiClientHeaderProvider;
+import com.google.api.gax.rpc.FixedHeaderProvider;
+import com.google.api.gax.rpc.StubSettings;
+import com.google.common.collect.ImmutableList;
+import com.google.showcase.v1beta1.it.util.TestClientInitializer;
+import com.google.showcase.v1beta1.stub.ComplianceStubSettings;
+import com.google.showcase.v1beta1.stub.EchoStubSettings;
+import io.grpc.CallOptions;
+import io.grpc.ClientInterceptor;
+import io.grpc.Channel;
+import io.grpc.ClientCall;
+
+import io.grpc.Metadata;
+import io.grpc.MethodDescriptor;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.concurrent.TimeUnit;
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+import com.google.api.gax.httpjson.ApiMethodDescriptor;
+import com.google.api.gax.httpjson.HttpJsonMetadata;
+import io.grpc.ForwardingClientCall;
+import io.grpc.Status;
+
+/** Implements a client interceptor to retrieve the metadata from a GRPC client request. */
+public class GrpcCapturingClientInterceptor implements ClientInterceptor {
+ public Metadata metadata;
+
+ @Override
+ public ClientCall interceptCall(
+ MethodDescriptor method, final CallOptions callOptions, Channel next) {
+ ClientCall call = next.newCall(method, callOptions);
+ return new ForwardingClientCall.SimpleForwardingClientCall(call) {
+ @Override
+ public void start(Listener responseListener, Metadata headers) {
+ Listener wrappedListener =
+ new SimpleForwardingClientCallListener(responseListener) {
+ @Override
+ public void onClose(Status status, Metadata trailers) {
+ if (status.isOk()) {
+ metadata = trailers;
+ }
+ super.onClose(status, trailers);
+ }
+ };
+
+ super.start(wrappedListener, headers);
+ }
+ };
+ }
+
+ private static class SimpleForwardingClientCallListener
+ extends ClientCall.Listener {
+ private final ClientCall.Listener delegate;
+
+ SimpleForwardingClientCallListener(ClientCall.Listener delegate) {
+ this.delegate = delegate;
+ }
+
+ @Override
+ public void onHeaders(Metadata headers) {
+ delegate.onHeaders(headers);
+ }
+
+ @Override
+ public void onMessage(RespT message) {
+ delegate.onMessage(message);
+ }
+
+ @Override
+ public void onClose(Status status, Metadata trailers) {
+ delegate.onClose(status, trailers);
+ }
+
+ @Override
+ public void onReady() {
+ delegate.onReady();
+ }
+ }
+}
diff --git a/showcase/gapic-showcase/src/test/java/com/google/showcase/v1beta1/it/util/HttpJsonCapturingClientInterceptor.java b/showcase/gapic-showcase/src/test/java/com/google/showcase/v1beta1/it/util/HttpJsonCapturingClientInterceptor.java
new file mode 100644
index 0000000000..777398cc96
--- /dev/null
+++ b/showcase/gapic-showcase/src/test/java/com/google/showcase/v1beta1/it/util/HttpJsonCapturingClientInterceptor.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright 2024 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.showcase.v1beta1.it.util;
+
+import static com.google.common.truth.Truth.assertThat;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+import com.google.api.gax.rpc.ApiClientHeaderProvider;
+import com.google.api.gax.httpjson.HttpJsonClientInterceptor;
+import com.google.api.gax.rpc.FixedHeaderProvider;
+import com.google.api.gax.rpc.StubSettings;
+import com.google.common.collect.ImmutableList;
+import com.google.showcase.v1beta1.it.util.GrpcCapturingClientInterceptor;
+import com.google.showcase.v1beta1.it.util.HttpJsonCapturingClientInterceptor;
+import com.google.showcase.v1beta1.it.util.TestClientInitializer;
+import com.google.showcase.v1beta1.stub.ComplianceStubSettings;
+import com.google.showcase.v1beta1.stub.EchoStubSettings;
+import com.google.api.gax.httpjson.HttpJsonMetadata;
+import java.io.IOException;
+import com.google.common.collect.ImmutableList;
+import java.util.ArrayList;
+import java.util.concurrent.TimeUnit;
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+import com.google.api.gax.httpjson.HttpJsonCallOptions;
+import com.google.api.gax.httpjson.HttpJsonChannel;
+import com.google.api.gax.httpjson.HttpJsonClientCall;
+import com.google.api.gax.httpjson.ApiMethodDescriptor;
+import com.google.api.gax.httpjson.ForwardingHttpJsonClientCall;
+import com.google.api.gax.httpjson.ForwardingHttpJsonClientCallListener;
+import io.grpc.Status;
+
+/** Implements a client interceptor to retrieve the response headers from a HTTP client request. */
+public class HttpJsonCapturingClientInterceptor implements HttpJsonClientInterceptor {
+ public HttpJsonMetadata metadata;
+
+ @Override
+ public HttpJsonClientCall interceptCall(
+ ApiMethodDescriptor method,
+ HttpJsonCallOptions callOptions,
+ HttpJsonChannel next) {
+ HttpJsonClientCall call = next.newCall(method, callOptions);
+ return new ForwardingHttpJsonClientCall.SimpleForwardingHttpJsonClientCall<
+ RequestT, ResponseT>(call) {
+ @Override
+ public void start(Listener responseListener, HttpJsonMetadata requestHeaders) {
+ Listener forwardingResponseListener =
+ new ForwardingHttpJsonClientCallListener.SimpleForwardingHttpJsonClientCallListener<
+ ResponseT>(responseListener) {
+ @Override
+ public void onHeaders(HttpJsonMetadata responseHeaders) {
+ metadata = responseHeaders;
+ super.onHeaders(responseHeaders);
+ }
+
+ @Override
+ public void onMessage(ResponseT message) {
+ super.onMessage(message);
+ }
+
+ @Override
+ public void onClose(int statusCode, HttpJsonMetadata trailers) {
+ super.onClose(statusCode, trailers);
+ }
+ };
+
+ super.start(forwardingResponseListener, requestHeaders);
+ }
+ };
+ }
+}
\ No newline at end of file
diff --git a/showcase/pom.xml b/showcase/pom.xml
index e16ae160c3..1dc77ab458 100644
--- a/showcase/pom.xml
+++ b/showcase/pom.xml
@@ -15,7 +15,7 @@
com.google.cloud
google-cloud-shared-config
- 1.11.2
+ 1.11.3
@@ -34,7 +34,7 @@
com.google.cloud
google-cloud-shared-dependencies
- 3.36.1
+ 3.37.0
pom
import
@@ -56,7 +56,7 @@
org.junit
junit-bom
- 5.11.1
+ 5.11.2
pom
import
diff --git a/versions.txt b/versions.txt
index 91c87f00aa..493e46ad23 100644
--- a/versions.txt
+++ b/versions.txt
@@ -1,19 +1,19 @@
# Format:
# module:released-version:current-version
-gapic-generator-java:2.46.1:2.46.1
-api-common:2.37.1:2.37.1
-gax:2.54.1:2.54.1
-gax-grpc:2.54.1:2.54.1
-gax-httpjson:0.139.1:0.139.1
-proto-google-common-protos:2.45.1:2.45.1
-grpc-google-common-protos:2.45.1:2.45.1
-proto-google-iam-v1:1.40.1:1.40.1
-grpc-google-iam-v1:1.40.1:1.40.1
-proto-google-iam-v2beta:1.40.1:1.40.1
-grpc-google-iam-v2beta:1.40.1:1.40.1
-google-iam-policy:1.40.1:1.40.1
-proto-google-iam-v2:1.40.1:1.40.1
-grpc-google-iam-v2:1.40.1:1.40.1
-google-cloud-core:2.44.1:2.44.1
-google-cloud-shared-dependencies:3.36.1:3.36.1
+gapic-generator-java:2.47.0:2.47.0
+api-common:2.38.0:2.38.0
+gax:2.55.0:2.55.0
+gax-grpc:2.55.0:2.55.0
+gax-httpjson:0.140.0:0.140.0
+proto-google-common-protos:2.46.0:2.46.0
+grpc-google-common-protos:2.46.0:2.46.0
+proto-google-iam-v1:1.41.0:1.41.0
+grpc-google-iam-v1:1.41.0:1.41.0
+proto-google-iam-v2beta:1.41.0:1.41.0
+grpc-google-iam-v2beta:1.41.0:1.41.0
+google-iam-policy:1.41.0:1.41.0
+proto-google-iam-v2:1.41.0:1.41.0
+grpc-google-iam-v2:1.41.0:1.41.0
+google-cloud-core:2.45.0:2.45.0
+google-cloud-shared-dependencies:3.37.0:3.37.0