From 0dca4a545b5316821452060391ce644adcabfccf Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Fri, 23 Jan 2026 16:05:50 -0500 Subject: [PATCH 01/11] chore(main): release 2.1.1-SNAPSHOT (#2146) Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> --- google-http-client-android-test/pom.xml | 6 ++-- google-http-client-android/pom.xml | 4 +-- google-http-client-apache-v2/pom.xml | 4 +-- google-http-client-apache-v5/pom.xml | 4 +-- google-http-client-appengine/pom.xml | 4 +-- google-http-client-assembly/pom.xml | 4 +-- google-http-client-bom/pom.xml | 24 +++++++-------- google-http-client-findbugs/pom.xml | 4 +-- google-http-client-gson/pom.xml | 4 +-- google-http-client-jackson2/pom.xml | 4 +-- google-http-client-protobuf/pom.xml | 4 +-- google-http-client-test/pom.xml | 4 +-- google-http-client-xml/pom.xml | 4 +-- google-http-client/pom.xml | 4 +-- pom.xml | 4 +-- .../dailymotion-simple-cmdline-sample/pom.xml | 2 +- versions.txt | 30 +++++++++---------- 17 files changed, 57 insertions(+), 57 deletions(-) diff --git a/google-http-client-android-test/pom.xml b/google-http-client-android-test/pom.xml index cd5714fe9..d47e06a94 100644 --- a/google-http-client-android-test/pom.xml +++ b/google-http-client-android-test/pom.xml @@ -4,7 +4,7 @@ google-http-client google-http-client-android-test Test project for google-http-client-android. - 2.1.0 + 2.1.1-SNAPSHOT apk @@ -53,7 +53,7 @@ com.google.http-client google-http-client-android - 2.1.0 + 2.1.1-SNAPSHOT android @@ -72,7 +72,7 @@ com.google.http-client google-http-client-test - 2.1.0 + 2.1.1-SNAPSHOT junit diff --git a/google-http-client-android/pom.xml b/google-http-client-android/pom.xml index 6bcd6d9f6..eda4aa194 100644 --- a/google-http-client-android/pom.xml +++ b/google-http-client-android/pom.xml @@ -4,11 +4,11 @@ com.google.http-client google-http-client-parent - 2.1.0 + 2.1.1-SNAPSHOT ../pom.xml google-http-client-android - 2.1.0 + 2.1.1-SNAPSHOT Android Platform Extensions to the Google HTTP Client Library for Java. diff --git a/google-http-client-apache-v2/pom.xml b/google-http-client-apache-v2/pom.xml index 94d0a080c..821f166b7 100644 --- a/google-http-client-apache-v2/pom.xml +++ b/google-http-client-apache-v2/pom.xml @@ -4,11 +4,11 @@ com.google.http-client google-http-client-parent - 2.1.0 + 2.1.1-SNAPSHOT ../pom.xml google-http-client-apache-v2 - 2.1.0 + 2.1.1-SNAPSHOT Apache HTTP transport v2 for the Google HTTP Client Library for Java. diff --git a/google-http-client-apache-v5/pom.xml b/google-http-client-apache-v5/pom.xml index 32aab0fc0..6b3428298 100644 --- a/google-http-client-apache-v5/pom.xml +++ b/google-http-client-apache-v5/pom.xml @@ -4,11 +4,11 @@ com.google.http-client google-http-client-parent - 2.1.0 + 2.1.1-SNAPSHOT ../pom.xml google-http-client-apache-v5 - 2.1.0 + 2.1.1-SNAPSHOT Apache HTTP transport v5 for the Google HTTP Client Library for Java. diff --git a/google-http-client-appengine/pom.xml b/google-http-client-appengine/pom.xml index 63053c51c..dbf5456df 100644 --- a/google-http-client-appengine/pom.xml +++ b/google-http-client-appengine/pom.xml @@ -4,11 +4,11 @@ com.google.http-client google-http-client-parent - 2.1.0 + 2.1.1-SNAPSHOT ../pom.xml google-http-client-appengine - 2.1.0 + 2.1.1-SNAPSHOT Google App Engine extensions to the Google HTTP Client Library for Java. diff --git a/google-http-client-assembly/pom.xml b/google-http-client-assembly/pom.xml index 78c0e87df..3eaf24129 100644 --- a/google-http-client-assembly/pom.xml +++ b/google-http-client-assembly/pom.xml @@ -4,12 +4,12 @@ com.google.http-client google-http-client-parent - 2.1.0 + 2.1.1-SNAPSHOT ../pom.xml com.google.http-client google-http-client-assembly - 2.1.0 + 2.1.1-SNAPSHOT pom Assembly for the Google HTTP Client Library for Java diff --git a/google-http-client-bom/pom.xml b/google-http-client-bom/pom.xml index b9457bfe2..270e8799b 100644 --- a/google-http-client-bom/pom.xml +++ b/google-http-client-bom/pom.xml @@ -3,7 +3,7 @@ 4.0.0 com.google.http-client google-http-client-bom - 2.1.0 + 2.1.1-SNAPSHOT pom Google HTTP Client Library for Java BOM @@ -63,57 +63,57 @@ com.google.http-client google-http-client - 2.1.0 + 2.1.1-SNAPSHOT com.google.http-client google-http-client-android - 2.1.0 + 2.1.1-SNAPSHOT com.google.http-client google-http-client-apache-v2 - 2.1.0 + 2.1.1-SNAPSHOT com.google.http-client google-http-client-apache-v5 - 2.1.0 + 2.1.1-SNAPSHOT com.google.http-client google-http-client-appengine - 2.1.0 + 2.1.1-SNAPSHOT com.google.http-client google-http-client-findbugs - 2.1.0 + 2.1.1-SNAPSHOT com.google.http-client google-http-client-gson - 2.1.0 + 2.1.1-SNAPSHOT com.google.http-client google-http-client-jackson2 - 2.1.0 + 2.1.1-SNAPSHOT com.google.http-client google-http-client-protobuf - 2.1.0 + 2.1.1-SNAPSHOT com.google.http-client google-http-client-test - 2.1.0 + 2.1.1-SNAPSHOT com.google.http-client google-http-client-xml - 2.1.0 + 2.1.1-SNAPSHOT diff --git a/google-http-client-findbugs/pom.xml b/google-http-client-findbugs/pom.xml index f36745169..5e1a26529 100644 --- a/google-http-client-findbugs/pom.xml +++ b/google-http-client-findbugs/pom.xml @@ -4,11 +4,11 @@ com.google.http-client google-http-client-parent - 2.1.0 + 2.1.1-SNAPSHOT ../pom.xml google-http-client-findbugs - 2.1.0 + 2.1.1-SNAPSHOT Google APIs Client Library Findbugs custom plugin. diff --git a/google-http-client-gson/pom.xml b/google-http-client-gson/pom.xml index c102c4335..385901b80 100644 --- a/google-http-client-gson/pom.xml +++ b/google-http-client-gson/pom.xml @@ -4,11 +4,11 @@ com.google.http-client google-http-client-parent - 2.1.0 + 2.1.1-SNAPSHOT ../pom.xml google-http-client-gson - 2.1.0 + 2.1.1-SNAPSHOT GSON extensions to the Google HTTP Client Library for Java. diff --git a/google-http-client-jackson2/pom.xml b/google-http-client-jackson2/pom.xml index 95ee04943..9169083c8 100644 --- a/google-http-client-jackson2/pom.xml +++ b/google-http-client-jackson2/pom.xml @@ -4,11 +4,11 @@ com.google.http-client google-http-client-parent - 2.1.0 + 2.1.1-SNAPSHOT ../pom.xml google-http-client-jackson2 - 2.1.0 + 2.1.1-SNAPSHOT Jackson 2 extensions to the Google HTTP Client Library for Java. diff --git a/google-http-client-protobuf/pom.xml b/google-http-client-protobuf/pom.xml index 1d54bc8ad..f5144bccb 100644 --- a/google-http-client-protobuf/pom.xml +++ b/google-http-client-protobuf/pom.xml @@ -4,11 +4,11 @@ com.google.http-client google-http-client-parent - 2.1.0 + 2.1.1-SNAPSHOT ../pom.xml google-http-client-protobuf - 2.1.0 + 2.1.1-SNAPSHOT Protocol Buffer extensions to the Google HTTP Client Library for Java. diff --git a/google-http-client-test/pom.xml b/google-http-client-test/pom.xml index b9b6d84b0..1c39cef40 100644 --- a/google-http-client-test/pom.xml +++ b/google-http-client-test/pom.xml @@ -4,11 +4,11 @@ com.google.http-client google-http-client-parent - 2.1.0 + 2.1.1-SNAPSHOT ../pom.xml google-http-client-test - 2.1.0 + 2.1.1-SNAPSHOT Shared classes used for testing of artifacts in the Google HTTP Client Library for Java. diff --git a/google-http-client-xml/pom.xml b/google-http-client-xml/pom.xml index d37ad6e97..b16c24c1b 100644 --- a/google-http-client-xml/pom.xml +++ b/google-http-client-xml/pom.xml @@ -4,11 +4,11 @@ com.google.http-client google-http-client-parent - 2.1.0 + 2.1.1-SNAPSHOT ../pom.xml google-http-client-xml - 2.1.0 + 2.1.1-SNAPSHOT XML extensions to the Google HTTP Client Library for Java. diff --git a/google-http-client/pom.xml b/google-http-client/pom.xml index 84efe2c98..6cb84e024 100644 --- a/google-http-client/pom.xml +++ b/google-http-client/pom.xml @@ -4,11 +4,11 @@ com.google.http-client google-http-client-parent - 2.1.0 + 2.1.1-SNAPSHOT ../pom.xml google-http-client - 2.1.0 + 2.1.1-SNAPSHOT Google HTTP Client Library for Java Google HTTP Client Library for Java. Functionality that works on all supported Java platforms, diff --git a/pom.xml b/pom.xml index b1a491132..ca68c89db 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 com.google.http-client google-http-client-parent - 2.1.0 + 2.1.1-SNAPSHOT pom Parent for the Google HTTP Client Library for Java Google HTTP Client Library for Java @@ -547,7 +547,7 @@ - google-api-java-client/google-api-client-assembly/android-properties (make the filenames match the version here) - Internally, update the default features.json file --> - 2.1.0 + 2.1.1-SNAPSHOT 2.0.32 UTF-8 3.0.2 diff --git a/samples/dailymotion-simple-cmdline-sample/pom.xml b/samples/dailymotion-simple-cmdline-sample/pom.xml index ccb913b1a..56060b787 100644 --- a/samples/dailymotion-simple-cmdline-sample/pom.xml +++ b/samples/dailymotion-simple-cmdline-sample/pom.xml @@ -4,7 +4,7 @@ com.google.http-client google-http-client-parent - 2.1.0 + 2.1.1-SNAPSHOT ../../pom.xml dailymotion-simple-cmdline-sample diff --git a/versions.txt b/versions.txt index 1eedc8c6d..7a043defd 100644 --- a/versions.txt +++ b/versions.txt @@ -1,18 +1,18 @@ # Format: # module:released-version:current-version -google-http-client:2.1.0:2.1.0 -google-http-client-bom:2.1.0:2.1.0 -google-http-client-parent:2.1.0:2.1.0 -google-http-client-android:2.1.0:2.1.0 -google-http-client-android-test:2.1.0:2.1.0 -google-http-client-apache-v2:2.1.0:2.1.0 -google-http-client-apache-v5:2.1.0:2.1.0 -google-http-client-appengine:2.1.0:2.1.0 -google-http-client-assembly:2.1.0:2.1.0 -google-http-client-findbugs:2.1.0:2.1.0 -google-http-client-gson:2.1.0:2.1.0 -google-http-client-jackson2:2.1.0:2.1.0 -google-http-client-protobuf:2.1.0:2.1.0 -google-http-client-test:2.1.0:2.1.0 -google-http-client-xml:2.1.0:2.1.0 +google-http-client:2.1.0:2.1.1-SNAPSHOT +google-http-client-bom:2.1.0:2.1.1-SNAPSHOT +google-http-client-parent:2.1.0:2.1.1-SNAPSHOT +google-http-client-android:2.1.0:2.1.1-SNAPSHOT +google-http-client-android-test:2.1.0:2.1.1-SNAPSHOT +google-http-client-apache-v2:2.1.0:2.1.1-SNAPSHOT +google-http-client-apache-v5:2.1.0:2.1.1-SNAPSHOT +google-http-client-appengine:2.1.0:2.1.1-SNAPSHOT +google-http-client-assembly:2.1.0:2.1.1-SNAPSHOT +google-http-client-findbugs:2.1.0:2.1.1-SNAPSHOT +google-http-client-gson:2.1.0:2.1.1-SNAPSHOT +google-http-client-jackson2:2.1.0:2.1.1-SNAPSHOT +google-http-client-protobuf:2.1.0:2.1.1-SNAPSHOT +google-http-client-test:2.1.0:2.1.1-SNAPSHOT +google-http-client-xml:2.1.0:2.1.1-SNAPSHOT From a14524c41540c0f82928fd3af42a112d3aefc9ed Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Thu, 29 Jan 2026 16:04:36 -0500 Subject: [PATCH 02/11] chore: replace old java team with cloud-sdk-java-team (#2147) --- .github/CODEOWNERS | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index db2d8ad17..f90453e92 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -4,10 +4,10 @@ # For syntax help see: # https://help.github.com/en/github/creating-cloning-and-archiving-repositories/about-code-owners#codeowners-syntax -* @googleapis/yoshi-java +* @googleapis/cloud-sdk-java-team # The java-samples-reviewers team is the default owner for samples changes samples/**/*.java @googleapis/java-samples-reviewers # Generated snippets should not be owned by samples reviewers -samples/snippets/generated/ @googleapis/yoshi-java +samples/snippets/generated/ @googleapis/cloud-sdk-java-team From 3d7a6646e8fa5d6f7bc774d81133c55d74eaedf3 Mon Sep 17 00:00:00 2001 From: ldetmer <1771267+ldetmer@users.noreply.github.com> Date: Wed, 11 Feb 2026 13:20:52 -0500 Subject: [PATCH 03/11] chore: remove reference to GoogleNetHttpTransport in documentation for HttpTransport class (#2148) --- .../main/java/com/google/api/client/http/HttpTransport.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/google-http-client/src/main/java/com/google/api/client/http/HttpTransport.java b/google-http-client/src/main/java/com/google/api/client/http/HttpTransport.java index 9a2d04220..c4d0f886f 100644 --- a/google-http-client/src/main/java/com/google/api/client/http/HttpTransport.java +++ b/google-http-client/src/main/java/com/google/api/client/http/HttpTransport.java @@ -48,10 +48,9 @@ * *
  • Other Java environments *
      - *
    • {@code com.google.api.client.googleapis.javanet.GoogleNetHttpTransport} is included - * in google-api-cient 1.22.0, so easy to include. *
    • {@code com.google.api.client.javanet.NetHttpTransport} is based on the - * HttpURLConnection built into the Java SDK, so it used to be the preferred choice. + * HttpURLConnection built into the Java SDK. It is the preferred choice if not using + * Apache HTTP Client. *
    • {@code com.google.api.client.apache.ApacheHttpTransport} is a good choice for users * of the Apache HTTP Client, especially if you need some of the configuration options * available in that library. From fbada293e70c4db96c90128f507ff60efa34fe6a Mon Sep 17 00:00:00 2001 From: Kirill Logachev Date: Mon, 23 Feb 2026 18:44:27 -0800 Subject: [PATCH 04/11] fix: add containsKey override for GenericData class (#2151) * chore: add containsKey override for GenericData class * lint * fix containsKey to use hasFieldInfo --- .../com/google/api/client/util/ClassInfo.java | 16 ++++++++++++++++ .../com/google/api/client/util/GenericData.java | 16 ++++++++++++++++ .../google/api/client/util/ClassInfoTest.java | 9 +++++++++ .../google/api/client/util/GenericDataTest.java | 4 ++++ 4 files changed, 45 insertions(+) diff --git a/google-http-client/src/main/java/com/google/api/client/util/ClassInfo.java b/google-http-client/src/main/java/com/google/api/client/util/ClassInfo.java index f11f6ffb0..90c50058f 100644 --- a/google-http-client/src/main/java/com/google/api/client/util/ClassInfo.java +++ b/google-http-client/src/main/java/com/google/api/client/util/ClassInfo.java @@ -112,6 +112,22 @@ public final boolean getIgnoreCase() { return ignoreCase; } + /** + * Returns whether information for the given {@link FieldInfo#getName()} is available. + * + * @param name {@link FieldInfo#getName()} or {@code null} + * @return true if field info is available. + */ + public boolean hasFieldInfo(String name) { + if (name != null) { + if (ignoreCase) { + name = name.toLowerCase(Locale.US); + } + name = name.intern(); + } + return nameToFieldInfoMap.containsKey(name); + } + /** * Returns the information for the given {@link FieldInfo#getName()}. * diff --git a/google-http-client/src/main/java/com/google/api/client/util/GenericData.java b/google-http-client/src/main/java/com/google/api/client/util/GenericData.java index 5ba12fe47..c6635f89e 100644 --- a/google-http-client/src/main/java/com/google/api/client/util/GenericData.java +++ b/google-http-client/src/main/java/com/google/api/client/util/GenericData.java @@ -74,6 +74,22 @@ public GenericData(EnumSet flags) { classInfo = ClassInfo.of(getClass(), flags.contains(Flags.IGNORE_CASE)); } + @Override + public final boolean containsKey(Object name) { + if (!(name instanceof String)) { + return false; + } + String fieldName = (String) name; + boolean hasFieldInfo = classInfo.hasFieldInfo(fieldName); + if (hasFieldInfo) { + return true; + } + if (classInfo.getIgnoreCase()) { + fieldName = fieldName.toLowerCase(Locale.US); + } + return unknownFields.containsKey(fieldName); + } + @Override public final Object get(Object name) { if (!(name instanceof String)) { diff --git a/google-http-client/src/test/java/com/google/api/client/util/ClassInfoTest.java b/google-http-client/src/test/java/com/google/api/client/util/ClassInfoTest.java index d5e51d120..62d9fbcf8 100644 --- a/google-http-client/src/test/java/com/google/api/client/util/ClassInfoTest.java +++ b/google-http-client/src/test/java/com/google/api/client/util/ClassInfoTest.java @@ -58,6 +58,15 @@ public void testGetFieldInfo_enum() throws Exception { assertEquals(E.class.getField("VALUE"), classInfo.getFieldInfo("VALUE").getField()); } + @Test + public void testHasFieldInfo_enum() throws Exception { + ClassInfo classInfo = ClassInfo.of(E.class); + assertFalse(classInfo.hasFieldInfo("wrong")); + assertTrue(classInfo.hasFieldInfo(null)); + assertTrue(classInfo.hasFieldInfo("other")); + assertTrue(classInfo.hasFieldInfo("VALUE")); + } + public class A { @Key String b; diff --git a/google-http-client/src/test/java/com/google/api/client/util/GenericDataTest.java b/google-http-client/src/test/java/com/google/api/client/util/GenericDataTest.java index 3b823d411..fd6547bb6 100644 --- a/google-http-client/src/test/java/com/google/api/client/util/GenericDataTest.java +++ b/google-http-client/src/test/java/com/google/api/client/util/GenericDataTest.java @@ -156,6 +156,7 @@ public void testPutIgnoreCase_class() { public void testGetIgnoreCase_class() { MyData data = new MyData(); data.fieldA = "someValue"; + assertTrue(data.containsKey("FIELDA")); assertEquals("someValue", data.get("FIELDA")); } @@ -187,11 +188,14 @@ public void testPutIgnoreCase_unknownKey() { public void testGetIgnoreCase_unknownKey() { GenericData data = new GenericData(EnumSet.of(Flags.IGNORE_CASE)); data.set("One", 1); + assertTrue(data.containsKey("ONE")); assertEquals(1, data.get("ONE")); data.set("one", 2); + assertTrue(data.containsKey("ONE")); assertEquals(2, data.get("ONE")); + assertFalse(data.containsKey("unknownKey")); assertEquals(null, data.get("unknownKey")); } From eb787d75830b7184938c8e0441a7b442711b8066 Mon Sep 17 00:00:00 2001 From: Lawrence Qiu Date: Mon, 29 Jun 2026 16:49:33 +0000 Subject: [PATCH 05/11] test: resolve GraalVM SSL/network failures in Apache transport tests (#2165) Rewrite redirect tests in ApacheHttpTransportTest (v2) and Apache5HttpTransportTest (v5) to use a local FakeServer instead of connecting to google.com, avoiding SSL handshake and network unreachable failures in restricted environments. Also update header tests to use localhost/FakeServer dummy URLs to avoid external network calls. TAG=agy CONV=b7638222-8f45-4b8a-8698-ae587dfa7e88 --- .../apache/v2/ApacheHttpTransportTest.java | 50 +++++++----- .../apache/v5/Apache5HttpTransportTest.java | 78 +++++++++++-------- 2 files changed, 77 insertions(+), 51 deletions(-) diff --git a/google-http-client-apache-v2/src/test/java/com/google/api/client/http/apache/v2/ApacheHttpTransportTest.java b/google-http-client-apache-v2/src/test/java/com/google/api/client/http/apache/v2/ApacheHttpTransportTest.java index 48a9d1c56..e4e7e657a 100644 --- a/google-http-client-apache-v2/src/test/java/com/google/api/client/http/apache/v2/ApacheHttpTransportTest.java +++ b/google-http-client-apache-v2/src/test/java/com/google/api/client/http/apache/v2/ApacheHttpTransportTest.java @@ -40,11 +40,9 @@ import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import org.apache.http.Header; -import org.apache.http.HttpClientConnection; import org.apache.http.HttpException; import org.apache.http.HttpRequest; import org.apache.http.HttpRequestInterceptor; -import org.apache.http.HttpResponse; import org.apache.http.HttpVersion; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.HttpClient; @@ -55,7 +53,6 @@ import org.apache.http.impl.client.HttpClients; import org.apache.http.message.BasicHttpResponse; import org.apache.http.protocol.HttpContext; -import org.apache.http.protocol.HttpRequestExecutor; import org.junit.Assert; import org.junit.Test; @@ -162,25 +159,38 @@ private void execute(ApacheHttpRequest request) throws IOException { @Test public void testRequestShouldNotFollowRedirects() throws IOException { - final AtomicInteger requestsAttempted = new AtomicInteger(0); - HttpRequestExecutor requestExecutor = - new HttpRequestExecutor() { + final AtomicInteger requestCount = new AtomicInteger(0); + final AtomicBoolean redirected = new AtomicBoolean(false); + final HttpHandler handler = + new HttpHandler() { @Override - public HttpResponse execute( - HttpRequest request, HttpClientConnection connection, HttpContext context) - throws IOException, HttpException { - HttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1, 302, null); - response.addHeader("location", "https://google.com/path"); - requestsAttempted.incrementAndGet(); - return response; + public void handle(HttpExchange httpExchange) throws IOException { + requestCount.incrementAndGet(); + String path = httpExchange.getRequestURI().getPath(); + if ("/redirected".equals(path)) { + redirected.set(true); + httpExchange.sendResponseHeaders(200, -1); + } else { + int port = httpExchange.getLocalAddress().getPort(); + httpExchange + .getResponseHeaders() + .add("Location", "http://localhost:" + port + "/redirected"); + httpExchange.sendResponseHeaders(302, -1); + } + httpExchange.close(); } }; - HttpClient client = HttpClients.custom().setRequestExecutor(requestExecutor).build(); - ApacheHttpTransport transport = new ApacheHttpTransport(client); - ApacheHttpRequest request = transport.buildRequest("GET", "https://google.com"); - LowLevelHttpResponse response = request.execute(); - assertEquals(1, requestsAttempted.get()); - assertEquals(302, response.getStatusCode()); + + try (FakeServer server = new FakeServer(handler)) { + HttpClient client = HttpClients.custom().build(); + ApacheHttpTransport transport = new ApacheHttpTransport(client); + ApacheHttpRequest request = + transport.buildRequest("GET", "http://localhost:" + server.getPort() + "/"); + LowLevelHttpResponse response = request.execute(); + assertEquals(302, response.getStatusCode()); + assertEquals(1, requestCount.get()); + assertFalse(redirected.get()); + } } @Test @@ -203,7 +213,7 @@ public void process(HttpRequest request, HttpContext context) .build(); ApacheHttpTransport transport = new ApacheHttpTransport(client); - ApacheHttpRequest request = transport.buildRequest("GET", "https://google.com"); + ApacheHttpRequest request = transport.buildRequest("GET", "http://localhost/"); request.addHeader("foo", "bar"); try { LowLevelHttpResponse response = request.execute(); diff --git a/google-http-client-apache-v5/src/test/java/com/google/api/client/http/apache/v5/Apache5HttpTransportTest.java b/google-http-client-apache-v5/src/test/java/com/google/api/client/http/apache/v5/Apache5HttpTransportTest.java index 99045d99d..fcfe5d8d4 100644 --- a/google-http-client-apache-v5/src/test/java/com/google/api/client/http/apache/v5/Apache5HttpTransportTest.java +++ b/google-http-client-apache-v5/src/test/java/com/google/api/client/http/apache/v5/Apache5HttpTransportTest.java @@ -48,9 +48,7 @@ import org.apache.hc.core5.http.HttpResponse; import org.apache.hc.core5.http.HttpStatus; import org.apache.hc.core5.http.impl.bootstrap.HttpServer; -import org.apache.hc.core5.http.impl.io.HttpRequestExecutor; import org.apache.hc.core5.http.impl.io.HttpService; -import org.apache.hc.core5.http.io.HttpClientConnection; import org.apache.hc.core5.http.io.HttpRequestHandler; import org.apache.hc.core5.http.io.entity.ByteArrayEntity; import org.apache.hc.core5.http.io.support.BasicHttpServerRequestHandler; @@ -134,32 +132,40 @@ private void execute(Apache5HttpRequest request) throws IOException { @Test public void testRequestShouldNotFollowRedirects() throws IOException { - final AtomicInteger requestsAttempted = new AtomicInteger(0); - HttpRequestExecutor requestExecutor = - new HttpRequestExecutor() { + final AtomicInteger requestCount = new AtomicInteger(0); + final AtomicBoolean redirected = new AtomicBoolean(false); + final HttpRequestHandler handler = + new HttpRequestHandler() { @Override - public ClassicHttpResponse execute( - ClassicHttpRequest request, HttpClientConnection connection, HttpContext context) - throws IOException, HttpException { - ClassicHttpResponse response = new MockClassicHttpResponse(); - response.setCode(302); - response.setReasonPhrase(null); - response.addHeader("location", "https://google.com/path"); - response.addHeader(HttpHeaders.SET_COOKIE, ""); - requestsAttempted.incrementAndGet(); - return response; + public void handle( + ClassicHttpRequest request, ClassicHttpResponse response, HttpContext context) + throws HttpException, IOException { + requestCount.incrementAndGet(); + String path = request.getRequestUri(); + if ("/redirected".equals(path)) { + redirected.set(true); + response.setCode(200); + } else { + response.setCode(302); + response.setHeader(HttpHeaders.LOCATION, "/redirected"); + } } }; - HttpClient client = HttpClients.custom().setRequestExecutor(requestExecutor).build(); - Apache5HttpTransport transport = new Apache5HttpTransport(client); - Apache5HttpRequest request = transport.buildRequest("GET", "https://google.com"); - LowLevelHttpResponse response = request.execute(); - assertEquals(1, requestsAttempted.get()); - assertEquals(302, response.getStatusCode()); + + try (FakeServer server = new FakeServer(handler)) { + HttpClient client = HttpClients.custom().build(); + Apache5HttpTransport transport = new Apache5HttpTransport(client); + Apache5HttpRequest request = + transport.buildRequest("GET", "http://localhost:" + server.getPort() + "/"); + LowLevelHttpResponse response = request.execute(); + assertEquals(302, response.getStatusCode()); + assertEquals(1, requestCount.get()); + assertFalse(redirected.get()); + } } @Test - public void testRequestCanSetHeaders() { + public void testRequestCanSetHeaders() throws IOException { final AtomicBoolean interceptorCalled = new AtomicBoolean(false); HttpClient client = HttpClients.custom() @@ -178,16 +184,26 @@ public void process( }) .build(); - Apache5HttpTransport transport = new Apache5HttpTransport(client); - Apache5HttpRequest request = transport.buildRequest("GET", "https://google.com"); - request.addHeader("foo", "bar"); - try { - LowLevelHttpResponse response = request.execute(); - fail("should not actually make the request"); - } catch (IOException exception) { - assertEquals("cancelling request", exception.getMessage()); + HttpRequestHandler dummyHandler = + new HttpRequestHandler() { + @Override + public void handle( + ClassicHttpRequest request, ClassicHttpResponse response, HttpContext context) {} + }; + + try (FakeServer server = new FakeServer(dummyHandler)) { + Apache5HttpTransport transport = new Apache5HttpTransport(client); + Apache5HttpRequest request = + transport.buildRequest("GET", "http://localhost:" + server.getPort() + "/"); + request.addHeader("foo", "bar"); + try { + LowLevelHttpResponse response = request.execute(); + fail("should not actually make the request"); + } catch (IOException exception) { + assertEquals("cancelling request", exception.getMessage()); + } + assertTrue("Expected to have called our test interceptor", interceptorCalled.get()); } - assertTrue("Expected to have called our test interceptor", interceptorCalled.get()); } @Test(timeout = 10_000L) From 68d9ba67aef426fddf1bb8f1eb00c10da0e53de3 Mon Sep 17 00:00:00 2001 From: Lawrence Qiu Date: Mon, 29 Jun 2026 17:13:50 +0000 Subject: [PATCH 06/11] fix: upgrade commons-codec to 1.14 to resolve security vulnerability (#2164) Upgrades the transitive dependency `commons-codec:commons-codec` (brought in via `httpclient`) to `1.14` to resolve a security vulnerability (SNYK-JAVA-COMMONSCODEC-561518) which affects versions older than 1.14. We cannot upgrade httpclient further because 4.5.14 is the latest version on the 4.x branch, and upgrading to 5.x would be a breaking change. BUG=496541059 TAG=agy CONV=b43d61a6-175a-4130-8ed4-ec217f123c55 --- pom.xml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/pom.xml b/pom.xml index ca68c89db..3ade7f13b 100644 --- a/pom.xml +++ b/pom.xml @@ -160,6 +160,17 @@ xpp3 ${project.xpp3.version} + + + commons-codec + commons-codec + ${project.commons-codec.version} + org.apache.httpcomponents httpclient @@ -559,6 +570,7 @@ 1.1.4c 4.5.14 4.4.16 + 1.14 5.3.1 5.2.5 0.31.1 From dfce0987fd3ba710cc2b3d1db1221788e025196a Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Mon, 29 Jun 2026 13:58:42 -0400 Subject: [PATCH 07/11] chore(main): release 2.1.1 (#2153) Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> --- CHANGELOG.md | 8 +++++ google-http-client-android-test/pom.xml | 6 ++-- google-http-client-android/pom.xml | 4 +-- google-http-client-apache-v2/pom.xml | 4 +-- google-http-client-apache-v5/pom.xml | 4 +-- google-http-client-appengine/pom.xml | 4 +-- google-http-client-assembly/pom.xml | 4 +-- google-http-client-bom/pom.xml | 24 +++++++-------- google-http-client-findbugs/pom.xml | 4 +-- google-http-client-gson/pom.xml | 4 +-- google-http-client-jackson2/pom.xml | 4 +-- google-http-client-protobuf/pom.xml | 4 +-- google-http-client-test/pom.xml | 4 +-- google-http-client-xml/pom.xml | 4 +-- google-http-client/pom.xml | 4 +-- pom.xml | 4 +-- .../dailymotion-simple-cmdline-sample/pom.xml | 2 +- versions.txt | 30 +++++++++---------- 18 files changed, 65 insertions(+), 57 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 599ffa7ef..0ff7c3f8c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## [2.1.1](https://github.com/googleapis/google-http-java-client/compare/v2.1.0...v2.1.1) (2026-06-29) + + +### Bug Fixes + +* Add containsKey override for GenericData class ([#2151](https://github.com/googleapis/google-http-java-client/issues/2151)) ([fbada29](https://github.com/googleapis/google-http-java-client/commit/fbada293e70c4db96c90128f507ff60efa34fe6a)) +* Upgrade commons-codec to 1.14 to resolve security vulnerability ([#2164](https://github.com/googleapis/google-http-java-client/issues/2164)) ([68d9ba6](https://github.com/googleapis/google-http-java-client/commit/68d9ba67aef426fddf1bb8f1eb00c10da0e53de3)) + ## [2.1.0](https://github.com/googleapis/google-http-java-client/compare/v2.0.3...v2.1.0) (2026-01-23) diff --git a/google-http-client-android-test/pom.xml b/google-http-client-android-test/pom.xml index d47e06a94..9d67a7ecc 100644 --- a/google-http-client-android-test/pom.xml +++ b/google-http-client-android-test/pom.xml @@ -4,7 +4,7 @@ google-http-client google-http-client-android-test Test project for google-http-client-android. - 2.1.1-SNAPSHOT + 2.1.1 apk @@ -53,7 +53,7 @@ com.google.http-client google-http-client-android - 2.1.1-SNAPSHOT + 2.1.1 android @@ -72,7 +72,7 @@ com.google.http-client google-http-client-test - 2.1.1-SNAPSHOT + 2.1.1 junit diff --git a/google-http-client-android/pom.xml b/google-http-client-android/pom.xml index eda4aa194..cbff34acb 100644 --- a/google-http-client-android/pom.xml +++ b/google-http-client-android/pom.xml @@ -4,11 +4,11 @@ com.google.http-client google-http-client-parent - 2.1.1-SNAPSHOT + 2.1.1 ../pom.xml google-http-client-android - 2.1.1-SNAPSHOT + 2.1.1 Android Platform Extensions to the Google HTTP Client Library for Java. diff --git a/google-http-client-apache-v2/pom.xml b/google-http-client-apache-v2/pom.xml index 821f166b7..19eee2e07 100644 --- a/google-http-client-apache-v2/pom.xml +++ b/google-http-client-apache-v2/pom.xml @@ -4,11 +4,11 @@ com.google.http-client google-http-client-parent - 2.1.1-SNAPSHOT + 2.1.1 ../pom.xml google-http-client-apache-v2 - 2.1.1-SNAPSHOT + 2.1.1 Apache HTTP transport v2 for the Google HTTP Client Library for Java. diff --git a/google-http-client-apache-v5/pom.xml b/google-http-client-apache-v5/pom.xml index 6b3428298..5ce6e7045 100644 --- a/google-http-client-apache-v5/pom.xml +++ b/google-http-client-apache-v5/pom.xml @@ -4,11 +4,11 @@ com.google.http-client google-http-client-parent - 2.1.1-SNAPSHOT + 2.1.1 ../pom.xml google-http-client-apache-v5 - 2.1.1-SNAPSHOT + 2.1.1 Apache HTTP transport v5 for the Google HTTP Client Library for Java. diff --git a/google-http-client-appengine/pom.xml b/google-http-client-appengine/pom.xml index dbf5456df..33700aa0b 100644 --- a/google-http-client-appengine/pom.xml +++ b/google-http-client-appengine/pom.xml @@ -4,11 +4,11 @@ com.google.http-client google-http-client-parent - 2.1.1-SNAPSHOT + 2.1.1 ../pom.xml google-http-client-appengine - 2.1.1-SNAPSHOT + 2.1.1 Google App Engine extensions to the Google HTTP Client Library for Java. diff --git a/google-http-client-assembly/pom.xml b/google-http-client-assembly/pom.xml index 3eaf24129..1ab16cd77 100644 --- a/google-http-client-assembly/pom.xml +++ b/google-http-client-assembly/pom.xml @@ -4,12 +4,12 @@ com.google.http-client google-http-client-parent - 2.1.1-SNAPSHOT + 2.1.1 ../pom.xml com.google.http-client google-http-client-assembly - 2.1.1-SNAPSHOT + 2.1.1 pom Assembly for the Google HTTP Client Library for Java diff --git a/google-http-client-bom/pom.xml b/google-http-client-bom/pom.xml index 270e8799b..e33399fbf 100644 --- a/google-http-client-bom/pom.xml +++ b/google-http-client-bom/pom.xml @@ -3,7 +3,7 @@ 4.0.0 com.google.http-client google-http-client-bom - 2.1.1-SNAPSHOT + 2.1.1 pom Google HTTP Client Library for Java BOM @@ -63,57 +63,57 @@ com.google.http-client google-http-client - 2.1.1-SNAPSHOT + 2.1.1 com.google.http-client google-http-client-android - 2.1.1-SNAPSHOT + 2.1.1 com.google.http-client google-http-client-apache-v2 - 2.1.1-SNAPSHOT + 2.1.1 com.google.http-client google-http-client-apache-v5 - 2.1.1-SNAPSHOT + 2.1.1 com.google.http-client google-http-client-appengine - 2.1.1-SNAPSHOT + 2.1.1 com.google.http-client google-http-client-findbugs - 2.1.1-SNAPSHOT + 2.1.1 com.google.http-client google-http-client-gson - 2.1.1-SNAPSHOT + 2.1.1 com.google.http-client google-http-client-jackson2 - 2.1.1-SNAPSHOT + 2.1.1 com.google.http-client google-http-client-protobuf - 2.1.1-SNAPSHOT + 2.1.1 com.google.http-client google-http-client-test - 2.1.1-SNAPSHOT + 2.1.1 com.google.http-client google-http-client-xml - 2.1.1-SNAPSHOT + 2.1.1 diff --git a/google-http-client-findbugs/pom.xml b/google-http-client-findbugs/pom.xml index 5e1a26529..fc3629099 100644 --- a/google-http-client-findbugs/pom.xml +++ b/google-http-client-findbugs/pom.xml @@ -4,11 +4,11 @@ com.google.http-client google-http-client-parent - 2.1.1-SNAPSHOT + 2.1.1 ../pom.xml google-http-client-findbugs - 2.1.1-SNAPSHOT + 2.1.1 Google APIs Client Library Findbugs custom plugin. diff --git a/google-http-client-gson/pom.xml b/google-http-client-gson/pom.xml index 385901b80..eb31dea10 100644 --- a/google-http-client-gson/pom.xml +++ b/google-http-client-gson/pom.xml @@ -4,11 +4,11 @@ com.google.http-client google-http-client-parent - 2.1.1-SNAPSHOT + 2.1.1 ../pom.xml google-http-client-gson - 2.1.1-SNAPSHOT + 2.1.1 GSON extensions to the Google HTTP Client Library for Java. diff --git a/google-http-client-jackson2/pom.xml b/google-http-client-jackson2/pom.xml index 9169083c8..1246b96d5 100644 --- a/google-http-client-jackson2/pom.xml +++ b/google-http-client-jackson2/pom.xml @@ -4,11 +4,11 @@ com.google.http-client google-http-client-parent - 2.1.1-SNAPSHOT + 2.1.1 ../pom.xml google-http-client-jackson2 - 2.1.1-SNAPSHOT + 2.1.1 Jackson 2 extensions to the Google HTTP Client Library for Java. diff --git a/google-http-client-protobuf/pom.xml b/google-http-client-protobuf/pom.xml index f5144bccb..a7186fdf2 100644 --- a/google-http-client-protobuf/pom.xml +++ b/google-http-client-protobuf/pom.xml @@ -4,11 +4,11 @@ com.google.http-client google-http-client-parent - 2.1.1-SNAPSHOT + 2.1.1 ../pom.xml google-http-client-protobuf - 2.1.1-SNAPSHOT + 2.1.1 Protocol Buffer extensions to the Google HTTP Client Library for Java. diff --git a/google-http-client-test/pom.xml b/google-http-client-test/pom.xml index 1c39cef40..4133ca62e 100644 --- a/google-http-client-test/pom.xml +++ b/google-http-client-test/pom.xml @@ -4,11 +4,11 @@ com.google.http-client google-http-client-parent - 2.1.1-SNAPSHOT + 2.1.1 ../pom.xml google-http-client-test - 2.1.1-SNAPSHOT + 2.1.1 Shared classes used for testing of artifacts in the Google HTTP Client Library for Java. diff --git a/google-http-client-xml/pom.xml b/google-http-client-xml/pom.xml index b16c24c1b..ca3dfe864 100644 --- a/google-http-client-xml/pom.xml +++ b/google-http-client-xml/pom.xml @@ -4,11 +4,11 @@ com.google.http-client google-http-client-parent - 2.1.1-SNAPSHOT + 2.1.1 ../pom.xml google-http-client-xml - 2.1.1-SNAPSHOT + 2.1.1 XML extensions to the Google HTTP Client Library for Java. diff --git a/google-http-client/pom.xml b/google-http-client/pom.xml index 6cb84e024..259f60d84 100644 --- a/google-http-client/pom.xml +++ b/google-http-client/pom.xml @@ -4,11 +4,11 @@ com.google.http-client google-http-client-parent - 2.1.1-SNAPSHOT + 2.1.1 ../pom.xml google-http-client - 2.1.1-SNAPSHOT + 2.1.1 Google HTTP Client Library for Java Google HTTP Client Library for Java. Functionality that works on all supported Java platforms, diff --git a/pom.xml b/pom.xml index 3ade7f13b..73b2c4eb2 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 com.google.http-client google-http-client-parent - 2.1.1-SNAPSHOT + 2.1.1 pom Parent for the Google HTTP Client Library for Java Google HTTP Client Library for Java @@ -558,7 +558,7 @@ - google-api-java-client/google-api-client-assembly/android-properties (make the filenames match the version here) - Internally, update the default features.json file --> - 2.1.1-SNAPSHOT + 2.1.1 2.0.32 UTF-8 3.0.2 diff --git a/samples/dailymotion-simple-cmdline-sample/pom.xml b/samples/dailymotion-simple-cmdline-sample/pom.xml index 56060b787..814bef8aa 100644 --- a/samples/dailymotion-simple-cmdline-sample/pom.xml +++ b/samples/dailymotion-simple-cmdline-sample/pom.xml @@ -4,7 +4,7 @@ com.google.http-client google-http-client-parent - 2.1.1-SNAPSHOT + 2.1.1 ../../pom.xml dailymotion-simple-cmdline-sample diff --git a/versions.txt b/versions.txt index 7a043defd..dacdb6d77 100644 --- a/versions.txt +++ b/versions.txt @@ -1,18 +1,18 @@ # Format: # module:released-version:current-version -google-http-client:2.1.0:2.1.1-SNAPSHOT -google-http-client-bom:2.1.0:2.1.1-SNAPSHOT -google-http-client-parent:2.1.0:2.1.1-SNAPSHOT -google-http-client-android:2.1.0:2.1.1-SNAPSHOT -google-http-client-android-test:2.1.0:2.1.1-SNAPSHOT -google-http-client-apache-v2:2.1.0:2.1.1-SNAPSHOT -google-http-client-apache-v5:2.1.0:2.1.1-SNAPSHOT -google-http-client-appengine:2.1.0:2.1.1-SNAPSHOT -google-http-client-assembly:2.1.0:2.1.1-SNAPSHOT -google-http-client-findbugs:2.1.0:2.1.1-SNAPSHOT -google-http-client-gson:2.1.0:2.1.1-SNAPSHOT -google-http-client-jackson2:2.1.0:2.1.1-SNAPSHOT -google-http-client-protobuf:2.1.0:2.1.1-SNAPSHOT -google-http-client-test:2.1.0:2.1.1-SNAPSHOT -google-http-client-xml:2.1.0:2.1.1-SNAPSHOT +google-http-client:2.1.1:2.1.1 +google-http-client-bom:2.1.1:2.1.1 +google-http-client-parent:2.1.1:2.1.1 +google-http-client-android:2.1.1:2.1.1 +google-http-client-android-test:2.1.1:2.1.1 +google-http-client-apache-v2:2.1.1:2.1.1 +google-http-client-apache-v5:2.1.1:2.1.1 +google-http-client-appengine:2.1.1:2.1.1 +google-http-client-assembly:2.1.1:2.1.1 +google-http-client-findbugs:2.1.1:2.1.1 +google-http-client-gson:2.1.1:2.1.1 +google-http-client-jackson2:2.1.1:2.1.1 +google-http-client-protobuf:2.1.1:2.1.1 +google-http-client-test:2.1.1:2.1.1 +google-http-client-xml:2.1.1:2.1.1 From cf8ec81f9dc7183071a29cd37388b78dd39d8966 Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Mon, 29 Jun 2026 14:37:33 -0400 Subject: [PATCH 08/11] chore(main): release 2.1.2-SNAPSHOT (#2166) Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> --- google-http-client-android-test/pom.xml | 6 ++-- google-http-client-android/pom.xml | 4 +-- google-http-client-apache-v2/pom.xml | 4 +-- google-http-client-apache-v5/pom.xml | 4 +-- google-http-client-appengine/pom.xml | 4 +-- google-http-client-assembly/pom.xml | 4 +-- google-http-client-bom/pom.xml | 24 +++++++-------- google-http-client-findbugs/pom.xml | 4 +-- google-http-client-gson/pom.xml | 4 +-- google-http-client-jackson2/pom.xml | 4 +-- google-http-client-protobuf/pom.xml | 4 +-- google-http-client-test/pom.xml | 4 +-- google-http-client-xml/pom.xml | 4 +-- google-http-client/pom.xml | 4 +-- pom.xml | 4 +-- .../dailymotion-simple-cmdline-sample/pom.xml | 2 +- versions.txt | 30 +++++++++---------- 17 files changed, 57 insertions(+), 57 deletions(-) diff --git a/google-http-client-android-test/pom.xml b/google-http-client-android-test/pom.xml index 9d67a7ecc..e4390b380 100644 --- a/google-http-client-android-test/pom.xml +++ b/google-http-client-android-test/pom.xml @@ -4,7 +4,7 @@ google-http-client google-http-client-android-test Test project for google-http-client-android. - 2.1.1 + 2.1.2-SNAPSHOT apk @@ -53,7 +53,7 @@ com.google.http-client google-http-client-android - 2.1.1 + 2.1.2-SNAPSHOT android @@ -72,7 +72,7 @@ com.google.http-client google-http-client-test - 2.1.1 + 2.1.2-SNAPSHOT junit diff --git a/google-http-client-android/pom.xml b/google-http-client-android/pom.xml index cbff34acb..c85ff0336 100644 --- a/google-http-client-android/pom.xml +++ b/google-http-client-android/pom.xml @@ -4,11 +4,11 @@ com.google.http-client google-http-client-parent - 2.1.1 + 2.1.2-SNAPSHOT ../pom.xml google-http-client-android - 2.1.1 + 2.1.2-SNAPSHOT Android Platform Extensions to the Google HTTP Client Library for Java. diff --git a/google-http-client-apache-v2/pom.xml b/google-http-client-apache-v2/pom.xml index 19eee2e07..82a5d381e 100644 --- a/google-http-client-apache-v2/pom.xml +++ b/google-http-client-apache-v2/pom.xml @@ -4,11 +4,11 @@ com.google.http-client google-http-client-parent - 2.1.1 + 2.1.2-SNAPSHOT ../pom.xml google-http-client-apache-v2 - 2.1.1 + 2.1.2-SNAPSHOT Apache HTTP transport v2 for the Google HTTP Client Library for Java. diff --git a/google-http-client-apache-v5/pom.xml b/google-http-client-apache-v5/pom.xml index 5ce6e7045..58268e888 100644 --- a/google-http-client-apache-v5/pom.xml +++ b/google-http-client-apache-v5/pom.xml @@ -4,11 +4,11 @@ com.google.http-client google-http-client-parent - 2.1.1 + 2.1.2-SNAPSHOT ../pom.xml google-http-client-apache-v5 - 2.1.1 + 2.1.2-SNAPSHOT Apache HTTP transport v5 for the Google HTTP Client Library for Java. diff --git a/google-http-client-appengine/pom.xml b/google-http-client-appengine/pom.xml index 33700aa0b..3e5bfa8a5 100644 --- a/google-http-client-appengine/pom.xml +++ b/google-http-client-appengine/pom.xml @@ -4,11 +4,11 @@ com.google.http-client google-http-client-parent - 2.1.1 + 2.1.2-SNAPSHOT ../pom.xml google-http-client-appengine - 2.1.1 + 2.1.2-SNAPSHOT Google App Engine extensions to the Google HTTP Client Library for Java. diff --git a/google-http-client-assembly/pom.xml b/google-http-client-assembly/pom.xml index 1ab16cd77..98607aa43 100644 --- a/google-http-client-assembly/pom.xml +++ b/google-http-client-assembly/pom.xml @@ -4,12 +4,12 @@ com.google.http-client google-http-client-parent - 2.1.1 + 2.1.2-SNAPSHOT ../pom.xml com.google.http-client google-http-client-assembly - 2.1.1 + 2.1.2-SNAPSHOT pom Assembly for the Google HTTP Client Library for Java diff --git a/google-http-client-bom/pom.xml b/google-http-client-bom/pom.xml index e33399fbf..e1c93ad53 100644 --- a/google-http-client-bom/pom.xml +++ b/google-http-client-bom/pom.xml @@ -3,7 +3,7 @@ 4.0.0 com.google.http-client google-http-client-bom - 2.1.1 + 2.1.2-SNAPSHOT pom Google HTTP Client Library for Java BOM @@ -63,57 +63,57 @@ com.google.http-client google-http-client - 2.1.1 + 2.1.2-SNAPSHOT com.google.http-client google-http-client-android - 2.1.1 + 2.1.2-SNAPSHOT com.google.http-client google-http-client-apache-v2 - 2.1.1 + 2.1.2-SNAPSHOT com.google.http-client google-http-client-apache-v5 - 2.1.1 + 2.1.2-SNAPSHOT com.google.http-client google-http-client-appengine - 2.1.1 + 2.1.2-SNAPSHOT com.google.http-client google-http-client-findbugs - 2.1.1 + 2.1.2-SNAPSHOT com.google.http-client google-http-client-gson - 2.1.1 + 2.1.2-SNAPSHOT com.google.http-client google-http-client-jackson2 - 2.1.1 + 2.1.2-SNAPSHOT com.google.http-client google-http-client-protobuf - 2.1.1 + 2.1.2-SNAPSHOT com.google.http-client google-http-client-test - 2.1.1 + 2.1.2-SNAPSHOT com.google.http-client google-http-client-xml - 2.1.1 + 2.1.2-SNAPSHOT diff --git a/google-http-client-findbugs/pom.xml b/google-http-client-findbugs/pom.xml index fc3629099..e394c1218 100644 --- a/google-http-client-findbugs/pom.xml +++ b/google-http-client-findbugs/pom.xml @@ -4,11 +4,11 @@ com.google.http-client google-http-client-parent - 2.1.1 + 2.1.2-SNAPSHOT ../pom.xml google-http-client-findbugs - 2.1.1 + 2.1.2-SNAPSHOT Google APIs Client Library Findbugs custom plugin. diff --git a/google-http-client-gson/pom.xml b/google-http-client-gson/pom.xml index eb31dea10..67e74485f 100644 --- a/google-http-client-gson/pom.xml +++ b/google-http-client-gson/pom.xml @@ -4,11 +4,11 @@ com.google.http-client google-http-client-parent - 2.1.1 + 2.1.2-SNAPSHOT ../pom.xml google-http-client-gson - 2.1.1 + 2.1.2-SNAPSHOT GSON extensions to the Google HTTP Client Library for Java. diff --git a/google-http-client-jackson2/pom.xml b/google-http-client-jackson2/pom.xml index 1246b96d5..a934ca402 100644 --- a/google-http-client-jackson2/pom.xml +++ b/google-http-client-jackson2/pom.xml @@ -4,11 +4,11 @@ com.google.http-client google-http-client-parent - 2.1.1 + 2.1.2-SNAPSHOT ../pom.xml google-http-client-jackson2 - 2.1.1 + 2.1.2-SNAPSHOT Jackson 2 extensions to the Google HTTP Client Library for Java. diff --git a/google-http-client-protobuf/pom.xml b/google-http-client-protobuf/pom.xml index a7186fdf2..402f0b804 100644 --- a/google-http-client-protobuf/pom.xml +++ b/google-http-client-protobuf/pom.xml @@ -4,11 +4,11 @@ com.google.http-client google-http-client-parent - 2.1.1 + 2.1.2-SNAPSHOT ../pom.xml google-http-client-protobuf - 2.1.1 + 2.1.2-SNAPSHOT Protocol Buffer extensions to the Google HTTP Client Library for Java. diff --git a/google-http-client-test/pom.xml b/google-http-client-test/pom.xml index 4133ca62e..cc3ec4a8d 100644 --- a/google-http-client-test/pom.xml +++ b/google-http-client-test/pom.xml @@ -4,11 +4,11 @@ com.google.http-client google-http-client-parent - 2.1.1 + 2.1.2-SNAPSHOT ../pom.xml google-http-client-test - 2.1.1 + 2.1.2-SNAPSHOT Shared classes used for testing of artifacts in the Google HTTP Client Library for Java. diff --git a/google-http-client-xml/pom.xml b/google-http-client-xml/pom.xml index ca3dfe864..fe87d10db 100644 --- a/google-http-client-xml/pom.xml +++ b/google-http-client-xml/pom.xml @@ -4,11 +4,11 @@ com.google.http-client google-http-client-parent - 2.1.1 + 2.1.2-SNAPSHOT ../pom.xml google-http-client-xml - 2.1.1 + 2.1.2-SNAPSHOT XML extensions to the Google HTTP Client Library for Java. diff --git a/google-http-client/pom.xml b/google-http-client/pom.xml index 259f60d84..16a8dd127 100644 --- a/google-http-client/pom.xml +++ b/google-http-client/pom.xml @@ -4,11 +4,11 @@ com.google.http-client google-http-client-parent - 2.1.1 + 2.1.2-SNAPSHOT ../pom.xml google-http-client - 2.1.1 + 2.1.2-SNAPSHOT Google HTTP Client Library for Java Google HTTP Client Library for Java. Functionality that works on all supported Java platforms, diff --git a/pom.xml b/pom.xml index 73b2c4eb2..4155d00a5 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 com.google.http-client google-http-client-parent - 2.1.1 + 2.1.2-SNAPSHOT pom Parent for the Google HTTP Client Library for Java Google HTTP Client Library for Java @@ -558,7 +558,7 @@ - google-api-java-client/google-api-client-assembly/android-properties (make the filenames match the version here) - Internally, update the default features.json file --> - 2.1.1 + 2.1.2-SNAPSHOT 2.0.32 UTF-8 3.0.2 diff --git a/samples/dailymotion-simple-cmdline-sample/pom.xml b/samples/dailymotion-simple-cmdline-sample/pom.xml index 814bef8aa..5845e416f 100644 --- a/samples/dailymotion-simple-cmdline-sample/pom.xml +++ b/samples/dailymotion-simple-cmdline-sample/pom.xml @@ -4,7 +4,7 @@ com.google.http-client google-http-client-parent - 2.1.1 + 2.1.2-SNAPSHOT ../../pom.xml dailymotion-simple-cmdline-sample diff --git a/versions.txt b/versions.txt index dacdb6d77..5f02dcb6c 100644 --- a/versions.txt +++ b/versions.txt @@ -1,18 +1,18 @@ # Format: # module:released-version:current-version -google-http-client:2.1.1:2.1.1 -google-http-client-bom:2.1.1:2.1.1 -google-http-client-parent:2.1.1:2.1.1 -google-http-client-android:2.1.1:2.1.1 -google-http-client-android-test:2.1.1:2.1.1 -google-http-client-apache-v2:2.1.1:2.1.1 -google-http-client-apache-v5:2.1.1:2.1.1 -google-http-client-appengine:2.1.1:2.1.1 -google-http-client-assembly:2.1.1:2.1.1 -google-http-client-findbugs:2.1.1:2.1.1 -google-http-client-gson:2.1.1:2.1.1 -google-http-client-jackson2:2.1.1:2.1.1 -google-http-client-protobuf:2.1.1:2.1.1 -google-http-client-test:2.1.1:2.1.1 -google-http-client-xml:2.1.1:2.1.1 +google-http-client:2.1.1:2.1.2-SNAPSHOT +google-http-client-bom:2.1.1:2.1.2-SNAPSHOT +google-http-client-parent:2.1.1:2.1.2-SNAPSHOT +google-http-client-android:2.1.1:2.1.2-SNAPSHOT +google-http-client-android-test:2.1.1:2.1.2-SNAPSHOT +google-http-client-apache-v2:2.1.1:2.1.2-SNAPSHOT +google-http-client-apache-v5:2.1.1:2.1.2-SNAPSHOT +google-http-client-appengine:2.1.1:2.1.2-SNAPSHOT +google-http-client-assembly:2.1.1:2.1.2-SNAPSHOT +google-http-client-findbugs:2.1.1:2.1.2-SNAPSHOT +google-http-client-gson:2.1.1:2.1.2-SNAPSHOT +google-http-client-jackson2:2.1.1:2.1.2-SNAPSHOT +google-http-client-protobuf:2.1.1:2.1.2-SNAPSHOT +google-http-client-test:2.1.1:2.1.2-SNAPSHOT +google-http-client-xml:2.1.1:2.1.2-SNAPSHOT From 93e1ee7f5e57fd33dde9dfa2f8eab74aca6693c6 Mon Sep 17 00:00:00 2001 From: Lawrence Qiu Date: Mon, 20 Jul 2026 15:33:15 +0000 Subject: [PATCH 09/11] feat(pqc): replace provider-specific PQC TLS setup with generic SslSocketConfigurator callback (#2167) Introduces SslSocketConfigurator interface and ConfigurableSSLSocketFactory wrapper. ConfigurableSSLSocketFactory wraps the active SSLSocketFactory, intercepts socket creation, and invokes the configurator callback, enabling client-level socket configuration (e.g. for Conscrypt or BouncyCastle). Includes JreNamedGroupsSslSocketConfigurator implementing reflective named groups configuration natively on JDK 20+. Removes obsolete wrapTrustManagers code and animal-sniffer dependencies from SslUtils. TAG=agy CONV=385b9ab5-874c-4c9a-b331-66dab51fef61 --- .../javanet/ConfigurableSSLSocketFactory.java | 92 ++++++ .../client/http/javanet/NetHttpTransport.java | 134 ++++++++- .../http/javanet/SslSocketConfigurator.java | 100 +++++++ .../com/google/api/client/util/SslUtils.java | 63 +++++ .../ConfigurableSSLSocketFactoryTest.java | 60 ++++ .../http/javanet/NetHttpTransportTest.java | 73 ++++- .../google/api/client/util/SslUtilsTest.java | 266 ++++++++++++++++++ .../google-http-client/reflect-config.json | 39 +++ 8 files changed, 815 insertions(+), 12 deletions(-) create mode 100644 google-http-client/src/main/java/com/google/api/client/http/javanet/ConfigurableSSLSocketFactory.java create mode 100644 google-http-client/src/main/java/com/google/api/client/http/javanet/SslSocketConfigurator.java create mode 100644 google-http-client/src/test/java/com/google/api/client/http/javanet/ConfigurableSSLSocketFactoryTest.java create mode 100644 google-http-client/src/test/java/com/google/api/client/util/SslUtilsTest.java diff --git a/google-http-client/src/main/java/com/google/api/client/http/javanet/ConfigurableSSLSocketFactory.java b/google-http-client/src/main/java/com/google/api/client/http/javanet/ConfigurableSSLSocketFactory.java new file mode 100644 index 000000000..971f4ebec --- /dev/null +++ b/google-http-client/src/main/java/com/google/api/client/http/javanet/ConfigurableSSLSocketFactory.java @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2026 Google Inc. + * + * 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 + * + * http://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.api.client.http.javanet; + +import java.io.IOException; +import java.net.InetAddress; +import java.net.Socket; +import javax.net.ssl.SSLSocket; +import javax.net.ssl.SSLSocketFactory; + +/** + * An {@link SSLSocketFactory} wrapper that intercepts all socket creation entrypoints (both default + * and bound socket creations) and applies the custom user-provided {@link SslSocketConfigurator} + * callback to the socket before returning it. + * + *

      This factory delegates all standard socket actions to the underlying default or custom {@link + * SSLSocketFactory} instance. Sockets are intercepted and cast to {@link SSLSocket} for callback + * execution. + * + * @since 2.1.2 + */ +final class ConfigurableSSLSocketFactory extends SSLSocketFactory { + private final SSLSocketFactory delegate; + private final SslSocketConfigurator configurator; + + ConfigurableSSLSocketFactory(SSLSocketFactory delegate, SslSocketConfigurator configurator) { + this.delegate = delegate; + this.configurator = configurator; + } + + private Socket configure(Socket socket) { + if (socket instanceof SSLSocket && configurator != null) { + configurator.configure((SSLSocket) socket); + } + return socket; + } + + @Override + public String[] getDefaultCipherSuites() { + return delegate.getDefaultCipherSuites(); + } + + @Override + public String[] getSupportedCipherSuites() { + return delegate.getSupportedCipherSuites(); + } + + @Override + public Socket createSocket() throws IOException { + return configure(delegate.createSocket()); + } + + @Override + public Socket createSocket(Socket s, String host, int port, boolean autoClose) + throws IOException { + return configure(delegate.createSocket(s, host, port, autoClose)); + } + + @Override + public Socket createSocket(String host, int port) throws IOException { + return configure(delegate.createSocket(host, port)); + } + + @Override + public Socket createSocket(String host, int port, InetAddress localHost, int localPort) + throws IOException { + return configure(delegate.createSocket(host, port, localHost, localPort)); + } + + @Override + public Socket createSocket(InetAddress host, int port) throws IOException { + return configure(delegate.createSocket(host, port)); + } + + @Override + public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort) + throws IOException { + return configure(delegate.createSocket(address, port, localAddress, localPort)); + } +} diff --git a/google-http-client/src/main/java/com/google/api/client/http/javanet/NetHttpTransport.java b/google-http-client/src/main/java/com/google/api/client/http/javanet/NetHttpTransport.java index 2a0ae6c1f..2f4ebbd83 100644 --- a/google-http-client/src/main/java/com/google/api/client/http/javanet/NetHttpTransport.java +++ b/google-http-client/src/main/java/com/google/api/client/http/javanet/NetHttpTransport.java @@ -28,12 +28,15 @@ import java.net.URL; import java.security.GeneralSecurityException; import java.security.KeyStore; +import java.security.Provider; import java.security.cert.CertificateFactory; import java.util.Arrays; import javax.net.ssl.HostnameVerifier; import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSocketFactory; +import javax.net.ssl.TrustManager; +import javax.net.ssl.TrustManagerFactory; /** * Thread-safe HTTP low-level transport based on the {@code java.net} package. @@ -84,7 +87,7 @@ private static Proxy defaultProxy() { private final ConnectionFactory connectionFactory; /** SSL socket factory or {@code null} for the default. */ - private final SSLSocketFactory sslSocketFactory; + final SSLSocketFactory sslSocketFactory; /** Host name verifier or {@code null} for the default. */ private final HostnameVerifier hostnameVerifier; @@ -189,6 +192,12 @@ public static final class Builder { /** SSL socket factory or {@code null} for the default. */ private SSLSocketFactory sslSocketFactory; + /** Security provider to use or {@code null} for default. */ + private Provider securityProvider; + + /** Custom SSLSocket configurator or {@code null} to disable callback configuration. */ + SslSocketConfigurator sslSocketConfigurator; + /** Host name verifier or {@code null} for the default. */ private HostnameVerifier hostnameVerifier; @@ -289,8 +298,9 @@ public Builder trustCertificatesFromStream(InputStream certificateStream) * @since 1.14 */ public Builder trustCertificates(KeyStore trustStore) throws GeneralSecurityException { - SSLContext sslContext = SslUtils.getTlsSslContext(); - SslUtils.initSslContext(sslContext, trustStore, SslUtils.getPkixTrustManagerFactory()); + SSLContext sslContext = SslUtils.getTlsSslContext(securityProvider); + SslUtils.initSslContext( + sslContext, trustStore, SslUtils.getPkixTrustManagerFactory(securityProvider)); return setSslSocketFactory(sslContext.getSocketFactory()); } @@ -313,14 +323,14 @@ public Builder trustCertificates( if (mtlsKeyStore != null && mtlsKeyStore.size() > 0) { this.isMtls = true; } - SSLContext sslContext = SslUtils.getTlsSslContext(); + SSLContext sslContext = SslUtils.getTlsSslContext(securityProvider); SslUtils.initSslContext( sslContext, trustStore, - SslUtils.getPkixTrustManagerFactory(), + SslUtils.getPkixTrustManagerFactory(securityProvider), mtlsKeyStore, mtlsKeyStorePassword, - SslUtils.getDefaultKeyManagerFactory()); + SslUtils.getDefaultKeyManagerFactory(securityProvider)); return setSslSocketFactory(sslContext.getSocketFactory()); } @@ -345,12 +355,69 @@ public SSLSocketFactory getSslSocketFactory() { return sslSocketFactory; } - /** Sets the SSL socket factory or {@code null} for the default. */ + /** + * Sets the SSL socket factory or {@code null} for the default. + * + *

      Note: If a custom {@link SslSocketConfigurator} is also provided, it will wrap and apply + * its configuration callback to all sockets created by this factory. + */ public Builder setSslSocketFactory(SSLSocketFactory sslSocketFactory) { this.sslSocketFactory = sslSocketFactory; return this; } + /** + * Sets the custom security provider or {@code null} to use the default JRE provider. + * + *

      When enabling Post-Quantum Cryptography (PQC) transport: + * + *

        + *
      • On JDK 8-19: A custom JCA provider (such as Conscrypt or BouncyCastle) must be + * configured via this method, in addition to configuring a custom {@link + * SslSocketConfigurator} callback to select the hybrid/PQC curves using provider-specific + * APIs. + *
      • On JDK 20-26: A custom provider (like Conscrypt) is recommended, but a custom {@link + * SslSocketConfigurator} invoking {@code SSLParameters.setNamedGroups(String[])} directly + * can be used natively without a custom JCA provider if standard JSSE supports the + * curves. + *
      • On JDK 27+: Neither a custom provider nor a configurator is required as PQC algorithms + * are negotiated natively by default. + *
      + * + * @param securityProvider provider to use + */ + public Builder setSecurityProvider(Provider securityProvider) { + this.securityProvider = securityProvider; + return this; + } + + /** + * Sets the custom {@link SslSocketConfigurator} callback to configure active SSLSockets. + * + *

      If both a custom {@link SSLSocketFactory} (via {@link + * #setSslSocketFactory(SSLSocketFactory)}) and a custom configurator are set, the configurator + * callback will be applied to all sockets created by the custom socket factory. If no custom + * factory is provided, the configurator will wrap and apply to sockets created by the default + * resolved socket factory. + * + *

      When enabling Post-Quantum Cryptography (PQC) transport: + * + *

        + *
      • On JDK 20-26: Callers can configure a custom {@link SslSocketConfigurator} that sets + * the named groups (such as {@code X25519MLKEM768}) directly on {@code SSLParameters}. + *
      • On JDK 8-19: Callers must provide a custom {@link SslSocketConfigurator} implementation + * to inspect the socket types and invoke provider-specific API extensions (e.g. Conscrypt + * JNI interfaces) to configure the curves. + *
      + * + * @param configurator the callback configurator + * @since 2.1.2 + */ + public Builder setSslSocketConfigurator(SslSocketConfigurator configurator) { + this.sslSocketConfigurator = configurator; + return this; + } + /** Returns the host name verifier or {@code null} for the default. */ public HostnameVerifier getHostnameVerifier() { return hostnameVerifier; @@ -362,14 +429,63 @@ public Builder setHostnameVerifier(HostnameVerifier hostnameVerifier) { return this; } + /** + * Resolves the {@link SSLSocketFactory} to be used by the transport. + * + *

      If a custom factory has been set via {@link #setSslSocketFactory(SSLSocketFactory)}, it + * will be returned. Otherwise, a default SSL socket factory will be constructed via {@link + * #createDefaultSslSocketFactory()}. + * + * @return the resolved {@link SSLSocketFactory} + */ + SSLSocketFactory resolveSslSocketFactory() { + if (securityProvider == null && sslSocketConfigurator == null) { + return sslSocketFactory; + } + SSLSocketFactory factory = + sslSocketFactory != null ? sslSocketFactory : createDefaultSslSocketFactory(); + if (sslSocketConfigurator != null) { + return new ConfigurableSSLSocketFactory(factory, sslSocketConfigurator); + } + return factory; + } + + /** + * Constructs a default {@link SSLSocketFactory} configured with the specified {@link Provider}. + * + *

      This method initializes an {@link SSLContext} and resolves its {@link TrustManagerFactory} + * using the same security provider (if provided), ensuring compatibility for TLS handshakes + * when using custom providers (such as Conscrypt). + * + * @return the initialized default {@link SSLSocketFactory} + */ + SSLSocketFactory createDefaultSslSocketFactory() { + try { + SSLContext sslContext = SslUtils.getTlsSslContext(securityProvider); + TrustManager[] trustManagers = null; + if (securityProvider != null) { + TrustManagerFactory tmf = SslUtils.getDefaultTrustManagerFactory(securityProvider); + tmf.init((KeyStore) null); + trustManagers = tmf.getTrustManagers(); + } + sslContext.init(null, trustManagers, null); + return sslContext.getSocketFactory(); + } catch (GeneralSecurityException e) { + // Halt execution because the SSLContext cannot be initialized with the requested + // configuration. + throw new IllegalStateException("Failed to initialize SSLSocketFactory.", e); + } + } + /** Returns a new instance of {@link NetHttpTransport} based on the options. */ public NetHttpTransport build() { if (System.getProperty(SHOULD_USE_PROXY_FLAG) != null) { setProxy(defaultProxy()); } + SSLSocketFactory resolvedFactory = resolveSslSocketFactory(); return this.proxy == null - ? new NetHttpTransport(connectionFactory, sslSocketFactory, hostnameVerifier, isMtls) - : new NetHttpTransport(this.proxy, sslSocketFactory, hostnameVerifier, isMtls); + ? new NetHttpTransport(connectionFactory, resolvedFactory, hostnameVerifier, isMtls) + : new NetHttpTransport(this.proxy, resolvedFactory, hostnameVerifier, isMtls); } } } diff --git a/google-http-client/src/main/java/com/google/api/client/http/javanet/SslSocketConfigurator.java b/google-http-client/src/main/java/com/google/api/client/http/javanet/SslSocketConfigurator.java new file mode 100644 index 000000000..0159ca315 --- /dev/null +++ b/google-http-client/src/main/java/com/google/api/client/http/javanet/SslSocketConfigurator.java @@ -0,0 +1,100 @@ +/* + * Copyright (c) 2026 Google Inc. + * + * 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 + * + * http://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.api.client.http.javanet; + +import javax.net.ssl.SSLSocket; + +/** + * A callback interface allowing users to programmatically configure active {@link SSLSocket} + * parameters (e.g., named groups, cipher suites, application protocols) before the TLS handshake + * starts. + * + *

      Exposing this hook allows users to customize advanced TLS capabilities that are not + * configurable via standard JVM system properties, or require custom security provider APIs (e.g., + * Conscrypt or BouncyCastle). Typical use cases include: + * + *

        + *
      • Enabling Post-Quantum Cryptography (PQC) hybrid curves (e.g., X25519MLKEM768). + *
      • Configuring Application-Layer Protocol Negotiation (ALPN) for HTTP/2. + *
      • Restricting cipher suites or protocol versions dynamically based on environment. + *
      + * + *

      JDK Version and Provider Compatibility Matrix for PQC

      + * + *
        + *
      • JDK 27+: PQC algorithms are supported natively by default. No custom configurator or + * security provider is required. + *
      • JDK 20-26: Callers can configure named groups natively using standard JRE JSSE APIs + * (via {@code SSLParameters.setNamedGroups(String[])}), as shown in the JDK 20+ example + * below. + *
      • JDK 8-19: The standard JRE does not expose APIs to set named groups. Callers must + * register a custom security provider (like Conscrypt JNI or BouncyCastle) and configure + * sockets using the provider-specific APIs demonstrated in the examples below. + *
      + * + *

      Conscrypt Configuration Example

      + * + *
      {@code
      + * builder.setSslSocketConfigurator(new SslSocketConfigurator() {
      + *   @Override
      + *   public void configure(SSLSocket socket) {
      + *     if (org.conscrypt.Conscrypt.isConscrypt(socket)) {
      + *       org.conscrypt.Conscrypt.setNamedGroups(socket, new String[] {"X25519MLKEM768", "X25519"});
      + *     }
      + *   }
      + * });
      + * }
      + * + *

      BouncyCastle Configuration Example

      + * + *
      {@code
      + * builder.setSslSocketConfigurator(new SslSocketConfigurator() {
      + *   @Override
      + *   public void configure(SSLSocket socket) {
      + *     if (socket instanceof org.bouncycastle.jsse.BCSSLSocket) {
      + *       org.bouncycastle.jsse.BCSSLSocket bcSocket = (org.bouncycastle.jsse.BCSSLSocket) socket;
      + *       org.bouncycastle.jsse.BCSSLParameters bcParams = bcSocket.getParameters();
      + *       bcParams.setNamedGroups(new String[] {"X25519MLKEM768", "X25519"});
      + *       bcSocket.setParameters(bcParams);
      + *     }
      + *   }
      + * });
      + * }
      + * + *

      JDK 20+ Standard JSSE Configuration Example

      + * + *

      Note: This example requires compilation and runtime environment running JDK 20+. + * + *

      {@code
      + * builder.setSslSocketConfigurator(new SslSocketConfigurator() {
      + *   @Override
      + *   public void configure(SSLSocket socket) {
      + *     javax.net.ssl.SSLParameters parameters = socket.getSSLParameters();
      + *     parameters.setNamedGroups(new String[] {"X25519MLKEM768", "X25519"});
      + *     socket.setSSLParameters(parameters);
      + *   }
      + * });
      + * }
      + * + * @since 2.1.2 + */ +public interface SslSocketConfigurator { + /** + * Configures the active TLS socket parameters before the handshake starts. + * + * @param sslSocket the newly created SSLSocket connection + */ + void configure(SSLSocket sslSocket); +} diff --git a/google-http-client/src/main/java/com/google/api/client/util/SslUtils.java b/google-http-client/src/main/java/com/google/api/client/util/SslUtils.java index a578c7383..c6963bbfb 100644 --- a/google-http-client/src/main/java/com/google/api/client/util/SslUtils.java +++ b/google-http-client/src/main/java/com/google/api/client/util/SslUtils.java @@ -18,6 +18,7 @@ import java.security.GeneralSecurityException; import java.security.KeyStore; import java.security.NoSuchAlgorithmException; +import java.security.Provider; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import javax.net.ssl.HostnameVerifier; @@ -54,6 +55,68 @@ public static SSLContext getTlsSslContext() throws NoSuchAlgorithmException { return SSLContext.getInstance("TLS"); } + /** + * Returns the SSL context for "TLS" algorithm using the specified provider. + * + *

      If a custom provider (e.g., Conscrypt) is configured, the context must be loaded from it to + * enable the provider's specific TLS parameters and curve groups (such as PQC). + * + * @param provider the security provider, or {@code null} to use the default JRE provider + * @since 2.1.2 + */ + public static SSLContext getTlsSslContext(Provider provider) throws NoSuchAlgorithmException { + return provider != null ? SSLContext.getInstance("TLS", provider) : getTlsSslContext(); + } + + /** + * Returns the default trust manager factory using the specified provider. + * + *

      Aligning the trust manager factory's provider with the SSLContext's provider is necessary to + * prevent handshake failures. For example, if Conscrypt is used for the SSLContext but the + * default SunJSSE TrustManager is used, TLS 1.3 handshakes will fail with "Unknown authType: + * GENERIC" because SunJSSE does not recognize Conscrypt's "GENERIC" authentication type string. + * + * @param provider the security provider, or {@code null} to use the default JRE provider + * @since 2.1.2 + */ + public static TrustManagerFactory getDefaultTrustManagerFactory(Provider provider) + throws NoSuchAlgorithmException { + return provider != null + ? TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm(), provider) + : getDefaultTrustManagerFactory(); + } + + /** + * Returns the PKIX trust manager factory using the specified provider. + * + *

      Aligning the trust manager factory's provider with the SSLContext's provider is necessary to + * prevent handshake failures. For example, if Conscrypt is used for the SSLContext but the + * default SunJSSE TrustManager is used, TLS 1.3 handshakes will fail with "Unknown authType: + * GENERIC" because SunJSSE does not recognize Conscrypt's "GENERIC" authentication type string. + * + * @param provider the security provider, or {@code null} to use the default JRE provider + * @since 2.1.2 + */ + public static TrustManagerFactory getPkixTrustManagerFactory(Provider provider) + throws NoSuchAlgorithmException { + return provider != null + ? TrustManagerFactory.getInstance("PKIX", provider) + : getPkixTrustManagerFactory(); + } + + /** + * Returns the default key manager factory using the specified provider. + * + * @param provider the security provider, or {@code null} to use the default JRE provider + * @since 2.1.2 + */ + public static KeyManagerFactory getDefaultKeyManagerFactory(Provider provider) + throws NoSuchAlgorithmException { + return provider != null + ? KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm(), provider) + : getDefaultKeyManagerFactory(); + } + /** * Returns the default trust manager factory. * diff --git a/google-http-client/src/test/java/com/google/api/client/http/javanet/ConfigurableSSLSocketFactoryTest.java b/google-http-client/src/test/java/com/google/api/client/http/javanet/ConfigurableSSLSocketFactoryTest.java new file mode 100644 index 000000000..48a894b43 --- /dev/null +++ b/google-http-client/src/test/java/com/google/api/client/http/javanet/ConfigurableSSLSocketFactoryTest.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2026 Google Inc. + * + * 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 + * + * http://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.api.client.http.javanet; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import java.io.IOException; +import java.net.Socket; +import java.util.concurrent.atomic.AtomicInteger; +import javax.net.ssl.SSLSocket; +import javax.net.ssl.SSLSocketFactory; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +@RunWith(JUnit4.class) +public class ConfigurableSSLSocketFactoryTest { + + @Test + public void testCreateSocketDelegatesAndConfigures() throws IOException { + SSLSocketFactory delegate = (SSLSocketFactory) SSLSocketFactory.getDefault(); + final AtomicInteger callbackCount = new AtomicInteger(0); + SslSocketConfigurator configurator = + new SslSocketConfigurator() { + @Override + public void configure(SSLSocket socket) { + callbackCount.incrementAndGet(); + } + }; + + ConfigurableSSLSocketFactory factory = new ConfigurableSSLSocketFactory(delegate, configurator); + + Socket result = factory.createSocket(); + assertTrue(result instanceof SSLSocket); + assertEquals(1, callbackCount.get()); + } + + @Test + public void testGetCipherSuitesDelegates() { + SSLSocketFactory delegate = (SSLSocketFactory) SSLSocketFactory.getDefault(); + ConfigurableSSLSocketFactory factory = new ConfigurableSSLSocketFactory(delegate, null); + + assertEquals(delegate.getDefaultCipherSuites().length, factory.getDefaultCipherSuites().length); + assertEquals( + delegate.getSupportedCipherSuites().length, factory.getSupportedCipherSuites().length); + } +} diff --git a/google-http-client/src/test/java/com/google/api/client/http/javanet/NetHttpTransportTest.java b/google-http-client/src/test/java/com/google/api/client/http/javanet/NetHttpTransportTest.java index 87c5337c6..0bb67255c 100644 --- a/google-http-client/src/test/java/com/google/api/client/http/javanet/NetHttpTransportTest.java +++ b/google-http-client/src/test/java/com/google/api/client/http/javanet/NetHttpTransportTest.java @@ -16,10 +16,13 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import com.google.api.client.http.GenericUrl; +import com.google.api.client.http.HttpResponse; import com.google.api.client.http.HttpTransport; import com.google.api.client.testing.http.HttpTesting; import com.google.api.client.testing.http.javanet.MockHttpURLConnection; @@ -36,8 +39,12 @@ import java.net.InetSocketAddress; import java.net.URL; import java.security.KeyStore; +import java.security.NoSuchAlgorithmException; +import java.security.Provider; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import javax.net.ssl.SSLSocket; +import javax.net.ssl.SSLSocketFactory; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; @@ -235,10 +242,70 @@ public void handle(HttpExchange httpExchange) throws IOException { HttpTransport transport = new NetHttpTransport(); GenericUrl testUrl = new GenericUrl("http://localhost/foo//bar"); testUrl.setPort(server.getPort()); - com.google.api.client.http.HttpResponse response = - transport.createRequestFactory().buildGetRequest(testUrl).execute(); - // disconnect should not wait to read the entire content + HttpResponse response = transport.createRequestFactory().buildGetRequest(testUrl).execute(); response.disconnect(); } } + + @Test + public void testBuilderDefaultSslSocketConfiguratorIsNull() { + NetHttpTransport.Builder builder = new NetHttpTransport.Builder(); + assertNull(builder.sslSocketConfigurator); + } + + @Test + public void testBuilderConfigureSslSocketConfigurator() { + SslSocketConfigurator customConfigurator = + new SslSocketConfigurator() { + @Override + public void configure(SSLSocket socket) {} + }; + NetHttpTransport.Builder builder = + new NetHttpTransport.Builder().setSslSocketConfigurator(customConfigurator); + assertEquals(customConfigurator, builder.sslSocketConfigurator); + } + + @Test + public void testResolveSslSocketFactoryWithDefault() { + NetHttpTransport.Builder builder = new NetHttpTransport.Builder(); + SSLSocketFactory factory = builder.resolveSslSocketFactory(); + assertNull(factory); + } + + @Test + public void testResolveSslSocketFactoryWithCustom() { + SslSocketConfigurator customConfigurator = + new SslSocketConfigurator() { + @Override + public void configure(SSLSocket socket) {} + }; + NetHttpTransport.Builder builder = + new NetHttpTransport.Builder().setSslSocketConfigurator(customConfigurator); + SSLSocketFactory factory = builder.resolveSslSocketFactory(); + assertTrue(factory instanceof ConfigurableSSLSocketFactory); + } + + @Test + public void testCreateDefaultSslSocketFactory() { + NetHttpTransport.Builder builder = new NetHttpTransport.Builder(); + SSLSocketFactory factory = builder.createDefaultSslSocketFactory(); + assertNotNull(factory); + } + + @Test + public void testCreateDefaultSslSocketFactory_invalidProviderFailsFast() { + Provider invalidProvider = + new Provider("MockInvalidProvider", 1.0, "For testing") { + private static final long serialVersionUID = 1L; + }; + NetHttpTransport.Builder builder = + new NetHttpTransport.Builder().setSecurityProvider(invalidProvider); + try { + builder.createDefaultSslSocketFactory(); + fail("Expected IllegalStateException"); + } catch (IllegalStateException e) { + assertEquals("Failed to initialize SSLSocketFactory.", e.getMessage()); + assertTrue(e.getCause() instanceof NoSuchAlgorithmException); + } + } } diff --git a/google-http-client/src/test/java/com/google/api/client/util/SslUtilsTest.java b/google-http-client/src/test/java/com/google/api/client/util/SslUtilsTest.java new file mode 100644 index 000000000..f0fd5a1fc --- /dev/null +++ b/google-http-client/src/test/java/com/google/api/client/util/SslUtilsTest.java @@ -0,0 +1,266 @@ +/* + * Copyright (c) 2026 Google Inc. + * + * 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 + * + * http://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.api.client.util; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +import java.io.IOException; +import java.net.InetAddress; +import java.net.Socket; +import java.security.KeyStore; +import java.security.Provider; +import java.security.SecureRandom; +import javax.net.ssl.KeyManager; +import javax.net.ssl.KeyManagerFactory; +import javax.net.ssl.KeyManagerFactorySpi; +import javax.net.ssl.ManagerFactoryParameters; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLContextSpi; +import javax.net.ssl.SSLEngine; +import javax.net.ssl.SSLServerSocketFactory; +import javax.net.ssl.SSLSessionContext; +import javax.net.ssl.SSLSocketFactory; +import javax.net.ssl.TrustManager; +import javax.net.ssl.TrustManagerFactory; +import javax.net.ssl.TrustManagerFactorySpi; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +/** Tests {@link SslUtils}. */ +@RunWith(JUnit4.class) +public class SslUtilsTest { + + private static final TrustManager MOCK_TRUST_MANAGER = new TrustManager() {}; + private static final KeyManager MOCK_KEY_MANAGER = new KeyManager() {}; + + private static final SSLSocketFactory MOCK_SSL_SOCKET_FACTORY = + new SSLSocketFactory() { + @Override + public String[] getDefaultCipherSuites() { + return new String[0]; + } + + @Override + public String[] getSupportedCipherSuites() { + return new String[0]; + } + + @Override + public Socket createSocket(Socket s, String host, int port, boolean autoClose) + throws IOException { + return null; + } + + @Override + public Socket createSocket(String host, int port) throws IOException { + return null; + } + + @Override + public Socket createSocket(String host, int port, InetAddress localHost, int localPort) + throws IOException { + return null; + } + + @Override + public Socket createSocket(InetAddress host, int port) throws IOException { + return null; + } + + @Override + public Socket createSocket( + InetAddress address, int port, InetAddress localAddress, int localPort) + throws IOException { + return null; + } + }; + + /** Mock SPI implementation for SSLContext. */ + public static class MockSslContextSpi extends SSLContextSpi { + @Override + protected void engineInit(KeyManager[] km, TrustManager[] tm, SecureRandom sr) {} + + @Override + protected SSLSocketFactory engineGetSocketFactory() { + return MOCK_SSL_SOCKET_FACTORY; + } + + @Override + protected SSLServerSocketFactory engineGetServerSocketFactory() { + return null; + } + + @Override + protected SSLEngine engineCreateSSLEngine() { + return null; + } + + @Override + protected SSLEngine engineCreateSSLEngine(String host, int port) { + return null; + } + + @Override + protected SSLSessionContext engineGetServerSessionContext() { + return null; + } + + @Override + protected SSLSessionContext engineGetClientSessionContext() { + return null; + } + } + + /** Mock SPI implementation for TrustManagerFactory. */ + public static class MockTrustManagerFactorySpi extends TrustManagerFactorySpi { + @Override + protected void engineInit(KeyStore ks) {} + + @Override + protected void engineInit(ManagerFactoryParameters mfp) {} + + @Override + protected TrustManager[] engineGetTrustManagers() { + return new TrustManager[] {MOCK_TRUST_MANAGER}; + } + } + + /** Mock SPI implementation for KeyManagerFactory. */ + public static class MockKeyManagerFactorySpi extends KeyManagerFactorySpi { + @Override + protected void engineInit(KeyStore ks, char[] password) {} + + @Override + protected void engineInit(ManagerFactoryParameters mfp) {} + + @Override + protected KeyManager[] engineGetKeyManagers() { + return new KeyManager[] {MOCK_KEY_MANAGER}; + } + } + + // A mock security provider used to verify that SslUtils correctly delegates context and factory + // initialization to the configured Provider instance. Using a mock provider avoids having to + // load platform-dependent native libraries (such as Conscrypt or OpenSSL) during unit testing. + private static final Provider mockProvider = + new Provider("MockProvider", 1.0, "For testing") { + private static final long serialVersionUID = 1L; + + { + put("SSLContext.TLS", MockSslContextSpi.class.getName()); + put( + "TrustManagerFactory." + TrustManagerFactory.getDefaultAlgorithm(), + MockTrustManagerFactorySpi.class.getName()); + put("TrustManagerFactory.PKIX", MockTrustManagerFactorySpi.class.getName()); + put( + "KeyManagerFactory." + KeyManagerFactory.getDefaultAlgorithm(), + MockKeyManagerFactorySpi.class.getName()); + } + }; + + @Test + public void testGetTlsSslContext() throws Exception { + SSLContext context = SslUtils.getTlsSslContext(); + assertNotNull(context); + assertEquals("TLS", context.getProtocol()); + } + + @Test + public void testGetTlsSslContext_withCustomProvider() throws Exception { + SSLContext context = SslUtils.getTlsSslContext(mockProvider); + assertNotNull(context); + assertEquals("TLS", context.getProtocol()); + assertEquals(mockProvider, context.getProvider()); + assertEquals(MOCK_SSL_SOCKET_FACTORY, context.getSocketFactory()); + } + + @Test + public void testGetDefaultTrustManagerFactory() throws Exception { + TrustManagerFactory tmf = SslUtils.getDefaultTrustManagerFactory(); + assertNotNull(tmf); + assertEquals(TrustManagerFactory.getDefaultAlgorithm(), tmf.getAlgorithm()); + } + + @Test + public void testGetDefaultTrustManagerFactory_withCustomProvider() throws Exception { + TrustManagerFactory tmf = SslUtils.getDefaultTrustManagerFactory(mockProvider); + assertNotNull(tmf); + assertEquals(TrustManagerFactory.getDefaultAlgorithm(), tmf.getAlgorithm()); + assertEquals(mockProvider, tmf.getProvider()); + + tmf.init((KeyStore) null); + TrustManager[] tms = tmf.getTrustManagers(); + assertEquals(1, tms.length); + assertEquals(MOCK_TRUST_MANAGER, tms[0]); + } + + @Test + public void testGetPkixTrustManagerFactory() throws Exception { + TrustManagerFactory tmf = SslUtils.getPkixTrustManagerFactory(); + assertNotNull(tmf); + assertEquals("PKIX", tmf.getAlgorithm()); + } + + @Test + public void testGetPkixTrustManagerFactory_withCustomProvider() throws Exception { + TrustManagerFactory tmf = SslUtils.getPkixTrustManagerFactory(mockProvider); + assertNotNull(tmf); + assertEquals("PKIX", tmf.getAlgorithm()); + assertEquals(mockProvider, tmf.getProvider()); + + tmf.init((KeyStore) null); + TrustManager[] tms = tmf.getTrustManagers(); + assertEquals(1, tms.length); + assertEquals(MOCK_TRUST_MANAGER, tms[0]); + } + + @Test + public void testGetDefaultKeyManagerFactory() throws Exception { + KeyManagerFactory kmf = SslUtils.getDefaultKeyManagerFactory(); + assertNotNull(kmf); + assertEquals(KeyManagerFactory.getDefaultAlgorithm(), kmf.getAlgorithm()); + } + + @Test + public void testGetDefaultKeyManagerFactory_withCustomProvider() throws Exception { + KeyManagerFactory kmf = SslUtils.getDefaultKeyManagerFactory(mockProvider); + assertNotNull(kmf); + assertEquals(KeyManagerFactory.getDefaultAlgorithm(), kmf.getAlgorithm()); + assertEquals(mockProvider, kmf.getProvider()); + + kmf.init((KeyStore) null, new char[0]); + KeyManager[] kms = kmf.getKeyManagers(); + assertEquals(1, kms.length); + assertEquals(MOCK_KEY_MANAGER, kms[0]); + } + + @Test + public void testGetPkixKeyManagerFactory() throws Exception { + KeyManagerFactory kmf = SslUtils.getPkixKeyManagerFactory(); + assertNotNull(kmf); + assertEquals("PKIX", kmf.getAlgorithm()); + } + + @Test + public void testInitSslContext() throws Exception { + SSLContext context = SslUtils.getTlsSslContext(); + TrustManagerFactory tmf = SslUtils.getDefaultTrustManagerFactory(); + tmf.init((KeyStore) null); + SSLContext initializedContext = SslUtils.initSslContext(context, null, tmf); + assertEquals(context, initializedContext); + } +} diff --git a/google-http-client/src/test/resources/META-INF/native-image/com.google.http-client/google-http-client/reflect-config.json b/google-http-client/src/test/resources/META-INF/native-image/com.google.http-client/google-http-client/reflect-config.json index 41fade5e2..638ad6b6d 100644 --- a/google-http-client/src/test/resources/META-INF/native-image/com.google.http-client/google-http-client/reflect-config.json +++ b/google-http-client/src/test/resources/META-INF/native-image/com.google.http-client/google-http-client/reflect-config.json @@ -240,5 +240,44 @@ "queryAllPublicConstructors": true, "queryAllDeclaredMethods": true, "allDeclaredFields": true + }, + { + "name": "com.google.api.client.util.SslUtilsTest$MockSslContextSpi", + "queryAllDeclaredConstructors": true, + "queryAllPublicConstructors": true, + "queryAllDeclaredMethods": true, + "allDeclaredFields": true, + "methods": [ + { + "name": "", + "parameterTypes": [] + } + ] + }, + { + "name": "com.google.api.client.util.SslUtilsTest$MockTrustManagerFactorySpi", + "queryAllDeclaredConstructors": true, + "queryAllPublicConstructors": true, + "queryAllDeclaredMethods": true, + "allDeclaredFields": true, + "methods": [ + { + "name": "", + "parameterTypes": [] + } + ] + }, + { + "name": "com.google.api.client.util.SslUtilsTest$MockKeyManagerFactorySpi", + "queryAllDeclaredConstructors": true, + "queryAllPublicConstructors": true, + "queryAllDeclaredMethods": true, + "allDeclaredFields": true, + "methods": [ + { + "name": "", + "parameterTypes": [] + } + ] } ] \ No newline at end of file From 327e0419de8200fbfbfb0da86ce90543c1c203c7 Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Mon, 20 Jul 2026 13:21:44 -0400 Subject: [PATCH 10/11] chore(main): release 2.2.0 (#2175) Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++ google-http-client-android-test/pom.xml | 6 ++-- google-http-client-android/pom.xml | 4 +-- google-http-client-apache-v2/pom.xml | 4 +-- google-http-client-apache-v5/pom.xml | 4 +-- google-http-client-appengine/pom.xml | 4 +-- google-http-client-assembly/pom.xml | 4 +-- google-http-client-bom/pom.xml | 24 +++++++-------- google-http-client-findbugs/pom.xml | 4 +-- google-http-client-gson/pom.xml | 4 +-- google-http-client-jackson2/pom.xml | 4 +-- google-http-client-protobuf/pom.xml | 4 +-- google-http-client-test/pom.xml | 4 +-- google-http-client-xml/pom.xml | 4 +-- google-http-client/pom.xml | 4 +-- pom.xml | 4 +-- .../dailymotion-simple-cmdline-sample/pom.xml | 2 +- versions.txt | 30 +++++++++---------- 18 files changed, 64 insertions(+), 57 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0ff7c3f8c..8f936ac9e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [2.2.0](https://github.com/googleapis/google-http-java-client/compare/v2.1.1...v2.2.0) (2026-07-20) + + +### Features + +* **pqc:** Replace provider-specific PQC TLS setup with generic SslSocketConfigurator callback ([#2167](https://github.com/googleapis/google-http-java-client/issues/2167)) ([93e1ee7](https://github.com/googleapis/google-http-java-client/commit/93e1ee7f5e57fd33dde9dfa2f8eab74aca6693c6)) + ## [2.1.1](https://github.com/googleapis/google-http-java-client/compare/v2.1.0...v2.1.1) (2026-06-29) diff --git a/google-http-client-android-test/pom.xml b/google-http-client-android-test/pom.xml index e4390b380..ac54254b4 100644 --- a/google-http-client-android-test/pom.xml +++ b/google-http-client-android-test/pom.xml @@ -4,7 +4,7 @@ google-http-client google-http-client-android-test Test project for google-http-client-android. - 2.1.2-SNAPSHOT + 2.2.0 apk @@ -53,7 +53,7 @@ com.google.http-client google-http-client-android - 2.1.2-SNAPSHOT + 2.2.0 android @@ -72,7 +72,7 @@ com.google.http-client google-http-client-test - 2.1.2-SNAPSHOT + 2.2.0 junit diff --git a/google-http-client-android/pom.xml b/google-http-client-android/pom.xml index c85ff0336..cc4fb684b 100644 --- a/google-http-client-android/pom.xml +++ b/google-http-client-android/pom.xml @@ -4,11 +4,11 @@ com.google.http-client google-http-client-parent - 2.1.2-SNAPSHOT + 2.2.0 ../pom.xml google-http-client-android - 2.1.2-SNAPSHOT + 2.2.0 Android Platform Extensions to the Google HTTP Client Library for Java. diff --git a/google-http-client-apache-v2/pom.xml b/google-http-client-apache-v2/pom.xml index 82a5d381e..4c7f86e27 100644 --- a/google-http-client-apache-v2/pom.xml +++ b/google-http-client-apache-v2/pom.xml @@ -4,11 +4,11 @@ com.google.http-client google-http-client-parent - 2.1.2-SNAPSHOT + 2.2.0 ../pom.xml google-http-client-apache-v2 - 2.1.2-SNAPSHOT + 2.2.0 Apache HTTP transport v2 for the Google HTTP Client Library for Java. diff --git a/google-http-client-apache-v5/pom.xml b/google-http-client-apache-v5/pom.xml index 58268e888..735fc131d 100644 --- a/google-http-client-apache-v5/pom.xml +++ b/google-http-client-apache-v5/pom.xml @@ -4,11 +4,11 @@ com.google.http-client google-http-client-parent - 2.1.2-SNAPSHOT + 2.2.0 ../pom.xml google-http-client-apache-v5 - 2.1.2-SNAPSHOT + 2.2.0 Apache HTTP transport v5 for the Google HTTP Client Library for Java. diff --git a/google-http-client-appengine/pom.xml b/google-http-client-appengine/pom.xml index 3e5bfa8a5..b5016aded 100644 --- a/google-http-client-appengine/pom.xml +++ b/google-http-client-appengine/pom.xml @@ -4,11 +4,11 @@ com.google.http-client google-http-client-parent - 2.1.2-SNAPSHOT + 2.2.0 ../pom.xml google-http-client-appengine - 2.1.2-SNAPSHOT + 2.2.0 Google App Engine extensions to the Google HTTP Client Library for Java. diff --git a/google-http-client-assembly/pom.xml b/google-http-client-assembly/pom.xml index 98607aa43..3b6e354e9 100644 --- a/google-http-client-assembly/pom.xml +++ b/google-http-client-assembly/pom.xml @@ -4,12 +4,12 @@ com.google.http-client google-http-client-parent - 2.1.2-SNAPSHOT + 2.2.0 ../pom.xml com.google.http-client google-http-client-assembly - 2.1.2-SNAPSHOT + 2.2.0 pom Assembly for the Google HTTP Client Library for Java diff --git a/google-http-client-bom/pom.xml b/google-http-client-bom/pom.xml index e1c93ad53..bae3e0f02 100644 --- a/google-http-client-bom/pom.xml +++ b/google-http-client-bom/pom.xml @@ -3,7 +3,7 @@ 4.0.0 com.google.http-client google-http-client-bom - 2.1.2-SNAPSHOT + 2.2.0 pom Google HTTP Client Library for Java BOM @@ -63,57 +63,57 @@ com.google.http-client google-http-client - 2.1.2-SNAPSHOT + 2.2.0 com.google.http-client google-http-client-android - 2.1.2-SNAPSHOT + 2.2.0 com.google.http-client google-http-client-apache-v2 - 2.1.2-SNAPSHOT + 2.2.0 com.google.http-client google-http-client-apache-v5 - 2.1.2-SNAPSHOT + 2.2.0 com.google.http-client google-http-client-appengine - 2.1.2-SNAPSHOT + 2.2.0 com.google.http-client google-http-client-findbugs - 2.1.2-SNAPSHOT + 2.2.0 com.google.http-client google-http-client-gson - 2.1.2-SNAPSHOT + 2.2.0 com.google.http-client google-http-client-jackson2 - 2.1.2-SNAPSHOT + 2.2.0 com.google.http-client google-http-client-protobuf - 2.1.2-SNAPSHOT + 2.2.0 com.google.http-client google-http-client-test - 2.1.2-SNAPSHOT + 2.2.0 com.google.http-client google-http-client-xml - 2.1.2-SNAPSHOT + 2.2.0 diff --git a/google-http-client-findbugs/pom.xml b/google-http-client-findbugs/pom.xml index e394c1218..e8b89445e 100644 --- a/google-http-client-findbugs/pom.xml +++ b/google-http-client-findbugs/pom.xml @@ -4,11 +4,11 @@ com.google.http-client google-http-client-parent - 2.1.2-SNAPSHOT + 2.2.0 ../pom.xml google-http-client-findbugs - 2.1.2-SNAPSHOT + 2.2.0 Google APIs Client Library Findbugs custom plugin. diff --git a/google-http-client-gson/pom.xml b/google-http-client-gson/pom.xml index 67e74485f..eb2df666a 100644 --- a/google-http-client-gson/pom.xml +++ b/google-http-client-gson/pom.xml @@ -4,11 +4,11 @@ com.google.http-client google-http-client-parent - 2.1.2-SNAPSHOT + 2.2.0 ../pom.xml google-http-client-gson - 2.1.2-SNAPSHOT + 2.2.0 GSON extensions to the Google HTTP Client Library for Java. diff --git a/google-http-client-jackson2/pom.xml b/google-http-client-jackson2/pom.xml index a934ca402..3030e0a4b 100644 --- a/google-http-client-jackson2/pom.xml +++ b/google-http-client-jackson2/pom.xml @@ -4,11 +4,11 @@ com.google.http-client google-http-client-parent - 2.1.2-SNAPSHOT + 2.2.0 ../pom.xml google-http-client-jackson2 - 2.1.2-SNAPSHOT + 2.2.0 Jackson 2 extensions to the Google HTTP Client Library for Java. diff --git a/google-http-client-protobuf/pom.xml b/google-http-client-protobuf/pom.xml index 402f0b804..c89f56713 100644 --- a/google-http-client-protobuf/pom.xml +++ b/google-http-client-protobuf/pom.xml @@ -4,11 +4,11 @@ com.google.http-client google-http-client-parent - 2.1.2-SNAPSHOT + 2.2.0 ../pom.xml google-http-client-protobuf - 2.1.2-SNAPSHOT + 2.2.0 Protocol Buffer extensions to the Google HTTP Client Library for Java. diff --git a/google-http-client-test/pom.xml b/google-http-client-test/pom.xml index cc3ec4a8d..1a16d60bc 100644 --- a/google-http-client-test/pom.xml +++ b/google-http-client-test/pom.xml @@ -4,11 +4,11 @@ com.google.http-client google-http-client-parent - 2.1.2-SNAPSHOT + 2.2.0 ../pom.xml google-http-client-test - 2.1.2-SNAPSHOT + 2.2.0 Shared classes used for testing of artifacts in the Google HTTP Client Library for Java. diff --git a/google-http-client-xml/pom.xml b/google-http-client-xml/pom.xml index fe87d10db..abb56facf 100644 --- a/google-http-client-xml/pom.xml +++ b/google-http-client-xml/pom.xml @@ -4,11 +4,11 @@ com.google.http-client google-http-client-parent - 2.1.2-SNAPSHOT + 2.2.0 ../pom.xml google-http-client-xml - 2.1.2-SNAPSHOT + 2.2.0 XML extensions to the Google HTTP Client Library for Java. diff --git a/google-http-client/pom.xml b/google-http-client/pom.xml index 16a8dd127..afd84a540 100644 --- a/google-http-client/pom.xml +++ b/google-http-client/pom.xml @@ -4,11 +4,11 @@ com.google.http-client google-http-client-parent - 2.1.2-SNAPSHOT + 2.2.0 ../pom.xml google-http-client - 2.1.2-SNAPSHOT + 2.2.0 Google HTTP Client Library for Java Google HTTP Client Library for Java. Functionality that works on all supported Java platforms, diff --git a/pom.xml b/pom.xml index 4155d00a5..3a8f3645c 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 com.google.http-client google-http-client-parent - 2.1.2-SNAPSHOT + 2.2.0 pom Parent for the Google HTTP Client Library for Java Google HTTP Client Library for Java @@ -558,7 +558,7 @@ - google-api-java-client/google-api-client-assembly/android-properties (make the filenames match the version here) - Internally, update the default features.json file --> - 2.1.2-SNAPSHOT + 2.2.0 2.0.32 UTF-8 3.0.2 diff --git a/samples/dailymotion-simple-cmdline-sample/pom.xml b/samples/dailymotion-simple-cmdline-sample/pom.xml index 5845e416f..1dddd23a8 100644 --- a/samples/dailymotion-simple-cmdline-sample/pom.xml +++ b/samples/dailymotion-simple-cmdline-sample/pom.xml @@ -4,7 +4,7 @@ com.google.http-client google-http-client-parent - 2.1.2-SNAPSHOT + 2.2.0 ../../pom.xml dailymotion-simple-cmdline-sample diff --git a/versions.txt b/versions.txt index 5f02dcb6c..aa96b52b5 100644 --- a/versions.txt +++ b/versions.txt @@ -1,18 +1,18 @@ # Format: # module:released-version:current-version -google-http-client:2.1.1:2.1.2-SNAPSHOT -google-http-client-bom:2.1.1:2.1.2-SNAPSHOT -google-http-client-parent:2.1.1:2.1.2-SNAPSHOT -google-http-client-android:2.1.1:2.1.2-SNAPSHOT -google-http-client-android-test:2.1.1:2.1.2-SNAPSHOT -google-http-client-apache-v2:2.1.1:2.1.2-SNAPSHOT -google-http-client-apache-v5:2.1.1:2.1.2-SNAPSHOT -google-http-client-appengine:2.1.1:2.1.2-SNAPSHOT -google-http-client-assembly:2.1.1:2.1.2-SNAPSHOT -google-http-client-findbugs:2.1.1:2.1.2-SNAPSHOT -google-http-client-gson:2.1.1:2.1.2-SNAPSHOT -google-http-client-jackson2:2.1.1:2.1.2-SNAPSHOT -google-http-client-protobuf:2.1.1:2.1.2-SNAPSHOT -google-http-client-test:2.1.1:2.1.2-SNAPSHOT -google-http-client-xml:2.1.1:2.1.2-SNAPSHOT +google-http-client:2.2.0:2.2.0 +google-http-client-bom:2.2.0:2.2.0 +google-http-client-parent:2.2.0:2.2.0 +google-http-client-android:2.2.0:2.2.0 +google-http-client-android-test:2.2.0:2.2.0 +google-http-client-apache-v2:2.2.0:2.2.0 +google-http-client-apache-v5:2.2.0:2.2.0 +google-http-client-appengine:2.2.0:2.2.0 +google-http-client-assembly:2.2.0:2.2.0 +google-http-client-findbugs:2.2.0:2.2.0 +google-http-client-gson:2.2.0:2.2.0 +google-http-client-jackson2:2.2.0:2.2.0 +google-http-client-protobuf:2.2.0:2.2.0 +google-http-client-test:2.2.0:2.2.0 +google-http-client-xml:2.2.0:2.2.0 From 95fac312dd743a94fb28532ef8a50d374e6481ad Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Mon, 20 Jul 2026 13:49:22 -0400 Subject: [PATCH 11/11] chore(main): release 2.2.1-SNAPSHOT (#2176) Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> --- google-http-client-android-test/pom.xml | 6 ++-- google-http-client-android/pom.xml | 4 +-- google-http-client-apache-v2/pom.xml | 4 +-- google-http-client-apache-v5/pom.xml | 4 +-- google-http-client-appengine/pom.xml | 4 +-- google-http-client-assembly/pom.xml | 4 +-- google-http-client-bom/pom.xml | 24 +++++++-------- google-http-client-findbugs/pom.xml | 4 +-- google-http-client-gson/pom.xml | 4 +-- google-http-client-jackson2/pom.xml | 4 +-- google-http-client-protobuf/pom.xml | 4 +-- google-http-client-test/pom.xml | 4 +-- google-http-client-xml/pom.xml | 4 +-- google-http-client/pom.xml | 4 +-- pom.xml | 4 +-- .../dailymotion-simple-cmdline-sample/pom.xml | 2 +- versions.txt | 30 +++++++++---------- 17 files changed, 57 insertions(+), 57 deletions(-) diff --git a/google-http-client-android-test/pom.xml b/google-http-client-android-test/pom.xml index ac54254b4..720a06ac3 100644 --- a/google-http-client-android-test/pom.xml +++ b/google-http-client-android-test/pom.xml @@ -4,7 +4,7 @@ google-http-client google-http-client-android-test Test project for google-http-client-android. - 2.2.0 + 2.2.1-SNAPSHOT apk @@ -53,7 +53,7 @@ com.google.http-client google-http-client-android - 2.2.0 + 2.2.1-SNAPSHOT android @@ -72,7 +72,7 @@ com.google.http-client google-http-client-test - 2.2.0 + 2.2.1-SNAPSHOT junit diff --git a/google-http-client-android/pom.xml b/google-http-client-android/pom.xml index cc4fb684b..17ee5aff0 100644 --- a/google-http-client-android/pom.xml +++ b/google-http-client-android/pom.xml @@ -4,11 +4,11 @@ com.google.http-client google-http-client-parent - 2.2.0 + 2.2.1-SNAPSHOT ../pom.xml google-http-client-android - 2.2.0 + 2.2.1-SNAPSHOT Android Platform Extensions to the Google HTTP Client Library for Java. diff --git a/google-http-client-apache-v2/pom.xml b/google-http-client-apache-v2/pom.xml index 4c7f86e27..219efdf22 100644 --- a/google-http-client-apache-v2/pom.xml +++ b/google-http-client-apache-v2/pom.xml @@ -4,11 +4,11 @@ com.google.http-client google-http-client-parent - 2.2.0 + 2.2.1-SNAPSHOT ../pom.xml google-http-client-apache-v2 - 2.2.0 + 2.2.1-SNAPSHOT Apache HTTP transport v2 for the Google HTTP Client Library for Java. diff --git a/google-http-client-apache-v5/pom.xml b/google-http-client-apache-v5/pom.xml index 735fc131d..05e6aac0b 100644 --- a/google-http-client-apache-v5/pom.xml +++ b/google-http-client-apache-v5/pom.xml @@ -4,11 +4,11 @@ com.google.http-client google-http-client-parent - 2.2.0 + 2.2.1-SNAPSHOT ../pom.xml google-http-client-apache-v5 - 2.2.0 + 2.2.1-SNAPSHOT Apache HTTP transport v5 for the Google HTTP Client Library for Java. diff --git a/google-http-client-appengine/pom.xml b/google-http-client-appengine/pom.xml index b5016aded..effc3b4a8 100644 --- a/google-http-client-appengine/pom.xml +++ b/google-http-client-appengine/pom.xml @@ -4,11 +4,11 @@ com.google.http-client google-http-client-parent - 2.2.0 + 2.2.1-SNAPSHOT ../pom.xml google-http-client-appengine - 2.2.0 + 2.2.1-SNAPSHOT Google App Engine extensions to the Google HTTP Client Library for Java. diff --git a/google-http-client-assembly/pom.xml b/google-http-client-assembly/pom.xml index 3b6e354e9..4256a67c1 100644 --- a/google-http-client-assembly/pom.xml +++ b/google-http-client-assembly/pom.xml @@ -4,12 +4,12 @@ com.google.http-client google-http-client-parent - 2.2.0 + 2.2.1-SNAPSHOT ../pom.xml com.google.http-client google-http-client-assembly - 2.2.0 + 2.2.1-SNAPSHOT pom Assembly for the Google HTTP Client Library for Java diff --git a/google-http-client-bom/pom.xml b/google-http-client-bom/pom.xml index bae3e0f02..fe0957e78 100644 --- a/google-http-client-bom/pom.xml +++ b/google-http-client-bom/pom.xml @@ -3,7 +3,7 @@ 4.0.0 com.google.http-client google-http-client-bom - 2.2.0 + 2.2.1-SNAPSHOT pom Google HTTP Client Library for Java BOM @@ -63,57 +63,57 @@ com.google.http-client google-http-client - 2.2.0 + 2.2.1-SNAPSHOT com.google.http-client google-http-client-android - 2.2.0 + 2.2.1-SNAPSHOT com.google.http-client google-http-client-apache-v2 - 2.2.0 + 2.2.1-SNAPSHOT com.google.http-client google-http-client-apache-v5 - 2.2.0 + 2.2.1-SNAPSHOT com.google.http-client google-http-client-appengine - 2.2.0 + 2.2.1-SNAPSHOT com.google.http-client google-http-client-findbugs - 2.2.0 + 2.2.1-SNAPSHOT com.google.http-client google-http-client-gson - 2.2.0 + 2.2.1-SNAPSHOT com.google.http-client google-http-client-jackson2 - 2.2.0 + 2.2.1-SNAPSHOT com.google.http-client google-http-client-protobuf - 2.2.0 + 2.2.1-SNAPSHOT com.google.http-client google-http-client-test - 2.2.0 + 2.2.1-SNAPSHOT com.google.http-client google-http-client-xml - 2.2.0 + 2.2.1-SNAPSHOT diff --git a/google-http-client-findbugs/pom.xml b/google-http-client-findbugs/pom.xml index e8b89445e..456855a85 100644 --- a/google-http-client-findbugs/pom.xml +++ b/google-http-client-findbugs/pom.xml @@ -4,11 +4,11 @@ com.google.http-client google-http-client-parent - 2.2.0 + 2.2.1-SNAPSHOT ../pom.xml google-http-client-findbugs - 2.2.0 + 2.2.1-SNAPSHOT Google APIs Client Library Findbugs custom plugin. diff --git a/google-http-client-gson/pom.xml b/google-http-client-gson/pom.xml index eb2df666a..d21f00989 100644 --- a/google-http-client-gson/pom.xml +++ b/google-http-client-gson/pom.xml @@ -4,11 +4,11 @@ com.google.http-client google-http-client-parent - 2.2.0 + 2.2.1-SNAPSHOT ../pom.xml google-http-client-gson - 2.2.0 + 2.2.1-SNAPSHOT GSON extensions to the Google HTTP Client Library for Java. diff --git a/google-http-client-jackson2/pom.xml b/google-http-client-jackson2/pom.xml index 3030e0a4b..bd9e18ecd 100644 --- a/google-http-client-jackson2/pom.xml +++ b/google-http-client-jackson2/pom.xml @@ -4,11 +4,11 @@ com.google.http-client google-http-client-parent - 2.2.0 + 2.2.1-SNAPSHOT ../pom.xml google-http-client-jackson2 - 2.2.0 + 2.2.1-SNAPSHOT Jackson 2 extensions to the Google HTTP Client Library for Java. diff --git a/google-http-client-protobuf/pom.xml b/google-http-client-protobuf/pom.xml index c89f56713..4ee5d4bda 100644 --- a/google-http-client-protobuf/pom.xml +++ b/google-http-client-protobuf/pom.xml @@ -4,11 +4,11 @@ com.google.http-client google-http-client-parent - 2.2.0 + 2.2.1-SNAPSHOT ../pom.xml google-http-client-protobuf - 2.2.0 + 2.2.1-SNAPSHOT Protocol Buffer extensions to the Google HTTP Client Library for Java. diff --git a/google-http-client-test/pom.xml b/google-http-client-test/pom.xml index 1a16d60bc..b5359ba59 100644 --- a/google-http-client-test/pom.xml +++ b/google-http-client-test/pom.xml @@ -4,11 +4,11 @@ com.google.http-client google-http-client-parent - 2.2.0 + 2.2.1-SNAPSHOT ../pom.xml google-http-client-test - 2.2.0 + 2.2.1-SNAPSHOT Shared classes used for testing of artifacts in the Google HTTP Client Library for Java. diff --git a/google-http-client-xml/pom.xml b/google-http-client-xml/pom.xml index abb56facf..50330084f 100644 --- a/google-http-client-xml/pom.xml +++ b/google-http-client-xml/pom.xml @@ -4,11 +4,11 @@ com.google.http-client google-http-client-parent - 2.2.0 + 2.2.1-SNAPSHOT ../pom.xml google-http-client-xml - 2.2.0 + 2.2.1-SNAPSHOT XML extensions to the Google HTTP Client Library for Java. diff --git a/google-http-client/pom.xml b/google-http-client/pom.xml index afd84a540..5252342a4 100644 --- a/google-http-client/pom.xml +++ b/google-http-client/pom.xml @@ -4,11 +4,11 @@ com.google.http-client google-http-client-parent - 2.2.0 + 2.2.1-SNAPSHOT ../pom.xml google-http-client - 2.2.0 + 2.2.1-SNAPSHOT Google HTTP Client Library for Java Google HTTP Client Library for Java. Functionality that works on all supported Java platforms, diff --git a/pom.xml b/pom.xml index 3a8f3645c..14941b440 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 com.google.http-client google-http-client-parent - 2.2.0 + 2.2.1-SNAPSHOT pom Parent for the Google HTTP Client Library for Java Google HTTP Client Library for Java @@ -558,7 +558,7 @@ - google-api-java-client/google-api-client-assembly/android-properties (make the filenames match the version here) - Internally, update the default features.json file --> - 2.2.0 + 2.2.1-SNAPSHOT 2.0.32 UTF-8 3.0.2 diff --git a/samples/dailymotion-simple-cmdline-sample/pom.xml b/samples/dailymotion-simple-cmdline-sample/pom.xml index 1dddd23a8..82c8e0f06 100644 --- a/samples/dailymotion-simple-cmdline-sample/pom.xml +++ b/samples/dailymotion-simple-cmdline-sample/pom.xml @@ -4,7 +4,7 @@ com.google.http-client google-http-client-parent - 2.2.0 + 2.2.1-SNAPSHOT ../../pom.xml dailymotion-simple-cmdline-sample diff --git a/versions.txt b/versions.txt index aa96b52b5..ce989286a 100644 --- a/versions.txt +++ b/versions.txt @@ -1,18 +1,18 @@ # Format: # module:released-version:current-version -google-http-client:2.2.0:2.2.0 -google-http-client-bom:2.2.0:2.2.0 -google-http-client-parent:2.2.0:2.2.0 -google-http-client-android:2.2.0:2.2.0 -google-http-client-android-test:2.2.0:2.2.0 -google-http-client-apache-v2:2.2.0:2.2.0 -google-http-client-apache-v5:2.2.0:2.2.0 -google-http-client-appengine:2.2.0:2.2.0 -google-http-client-assembly:2.2.0:2.2.0 -google-http-client-findbugs:2.2.0:2.2.0 -google-http-client-gson:2.2.0:2.2.0 -google-http-client-jackson2:2.2.0:2.2.0 -google-http-client-protobuf:2.2.0:2.2.0 -google-http-client-test:2.2.0:2.2.0 -google-http-client-xml:2.2.0:2.2.0 +google-http-client:2.2.0:2.2.1-SNAPSHOT +google-http-client-bom:2.2.0:2.2.1-SNAPSHOT +google-http-client-parent:2.2.0:2.2.1-SNAPSHOT +google-http-client-android:2.2.0:2.2.1-SNAPSHOT +google-http-client-android-test:2.2.0:2.2.1-SNAPSHOT +google-http-client-apache-v2:2.2.0:2.2.1-SNAPSHOT +google-http-client-apache-v5:2.2.0:2.2.1-SNAPSHOT +google-http-client-appengine:2.2.0:2.2.1-SNAPSHOT +google-http-client-assembly:2.2.0:2.2.1-SNAPSHOT +google-http-client-findbugs:2.2.0:2.2.1-SNAPSHOT +google-http-client-gson:2.2.0:2.2.1-SNAPSHOT +google-http-client-jackson2:2.2.0:2.2.1-SNAPSHOT +google-http-client-protobuf:2.2.0:2.2.1-SNAPSHOT +google-http-client-test:2.2.0:2.2.1-SNAPSHOT +google-http-client-xml:2.2.0:2.2.1-SNAPSHOT