diff --git a/src/main/java/com/google/firebase/internal/ErrorHandlingHttpClient.java b/src/main/java/com/google/firebase/internal/ErrorHandlingHttpClient.java index 5efdd0ec2..cccd0cedb 100644 --- a/src/main/java/com/google/firebase/internal/ErrorHandlingHttpClient.java +++ b/src/main/java/com/google/firebase/internal/ErrorHandlingHttpClient.java @@ -89,6 +89,7 @@ public void sendAndParse(HttpRequestInfo requestInfo, Object destination) throws } public IncomingHttpResponse send(HttpRequestInfo requestInfo) throws T { + requestInfo.addHeader("X-Goog-Api-Client", SdkUtils.getMetricsHeader()); HttpRequest request = createHttpRequest(requestInfo); HttpResponse response = null; diff --git a/src/main/java/com/google/firebase/internal/SdkUtils.java b/src/main/java/com/google/firebase/internal/SdkUtils.java index 2fa5e5767..cd9619087 100644 --- a/src/main/java/com/google/firebase/internal/SdkUtils.java +++ b/src/main/java/com/google/firebase/internal/SdkUtils.java @@ -39,6 +39,14 @@ public static String getVersion() { return SDK_VERSION; } + public static String getJavaVersion() { + return System.getProperty("java.version"); + } + + public static String getMetricsHeader() { + return String.format("gl-java/%s fire-admin/%s", getJavaVersion(), getVersion()); + } + private static String loadSdkVersion() { try (InputStream in = SdkUtils.class.getClassLoader() .getResourceAsStream(ADMIN_SDK_PROPERTIES)) { diff --git a/src/test/java/com/google/firebase/auth/FirebaseUserManagerTest.java b/src/test/java/com/google/firebase/auth/FirebaseUserManagerTest.java index 41085d181..c8c733ce4 100644 --- a/src/test/java/com/google/firebase/auth/FirebaseUserManagerTest.java +++ b/src/test/java/com/google/firebase/auth/FirebaseUserManagerTest.java @@ -3026,6 +3026,8 @@ private static void checkRequestHeaders(TestResponseInterceptor interceptor) { String clientVersion = "Java/Admin/" + SdkUtils.getVersion(); assertEquals(clientVersion, headers.getFirstHeaderStringValue("X-Client-Version")); + assertEquals(SdkUtils.getMetricsHeader(), headers.get("X-Goog-Api-Client")); + } private static void checkUrl(TestResponseInterceptor interceptor, String method, String url) { diff --git a/src/test/java/com/google/firebase/auth/internal/CryptoSignersTest.java b/src/test/java/com/google/firebase/auth/internal/CryptoSignersTest.java index 679fe5a3c..17af1eb76 100644 --- a/src/test/java/com/google/firebase/auth/internal/CryptoSignersTest.java +++ b/src/test/java/com/google/firebase/auth/internal/CryptoSignersTest.java @@ -39,6 +39,7 @@ import com.google.firebase.auth.FirebaseAuthException; import com.google.firebase.auth.MockGoogleCredentials; import com.google.firebase.internal.ApiClientUtils; +import com.google.firebase.internal.SdkUtils; import com.google.firebase.testing.MultiRequestMockHttpTransport; import com.google.firebase.testing.ServiceAccount; import com.google.firebase.testing.TestResponseInterceptor; @@ -87,6 +88,8 @@ public void testIAMCryptoSigner() throws Exception { final String url = "https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/" + "test-service-account@iam.gserviceaccount.com:signBlob"; assertEquals(url, interceptor.getResponse().getRequest().getUrl().toString()); + HttpRequest request = interceptor.getResponse().getRequest(); + assertEquals(SdkUtils.getMetricsHeader(), request.getHeaders().get("X-Goog-Api-Client")); } @Test @@ -173,6 +176,7 @@ public void testMetadataService() throws Exception { HttpRequest request = interceptor.getResponse().getRequest(); assertEquals(url, request.getUrl().toString()); assertEquals("Bearer test-token", request.getHeaders().getAuthorization()); + assertEquals(SdkUtils.getMetricsHeader(), request.getHeaders().get("X-Goog-Api-Client")); } @Test @@ -203,6 +207,7 @@ public void testExplicitServiceAccountEmail() throws Exception { HttpRequest request = interceptor.getResponse().getRequest(); assertEquals(url, request.getUrl().toString()); assertEquals("Bearer test-token", request.getHeaders().getAuthorization()); + assertEquals(SdkUtils.getMetricsHeader(), request.getHeaders().get("X-Goog-Api-Client")); } @Test diff --git a/src/test/java/com/google/firebase/auth/multitenancy/FirebaseTenantClientTest.java b/src/test/java/com/google/firebase/auth/multitenancy/FirebaseTenantClientTest.java index eca55ee66..cdb5852d0 100644 --- a/src/test/java/com/google/firebase/auth/multitenancy/FirebaseTenantClientTest.java +++ b/src/test/java/com/google/firebase/auth/multitenancy/FirebaseTenantClientTest.java @@ -353,6 +353,7 @@ private static void checkRequestHeaders(TestResponseInterceptor interceptor) { String clientVersion = "Java/Admin/" + SdkUtils.getVersion(); assertEquals(clientVersion, headers.getFirstHeaderStringValue("X-Client-Version")); + assertEquals(SdkUtils.getMetricsHeader(), headers.get("X-Goog-Api-Client")); } private static void checkUrl(TestResponseInterceptor interceptor, String method, String url) { diff --git a/src/test/java/com/google/firebase/auth/multitenancy/TenantAwareFirebaseAuthTest.java b/src/test/java/com/google/firebase/auth/multitenancy/TenantAwareFirebaseAuthTest.java index 68e35492e..4cf36a3d7 100644 --- a/src/test/java/com/google/firebase/auth/multitenancy/TenantAwareFirebaseAuthTest.java +++ b/src/test/java/com/google/firebase/auth/multitenancy/TenantAwareFirebaseAuthTest.java @@ -38,6 +38,7 @@ import com.google.firebase.auth.MockTokenVerifier; import com.google.firebase.auth.SessionCookieOptions; import com.google.firebase.internal.ApiClientUtils; +import com.google.firebase.internal.SdkUtils; import com.google.firebase.testing.TestResponseInterceptor; import com.google.firebase.testing.TestUtils; import java.io.ByteArrayOutputStream; @@ -85,6 +86,7 @@ public void testCreateSessionCookieAsync() throws Exception { assertEquals("testToken", parsed.get("idToken")); assertEquals(new BigDecimal(3600), parsed.get("validDuration")); checkUrl(interceptor, AUTH_BASE_URL + ":createSessionCookie"); + checkHeaders(interceptor); } @Test @@ -121,6 +123,7 @@ public void testCreateSessionCookie() throws Exception { assertEquals("testToken", parsed.get("idToken")); assertEquals(new BigDecimal(3600), parsed.get("validDuration")); checkUrl(interceptor, AUTH_BASE_URL + ":createSessionCookie"); + checkHeaders(interceptor); } @Test @@ -212,6 +215,7 @@ public void testVerifySessionCookieWithCheckRevoked() throws FirebaseAuthExcepti assertEquals("uid", token.getUid()); assertEquals("cookie", tokenVerifier.getLastTokenString()); checkUrl(interceptor, AUTH_BASE_URL + "/accounts:lookup"); + checkHeaders(interceptor); } @Test @@ -290,4 +294,9 @@ private static void checkUrl(TestResponseInterceptor interceptor, String url) { assertEquals(HttpMethods.POST, request.getRequestMethod()); assertEquals(url, request.getUrl().getRawPath()); } + + private static void checkHeaders(TestResponseInterceptor interceptor) { + HttpRequest request = interceptor.getResponse().getRequest(); + assertEquals(SdkUtils.getMetricsHeader(), request.getHeaders().get("X-Goog-Api-Client")); + } } diff --git a/src/test/java/com/google/firebase/iid/FirebaseInstanceIdTest.java b/src/test/java/com/google/firebase/iid/FirebaseInstanceIdTest.java index 27864d992..f563d87dd 100644 --- a/src/test/java/com/google/firebase/iid/FirebaseInstanceIdTest.java +++ b/src/test/java/com/google/firebase/iid/FirebaseInstanceIdTest.java @@ -38,6 +38,7 @@ import com.google.firebase.OutgoingHttpRequest; import com.google.firebase.TestOnlyImplFirebaseTrampolines; import com.google.firebase.auth.MockGoogleCredentials; +import com.google.firebase.internal.SdkUtils; import com.google.firebase.testing.GenericFunction; import com.google.firebase.testing.TestResponseInterceptor; import com.google.firebase.testing.TestUtils; @@ -174,6 +175,7 @@ public Void call(Object... args) throws Exception { assertEquals(HttpMethods.DELETE, request.getRequestMethod()); assertEquals(TEST_URL, request.getUrl().toString()); assertEquals("Bearer test-token", request.getHeaders().getAuthorization()); + assertEquals(SdkUtils.getMetricsHeader(), request.getHeaders().get("X-Goog-Api-Client")); } } diff --git a/src/test/java/com/google/firebase/internal/ErrorHandlingHttpClientTest.java b/src/test/java/com/google/firebase/internal/ErrorHandlingHttpClientTest.java index 8b3e75efd..6d7fb2a9e 100644 --- a/src/test/java/com/google/firebase/internal/ErrorHandlingHttpClientTest.java +++ b/src/test/java/com/google/firebase/internal/ErrorHandlingHttpClientTest.java @@ -127,6 +127,7 @@ public void testSuccessfulRequestWithHeadersAndBody() throws FirebaseException, assertEquals("v1", last.getHeaders().get("h1")); assertEquals("v2", last.getHeaders().get("h2")); assertEquals("v3", last.getHeaders().get("h3")); + assertEquals(SdkUtils.getMetricsHeader(), last.getHeaders().get("x-goog-api-client")); ByteArrayOutputStream out = new ByteArrayOutputStream(); last.getContent().writeTo(out); diff --git a/src/test/java/com/google/firebase/messaging/FirebaseMessagingClientImplTest.java b/src/test/java/com/google/firebase/messaging/FirebaseMessagingClientImplTest.java index b75d9a3d6..805d409a0 100644 --- a/src/test/java/com/google/firebase/messaging/FirebaseMessagingClientImplTest.java +++ b/src/test/java/com/google/firebase/messaging/FirebaseMessagingClientImplTest.java @@ -389,6 +389,7 @@ private void checkRequestHeader(HttpRequest request) { HttpHeaders headers = request.getHeaders(); assertEquals("2", headers.get("X-GOOG-API-FORMAT-VERSION")); assertEquals("fire-admin-java/" + SdkUtils.getVersion(), headers.get("X-Firebase-Client")); + assertEquals(SdkUtils.getMetricsHeader(), headers.get("X-Goog-Api-Client")); } private void checkRequest( diff --git a/src/test/java/com/google/firebase/messaging/InstanceIdClientImplTest.java b/src/test/java/com/google/firebase/messaging/InstanceIdClientImplTest.java index 1a140680f..d0151bb94 100644 --- a/src/test/java/com/google/firebase/messaging/InstanceIdClientImplTest.java +++ b/src/test/java/com/google/firebase/messaging/InstanceIdClientImplTest.java @@ -41,6 +41,7 @@ import com.google.firebase.TestOnlyImplFirebaseTrampolines; import com.google.firebase.auth.MockGoogleCredentials; import com.google.firebase.internal.ApiClientUtils; +import com.google.firebase.internal.SdkUtils; import com.google.firebase.testing.TestResponseInterceptor; import com.google.firebase.testing.TestUtils; import java.io.ByteArrayOutputStream; @@ -447,6 +448,8 @@ private void checkTopicManagementRequestHeader( HttpRequest request, String expectedUrl) { assertEquals("POST", request.getRequestMethod()); assertEquals(expectedUrl, request.getUrl().toString()); + assertEquals(SdkUtils.getMetricsHeader(), request.getHeaders().get("X-Goog-Api-Client")); + } private void checkExceptionFromHttpResponse( diff --git a/src/test/java/com/google/firebase/projectmanagement/FirebaseProjectManagementServiceImplTest.java b/src/test/java/com/google/firebase/projectmanagement/FirebaseProjectManagementServiceImplTest.java index 853074e65..4221adc6c 100644 --- a/src/test/java/com/google/firebase/projectmanagement/FirebaseProjectManagementServiceImplTest.java +++ b/src/test/java/com/google/firebase/projectmanagement/FirebaseProjectManagementServiceImplTest.java @@ -1124,6 +1124,7 @@ private void checkRequestHeader(int index, String expectedUrl, HttpMethod httpMe assertEquals(expectedUrl, request.getUrl().toString()); assertEquals("Bearer test-token", request.getHeaders().getAuthorization()); assertEquals(CLIENT_VERSION, request.getHeaders().get("X-Client-Version")); + assertEquals(SdkUtils.getMetricsHeader(), request.getHeaders().get("X-Goog-Api-Client")); } private void checkRequestPayload(Map expected) throws IOException { diff --git a/src/test/java/com/google/firebase/remoteconfig/FirebaseRemoteConfigClientImplTest.java b/src/test/java/com/google/firebase/remoteconfig/FirebaseRemoteConfigClientImplTest.java index 0a04809cf..edc52a19d 100644 --- a/src/test/java/com/google/firebase/remoteconfig/FirebaseRemoteConfigClientImplTest.java +++ b/src/test/java/com/google/firebase/remoteconfig/FirebaseRemoteConfigClientImplTest.java @@ -1185,6 +1185,7 @@ private void checkGetRequestHeader(HttpRequest request, String urlSuffix) { assertEquals(TEST_REMOTE_CONFIG_URL + urlSuffix, request.getUrl().toString()); HttpHeaders headers = request.getHeaders(); assertEquals("fire-admin-java/" + SdkUtils.getVersion(), headers.get("X-Firebase-Client")); + assertEquals(SdkUtils.getMetricsHeader(), request.getHeaders().get("X-Goog-Api-Client")); assertEquals("gzip", headers.getAcceptEncoding()); } @@ -1197,6 +1198,7 @@ private void checkPutRequestHeader(HttpRequest request, String urlSuffix, String assertEquals(TEST_REMOTE_CONFIG_URL + urlSuffix, request.getUrl().toString()); HttpHeaders headers = request.getHeaders(); assertEquals("fire-admin-java/" + SdkUtils.getVersion(), headers.get("X-Firebase-Client")); + assertEquals(SdkUtils.getMetricsHeader(), request.getHeaders().get("X-Goog-Api-Client")); assertEquals("gzip", headers.getAcceptEncoding()); assertEquals(ifMatch, headers.getIfMatch()); } @@ -1206,6 +1208,7 @@ private void checkPostRequestHeader(HttpRequest request, String urlSuffix) { assertEquals(TEST_REMOTE_CONFIG_URL + urlSuffix, request.getUrl().toString()); HttpHeaders headers = request.getHeaders(); assertEquals("fire-admin-java/" + SdkUtils.getVersion(), headers.get("X-Firebase-Client")); + assertEquals(SdkUtils.getMetricsHeader(), request.getHeaders().get("X-Goog-Api-Client")); assertEquals("gzip", headers.getAcceptEncoding()); }