diff --git a/google-cloud-core/src/main/java/com/google/cloud/HttpTransportOptions.java b/google-cloud-core/src/main/java/com/google/cloud/HttpTransportOptions.java index 1ef0276faf95..970ca555fea6 100644 --- a/google-cloud-core/src/main/java/com/google/cloud/HttpTransportOptions.java +++ b/google-cloud-core/src/main/java/com/google/cloud/HttpTransportOptions.java @@ -19,6 +19,7 @@ import static com.google.common.base.MoreObjects.firstNonNull; import com.google.api.client.extensions.appengine.http.UrlFetchTransport; +import com.google.api.client.http.HttpHeaders; import com.google.api.client.http.HttpRequest; import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.HttpTransport; @@ -154,10 +155,26 @@ public void initialize(HttpRequest httpRequest) throws IOException { if (readTimeout >= 0) { httpRequest.setReadTimeout(readTimeout); } + + HttpHeaders headers = httpRequest.getHeaders(); + headers.set("x-goog-api-client", getXGoogApiClientHeader()); } }; } + String getXGoogApiClientHeader() { + return String.format( + "gl-java/%s %s/%s", + getJavaVersion(), + ServiceOptions.getGoogApiClientLibName(), + ServiceOptions.getLibraryVersion()); + } + + private static String getJavaVersion() { + String javaVersion = Runtime.class.getPackage().getImplementationVersion(); + return javaVersion != null ? javaVersion : ""; + } + /** * Returns the timeout in milliseconds to establish a connection. 0 is an infinite timeout, a * negative number is the default value (20000). diff --git a/google-cloud-core/src/main/java/com/google/cloud/ServiceOptions.java b/google-cloud-core/src/main/java/com/google/cloud/ServiceOptions.java index 843f775eca01..55f2c08ac4c5 100644 --- a/google-cloud-core/src/main/java/com/google/cloud/ServiceOptions.java +++ b/google-cloud-core/src/main/java/com/google/cloud/ServiceOptions.java @@ -525,7 +525,7 @@ public TransportOptions getTransportOptions() { /** * Returns the application's name as a string in the format {@code gcloud-java/[version]}. */ - public String getApplicationName() { + public static String getApplicationName() { return APPLICATION_NAME; } @@ -533,21 +533,21 @@ public String getApplicationName() { /** * Returns the library's name, {@code gcloud-java}, as a string. */ - public String getLibraryName() { + public static String getLibraryName() { return LIBRARY_NAME; } /** * Returns the library's name used by x-goog-api-client header as a string. */ - public String getGoogApiClientLibName() { + public static String getGoogApiClientLibName() { return X_GOOGLE_CLIENT_HEADER_NAME; } /** * Returns the library's version as a string. */ - public String getLibraryVersion() { + public static String getLibraryVersion() { return LIBRARY_VERSION; } diff --git a/google-cloud-core/src/test/java/com/google/cloud/HttpTransportOptionsTest.java b/google-cloud-core/src/test/java/com/google/cloud/HttpTransportOptionsTest.java index f5013181b2a5..23a2c10a5084 100644 --- a/google-cloud-core/src/test/java/com/google/cloud/HttpTransportOptionsTest.java +++ b/google-cloud-core/src/test/java/com/google/cloud/HttpTransportOptionsTest.java @@ -23,6 +23,7 @@ import com.google.auth.http.HttpTransportFactory; import com.google.cloud.HttpTransportOptions.DefaultHttpTransportFactory; +import java.util.regex.Pattern; import org.easymock.EasyMock; import org.junit.Test; @@ -60,4 +61,12 @@ public void testBaseHashCode() { assertEquals(OPTIONS.hashCode(), OPTIONS_COPY.hashCode()); assertNotEquals(DEFAULT_OPTIONS.hashCode(), OPTIONS.hashCode()); } + + @Test + public void testHeader() { + String expectedHeaderPattern = "^gl-java/.* gccl/.*"; + assertTrue(Pattern.compile(expectedHeaderPattern) + .matcher(DEFAULT_OPTIONS.getXGoogApiClientHeader()) + .find()); + } } diff --git a/pom.xml b/pom.xml index 1d0e44083488..e78b87aba329 100644 --- a/pom.xml +++ b/pom.xml @@ -92,7 +92,7 @@ github 0.6.0 1.0.3 - 0.6.0 + 0.6.1 0.1.5 0.10.1-alpha-SNAPSHOT 0.10.1-beta-SNAPSHOT