From 5172e33637c5cf9e3534b6aa63665a3e26f659a2 Mon Sep 17 00:00:00 2001
From: "release-please[bot]"
<55107282+release-please[bot]@users.noreply.github.com>
Date: Thu, 16 May 2024 19:14:18 +0000
Subject: [PATCH 01/52] chore(main): release 1.44.3-SNAPSHOT (#1943)
:robot: I have created a release *beep* *boop*
---
### Updating meta-information for bleeding-edge SNAPSHOT release.
---
This PR was generated with [Release Please](https://togithub.com/googleapis/release-please). See [documentation](https://togithub.com/googleapis/release-please#release-please).
---
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-appengine/pom.xml | 4 +--
google-http-client-assembly/pom.xml | 4 +--
google-http-client-bom/pom.xml | 22 +++++++--------
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 | 28 +++++++++----------
16 files changed, 53 insertions(+), 53 deletions(-)
diff --git a/google-http-client-android-test/pom.xml b/google-http-client-android-test/pom.xml
index 372af1f53..500725541 100644
--- a/google-http-client-android-test/pom.xml
+++ b/google-http-client-android-test/pom.xml
@@ -4,7 +4,7 @@
google-http-clientgoogle-http-client-android-testTest project for google-http-client-android.
- 1.44.2
+ 1.44.3-SNAPSHOTapk
@@ -53,7 +53,7 @@
com.google.http-clientgoogle-http-client-android
- 1.44.2
+ 1.44.3-SNAPSHOTandroid
@@ -72,7 +72,7 @@
com.google.http-clientgoogle-http-client-test
- 1.44.2
+ 1.44.3-SNAPSHOTjunit
diff --git a/google-http-client-android/pom.xml b/google-http-client-android/pom.xml
index fadc64cb6..bedac6c25 100644
--- a/google-http-client-android/pom.xml
+++ b/google-http-client-android/pom.xml
@@ -4,11 +4,11 @@
com.google.http-clientgoogle-http-client-parent
- 1.44.2
+ 1.44.3-SNAPSHOT../pom.xmlgoogle-http-client-android
- 1.44.2
+ 1.44.3-SNAPSHOTAndroid 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 55676873b..4541ae527 100644
--- a/google-http-client-apache-v2/pom.xml
+++ b/google-http-client-apache-v2/pom.xml
@@ -4,11 +4,11 @@
com.google.http-clientgoogle-http-client-parent
- 1.44.2
+ 1.44.3-SNAPSHOT../pom.xmlgoogle-http-client-apache-v2
- 1.44.2
+ 1.44.3-SNAPSHOTApache HTTP transport v2 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 20ebf8f84..a61580b85 100644
--- a/google-http-client-appengine/pom.xml
+++ b/google-http-client-appengine/pom.xml
@@ -4,11 +4,11 @@
com.google.http-clientgoogle-http-client-parent
- 1.44.2
+ 1.44.3-SNAPSHOT../pom.xmlgoogle-http-client-appengine
- 1.44.2
+ 1.44.3-SNAPSHOTGoogle 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 f2cc29862..3f82074e3 100644
--- a/google-http-client-assembly/pom.xml
+++ b/google-http-client-assembly/pom.xml
@@ -4,12 +4,12 @@
com.google.http-clientgoogle-http-client-parent
- 1.44.2
+ 1.44.3-SNAPSHOT../pom.xmlcom.google.http-clientgoogle-http-client-assembly
- 1.44.2
+ 1.44.3-SNAPSHOTpomAssembly 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 92ba7375c..9e9075bb7 100644
--- a/google-http-client-bom/pom.xml
+++ b/google-http-client-bom/pom.xml
@@ -3,7 +3,7 @@
4.0.0com.google.http-clientgoogle-http-client-bom
- 1.44.2
+ 1.44.3-SNAPSHOTpomGoogle HTTP Client Library for Java BOM
@@ -63,52 +63,52 @@
com.google.http-clientgoogle-http-client
- 1.44.2
+ 1.44.3-SNAPSHOTcom.google.http-clientgoogle-http-client-android
- 1.44.2
+ 1.44.3-SNAPSHOTcom.google.http-clientgoogle-http-client-apache-v2
- 1.44.2
+ 1.44.3-SNAPSHOTcom.google.http-clientgoogle-http-client-appengine
- 1.44.2
+ 1.44.3-SNAPSHOTcom.google.http-clientgoogle-http-client-findbugs
- 1.44.2
+ 1.44.3-SNAPSHOTcom.google.http-clientgoogle-http-client-gson
- 1.44.2
+ 1.44.3-SNAPSHOTcom.google.http-clientgoogle-http-client-jackson2
- 1.44.2
+ 1.44.3-SNAPSHOTcom.google.http-clientgoogle-http-client-protobuf
- 1.44.2
+ 1.44.3-SNAPSHOTcom.google.http-clientgoogle-http-client-test
- 1.44.2
+ 1.44.3-SNAPSHOTcom.google.http-clientgoogle-http-client-xml
- 1.44.2
+ 1.44.3-SNAPSHOT
diff --git a/google-http-client-findbugs/pom.xml b/google-http-client-findbugs/pom.xml
index 320dd3d38..812f9f8de 100644
--- a/google-http-client-findbugs/pom.xml
+++ b/google-http-client-findbugs/pom.xml
@@ -4,11 +4,11 @@
com.google.http-clientgoogle-http-client-parent
- 1.44.2
+ 1.44.3-SNAPSHOT../pom.xmlgoogle-http-client-findbugs
- 1.44.2
+ 1.44.3-SNAPSHOTGoogle APIs Client Library Findbugs custom plugin.
diff --git a/google-http-client-gson/pom.xml b/google-http-client-gson/pom.xml
index 9aec75be0..2db8272b3 100644
--- a/google-http-client-gson/pom.xml
+++ b/google-http-client-gson/pom.xml
@@ -4,11 +4,11 @@
com.google.http-clientgoogle-http-client-parent
- 1.44.2
+ 1.44.3-SNAPSHOT../pom.xmlgoogle-http-client-gson
- 1.44.2
+ 1.44.3-SNAPSHOTGSON 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 62b449911..def789878 100644
--- a/google-http-client-jackson2/pom.xml
+++ b/google-http-client-jackson2/pom.xml
@@ -4,11 +4,11 @@
com.google.http-clientgoogle-http-client-parent
- 1.44.2
+ 1.44.3-SNAPSHOT../pom.xmlgoogle-http-client-jackson2
- 1.44.2
+ 1.44.3-SNAPSHOTJackson 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 01bba38f4..f5b9a87b8 100644
--- a/google-http-client-protobuf/pom.xml
+++ b/google-http-client-protobuf/pom.xml
@@ -4,11 +4,11 @@
com.google.http-clientgoogle-http-client-parent
- 1.44.2
+ 1.44.3-SNAPSHOT../pom.xmlgoogle-http-client-protobuf
- 1.44.2
+ 1.44.3-SNAPSHOTProtocol 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 1fc9bd0db..7c0feeb27 100644
--- a/google-http-client-test/pom.xml
+++ b/google-http-client-test/pom.xml
@@ -4,11 +4,11 @@
com.google.http-clientgoogle-http-client-parent
- 1.44.2
+ 1.44.3-SNAPSHOT../pom.xmlgoogle-http-client-test
- 1.44.2
+ 1.44.3-SNAPSHOTShared 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 b5b5358c5..7851bbab1 100644
--- a/google-http-client-xml/pom.xml
+++ b/google-http-client-xml/pom.xml
@@ -4,11 +4,11 @@
com.google.http-clientgoogle-http-client-parent
- 1.44.2
+ 1.44.3-SNAPSHOT../pom.xmlgoogle-http-client-xml
- 1.44.2
+ 1.44.3-SNAPSHOTXML extensions to the Google HTTP Client Library for Java.
diff --git a/google-http-client/pom.xml b/google-http-client/pom.xml
index f5995ab1d..e787ec4ec 100644
--- a/google-http-client/pom.xml
+++ b/google-http-client/pom.xml
@@ -4,11 +4,11 @@
com.google.http-clientgoogle-http-client-parent
- 1.44.2
+ 1.44.3-SNAPSHOT../pom.xmlgoogle-http-client
- 1.44.2
+ 1.44.3-SNAPSHOTGoogle 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 5d1bcaca9..075679758 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
4.0.0com.google.http-clientgoogle-http-client-parent
- 1.44.2
+ 1.44.3-SNAPSHOTpomParent for the Google HTTP Client Library for JavaGoogle HTTP Client Library for Java
@@ -592,7 +592,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
-->
- 1.44.2
+ 1.44.3-SNAPSHOT2.0.25UTF-83.0.2
diff --git a/samples/dailymotion-simple-cmdline-sample/pom.xml b/samples/dailymotion-simple-cmdline-sample/pom.xml
index 58722fcdd..99053176b 100644
--- a/samples/dailymotion-simple-cmdline-sample/pom.xml
+++ b/samples/dailymotion-simple-cmdline-sample/pom.xml
@@ -4,7 +4,7 @@
com.google.http-clientgoogle-http-client-parent
- 1.44.2
+ 1.44.3-SNAPSHOT../../pom.xmldailymotion-simple-cmdline-sample
diff --git a/versions.txt b/versions.txt
index cad4285a1..963efeb8d 100644
--- a/versions.txt
+++ b/versions.txt
@@ -1,17 +1,17 @@
# Format:
# module:released-version:current-version
-google-http-client:1.44.2:1.44.2
-google-http-client-bom:1.44.2:1.44.2
-google-http-client-parent:1.44.2:1.44.2
-google-http-client-android:1.44.2:1.44.2
-google-http-client-android-test:1.44.2:1.44.2
-google-http-client-apache-v2:1.44.2:1.44.2
-google-http-client-appengine:1.44.2:1.44.2
-google-http-client-assembly:1.44.2:1.44.2
-google-http-client-findbugs:1.44.2:1.44.2
-google-http-client-gson:1.44.2:1.44.2
-google-http-client-jackson2:1.44.2:1.44.2
-google-http-client-protobuf:1.44.2:1.44.2
-google-http-client-test:1.44.2:1.44.2
-google-http-client-xml:1.44.2:1.44.2
+google-http-client:1.44.2:1.44.3-SNAPSHOT
+google-http-client-bom:1.44.2:1.44.3-SNAPSHOT
+google-http-client-parent:1.44.2:1.44.3-SNAPSHOT
+google-http-client-android:1.44.2:1.44.3-SNAPSHOT
+google-http-client-android-test:1.44.2:1.44.3-SNAPSHOT
+google-http-client-apache-v2:1.44.2:1.44.3-SNAPSHOT
+google-http-client-appengine:1.44.2:1.44.3-SNAPSHOT
+google-http-client-assembly:1.44.2:1.44.3-SNAPSHOT
+google-http-client-findbugs:1.44.2:1.44.3-SNAPSHOT
+google-http-client-gson:1.44.2:1.44.3-SNAPSHOT
+google-http-client-jackson2:1.44.2:1.44.3-SNAPSHOT
+google-http-client-protobuf:1.44.2:1.44.3-SNAPSHOT
+google-http-client-test:1.44.2:1.44.3-SNAPSHOT
+google-http-client-xml:1.44.2:1.44.3-SNAPSHOT
From b224a1d64cae44878f1bb0af83fb8e33e2e12d63 Mon Sep 17 00:00:00 2001
From: Mend Renovate
Date: Wed, 29 May 2024 21:05:53 +0200
Subject: [PATCH 02/52] deps: update dependency
com.google.cloud:native-image-shared-config to v1.7.7 (#1937)
---
.kokoro/presubmit/graalvm-native-a.cfg | 2 +-
.kokoro/presubmit/graalvm-native-b.cfg | 2 +-
pom.xml | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/.kokoro/presubmit/graalvm-native-a.cfg b/.kokoro/presubmit/graalvm-native-a.cfg
index 0b14fb23d..b7c2b9dca 100644
--- a/.kokoro/presubmit/graalvm-native-a.cfg
+++ b/.kokoro/presubmit/graalvm-native-a.cfg
@@ -3,7 +3,7 @@
# Configure the docker image for kokoro-trampoline.
env_vars: {
key: "TRAMPOLINE_IMAGE"
- value: "gcr.io/cloud-devrel-public-resources/graalvm_a:1.7.6"
+ value: "gcr.io/cloud-devrel-public-resources/graalvm_a:1.7.7"
}
env_vars: {
diff --git a/.kokoro/presubmit/graalvm-native-b.cfg b/.kokoro/presubmit/graalvm-native-b.cfg
index 799c80594..5a92b8122 100644
--- a/.kokoro/presubmit/graalvm-native-b.cfg
+++ b/.kokoro/presubmit/graalvm-native-b.cfg
@@ -3,7 +3,7 @@
# Configure the docker image for kokoro-trampoline.
env_vars: {
key: "TRAMPOLINE_IMAGE"
- value: "gcr.io/cloud-devrel-public-resources/graalvm_b:1.7.6"
+ value: "gcr.io/cloud-devrel-public-resources/graalvm_b:1.7.7"
}
env_vars: {
diff --git a/pom.xml b/pom.xml
index 075679758..b08760552 100644
--- a/pom.xml
+++ b/pom.xml
@@ -92,7 +92,7 @@
com.google.cloudnative-image-shared-config
- 1.7.6
+ 1.7.71.44.3-SNAPSHOT
- 2.0.25
+ 2.0.27UTF-83.0.22.10.1
From 1d2e66bd4babbe8ffd82cf85371e1faace14dd3c Mon Sep 17 00:00:00 2001
From: Mend Renovate
Date: Wed, 29 May 2024 21:06:11 +0200
Subject: [PATCH 04/52] build(deps): update dependency
org.apache.maven.plugins:maven-assembly-plugin to v3.7.1 (#1939)
---
pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pom.xml b/pom.xml
index be9265239..1e2c4afaf 100644
--- a/pom.xml
+++ b/pom.xml
@@ -283,7 +283,7 @@
maven-assembly-plugin
- 3.5.0
+ 3.7.1maven-compiler-plugin
From 9aca8cada5f2c3563fee44999c72f72fc95d56f3 Mon Sep 17 00:00:00 2001
From: Mend Renovate
Date: Wed, 29 May 2024 21:06:20 +0200
Subject: [PATCH 05/52] build(deps): update dependency
org.apache.maven.plugins:maven-compiler-plugin to v3.13.0 (#1942)
---
.../google-http-client-findbugs-test/pom.xml | 2 +-
pom.xml | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/google-http-client-findbugs/google-http-client-findbugs-test/pom.xml b/google-http-client-findbugs/google-http-client-findbugs-test/pom.xml
index bc97d5de0..2686d203f 100644
--- a/google-http-client-findbugs/google-http-client-findbugs-test/pom.xml
+++ b/google-http-client-findbugs/google-http-client-findbugs-test/pom.xml
@@ -11,7 +11,7 @@
maven-compiler-plugin
- 3.11.0
+ 3.13.01.71.7
diff --git a/pom.xml b/pom.xml
index 1e2c4afaf..e665571e1 100644
--- a/pom.xml
+++ b/pom.xml
@@ -287,7 +287,7 @@
maven-compiler-plugin
- 3.11.0
+ 3.13.01.71.7
From 4ad226c8b5adacf6399d84305e3b14f5ad236612 Mon Sep 17 00:00:00 2001
From: Mend Renovate
Date: Wed, 29 May 2024 21:06:40 +0200
Subject: [PATCH 06/52] build(deps): update dependency
org.apache.maven.plugins:maven-source-plugin to v3.3.1 (#1936)
---
pom.xml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/pom.xml b/pom.xml
index e665571e1..b74c3948c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -300,7 +300,7 @@
org.apache.maven.pluginsmaven-source-plugin
- 3.2.1
+ 3.3.1attach-sources
@@ -391,7 +391,7 @@
org.apache.maven.pluginsmaven-source-plugin
- 3.3.0
+ 3.3.1attach-sources
From 571f8a81be5b3a357ab6d3fa1ff817fe7be2b317 Mon Sep 17 00:00:00 2001
From: Mend Renovate
Date: Fri, 31 May 2024 20:33:01 +0200
Subject: [PATCH 07/52] build(deps): update dependency
org.apache.maven.plugins:maven-surefire-plugin to v3.2.5 (#1950)
---
pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pom.xml b/pom.xml
index b74c3948c..a570b3949 100644
--- a/pom.xml
+++ b/pom.xml
@@ -605,7 +605,7 @@
4.4.160.31.1..
- 3.0.0-M7
+ 3.2.5false
From 0de3985b0b213271fc7e89abd0b8aa488fcdfa39 Mon Sep 17 00:00:00 2001
From: Mend Renovate
Date: Fri, 31 May 2024 20:33:17 +0200
Subject: [PATCH 08/52] build(deps): update dependency
org.apache.maven.plugins:maven-project-info-reports-plugin to v3.5.0 (#1949)
---
pom.xml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/pom.xml b/pom.xml
index a570b3949..16cd32e04 100644
--- a/pom.xml
+++ b/pom.xml
@@ -366,7 +366,7 @@
org.apache.maven.pluginsmaven-project-info-reports-plugin
- 3.4.5
+ 3.5.0org.apache.maven.plugins
@@ -549,7 +549,7 @@
maven-project-info-reports-plugin
- 3.4.5
+ 3.5.0
From 84f8c6b97b19afc96bffc58ad2e4544992b31dac Mon Sep 17 00:00:00 2001
From: Mend Renovate
Date: Fri, 31 May 2024 20:33:31 +0200
Subject: [PATCH 09/52] build(deps): update dependency
org.apache.maven.plugins:maven-javadoc-plugin to v3.6.3 (#1948)
---
google-http-client-bom/pom.xml | 2 +-
pom.xml | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/google-http-client-bom/pom.xml b/google-http-client-bom/pom.xml
index 9e9075bb7..aef043c2a 100644
--- a/google-http-client-bom/pom.xml
+++ b/google-http-client-bom/pom.xml
@@ -128,7 +128,7 @@
org.apache.maven.pluginsmaven-javadoc-plugin
- 3.5.0
+ 3.6.3true
diff --git a/pom.xml b/pom.xml
index 16cd32e04..c213c5e7f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -313,7 +313,7 @@
org.apache.maven.pluginsmaven-javadoc-plugin
- 3.5.0
+ 3.6.3attach-javadocs
From 664ab8bf280fde4ad2cf2c5af7d8128a20837469 Mon Sep 17 00:00:00 2001
From: Mend Renovate
Date: Fri, 31 May 2024 20:33:44 +0200
Subject: [PATCH 10/52] build(deps): update dependency
org.apache.maven.plugins:maven-jar-plugin to v3.4.1 (#1947)
---
.../google-http-client-findbugs-test/pom.xml | 2 +-
pom.xml | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/google-http-client-findbugs/google-http-client-findbugs-test/pom.xml b/google-http-client-findbugs/google-http-client-findbugs-test/pom.xml
index 2686d203f..c1947e232 100644
--- a/google-http-client-findbugs/google-http-client-findbugs-test/pom.xml
+++ b/google-http-client-findbugs/google-http-client-findbugs-test/pom.xml
@@ -19,7 +19,7 @@
maven-jar-plugin
- 3.3.0
+ 3.4.1
diff --git a/pom.xml b/pom.xml
index c213c5e7f..888341b32 100644
--- a/pom.xml
+++ b/pom.xml
@@ -326,7 +326,7 @@
org.apache.maven.pluginsmaven-jar-plugin
- 3.3.0
+ 3.4.1
From 9fabb1e70b684c84424982e2cbe070ae051e1679 Mon Sep 17 00:00:00 2001
From: Mend Renovate
Date: Fri, 31 May 2024 20:33:58 +0200
Subject: [PATCH 11/52] build(deps): update dependency
org.apache.maven.plugins:maven-gpg-plugin to v3.2.4 (#1945)
---
google-http-client-bom/pom.xml | 2 +-
pom.xml | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/google-http-client-bom/pom.xml b/google-http-client-bom/pom.xml
index aef043c2a..165129c31 100644
--- a/google-http-client-bom/pom.xml
+++ b/google-http-client-bom/pom.xml
@@ -166,7 +166,7 @@
org.apache.maven.pluginsmaven-gpg-plugin
- 3.0.1
+ 3.2.4sign-artifacts
diff --git a/pom.xml b/pom.xml
index 888341b32..77266714e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -661,7 +661,7 @@
org.apache.maven.pluginsmaven-gpg-plugin
- 3.0.1
+ 3.2.4sign-artifacts
From 96fd52cb9421198cd53b5e48df688c1a3a500c04 Mon Sep 17 00:00:00 2001
From: Mend Renovate
Date: Fri, 31 May 2024 21:03:17 +0200
Subject: [PATCH 12/52] build(deps): update dependency
org.apache.maven.plugins:maven-enforcer-plugin to v3.5.0 (#1951)
---
pom.xml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/pom.xml b/pom.xml
index 77266714e..cdc778f9f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -386,7 +386,7 @@
org.apache.maven.pluginsmaven-enforcer-plugin
- 3.4.1
+ 3.5.0org.apache.maven.plugins
@@ -407,7 +407,7 @@
org.apache.maven.pluginsmaven-enforcer-plugin
- 3.4.1
+ 3.5.0enforce-maven
From 9732b83f5903318733316e7066b5eeae5cedbe0b Mon Sep 17 00:00:00 2001
From: Mend Renovate
Date: Tue, 9 Jul 2024 15:58:42 +0200
Subject: [PATCH 13/52] build(deps): update dependency
org.codehaus.mojo:animal-sniffer-maven-plugin to v1.23 (#1953)
---
pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pom.xml b/pom.xml
index cdc778f9f..dd819ab46 100644
--- a/pom.xml
+++ b/pom.xml
@@ -361,7 +361,7 @@
org.codehaus.mojoanimal-sniffer-maven-plugin
- 1.22
+ 1.23org.apache.maven.plugins
From 3ec9fdf0a27084e322e54b36baced9db405db9ab Mon Sep 17 00:00:00 2001
From: Mend Renovate
Date: Tue, 9 Jul 2024 15:59:44 +0200
Subject: [PATCH 14/52] build(deps): update dependency
org.apache.maven.plugins:maven-javadoc-plugin to v3.7.0 (#1955)
---
google-http-client-bom/pom.xml | 2 +-
pom.xml | 4 ++--
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/google-http-client-bom/pom.xml b/google-http-client-bom/pom.xml
index 165129c31..0ca6764c4 100644
--- a/google-http-client-bom/pom.xml
+++ b/google-http-client-bom/pom.xml
@@ -128,7 +128,7 @@
org.apache.maven.pluginsmaven-javadoc-plugin
- 3.6.3
+ 3.7.0true
diff --git a/pom.xml b/pom.xml
index dd819ab46..2d09551fa 100644
--- a/pom.xml
+++ b/pom.xml
@@ -313,7 +313,7 @@
org.apache.maven.pluginsmaven-javadoc-plugin
- 3.6.3
+ 3.7.0attach-javadocs
@@ -750,7 +750,7 @@
org.apache.maven.pluginsmaven-javadoc-plugin
- 3.6.3
+ 3.7.0com.microsoft.doclet.DocFxDocletfalse
From 97a6cf001dd4389fc4888341f304c0bda42e6fcd Mon Sep 17 00:00:00 2001
From: Mend Renovate
Date: Tue, 9 Jul 2024 16:15:58 +0200
Subject: [PATCH 15/52] build(deps): update dependency
org.sonatype.plugins:nexus-staging-maven-plugin to v1.7.0 (#1957)
---
google-http-client-bom/pom.xml | 2 +-
pom.xml | 2 +-
samples/pom.xml | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/google-http-client-bom/pom.xml b/google-http-client-bom/pom.xml
index 0ca6764c4..4f00e6f03 100644
--- a/google-http-client-bom/pom.xml
+++ b/google-http-client-bom/pom.xml
@@ -117,7 +117,7 @@
org.sonatype.pluginsnexus-staging-maven-plugin
- 1.6.13
+ 1.7.0truesonatype-nexus-staging
diff --git a/pom.xml b/pom.xml
index 2d09551fa..258e85db2 100644
--- a/pom.xml
+++ b/pom.xml
@@ -273,7 +273,7 @@
org.sonatype.pluginsnexus-staging-maven-plugin
- 1.6.13
+ 1.7.0trueossrh
diff --git a/samples/pom.xml b/samples/pom.xml
index 88fe18cea..d116730e8 100644
--- a/samples/pom.xml
+++ b/samples/pom.xml
@@ -46,7 +46,7 @@
org.sonatype.pluginsnexus-staging-maven-plugin
- 1.6.13
+ 1.7.0true
From ee976415832500fd4498d737f1e0421d4eec61fa Mon Sep 17 00:00:00 2001
From: Mend Renovate
Date: Tue, 9 Jul 2024 16:41:13 +0200
Subject: [PATCH 16/52] build(deps): update dependency
org.codehaus.mojo:exec-maven-plugin to v3.3.0 (#1956)
---
samples/dailymotion-simple-cmdline-sample/pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/samples/dailymotion-simple-cmdline-sample/pom.xml b/samples/dailymotion-simple-cmdline-sample/pom.xml
index 99053176b..ba5e2efc8 100644
--- a/samples/dailymotion-simple-cmdline-sample/pom.xml
+++ b/samples/dailymotion-simple-cmdline-sample/pom.xml
@@ -15,7 +15,7 @@
org.codehaus.mojoexec-maven-plugin
- 3.1.0
+ 3.3.0
From 38f711edb24b2d8423b3db52b059335e03b47de0 Mon Sep 17 00:00:00 2001
From: Mend Renovate
Date: Tue, 9 Jul 2024 16:41:43 +0200
Subject: [PATCH 17/52] build(deps): update dependency
org.codehaus.mojo:build-helper-maven-plugin to v3.6.0 (#1954)
---
google-http-client-apache-v2/pom.xml | 2 +-
google-http-client-gson/pom.xml | 2 +-
google-http-client-jackson2/pom.xml | 2 +-
google-http-client-test/pom.xml | 2 +-
google-http-client-xml/pom.xml | 2 +-
samples/install-without-bom/pom.xml | 2 +-
samples/snapshot/pom.xml | 2 +-
7 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/google-http-client-apache-v2/pom.xml b/google-http-client-apache-v2/pom.xml
index 4541ae527..10307d3bb 100644
--- a/google-http-client-apache-v2/pom.xml
+++ b/google-http-client-apache-v2/pom.xml
@@ -29,7 +29,7 @@
org.codehaus.mojobuild-helper-maven-plugin
- 3.3.0
+ 3.6.0add-test-source
diff --git a/google-http-client-gson/pom.xml b/google-http-client-gson/pom.xml
index 2db8272b3..bb7dc31b5 100644
--- a/google-http-client-gson/pom.xml
+++ b/google-http-client-gson/pom.xml
@@ -30,7 +30,7 @@
org.codehaus.mojobuild-helper-maven-plugin
- 3.3.0
+ 3.6.0add-test-source
diff --git a/google-http-client-jackson2/pom.xml b/google-http-client-jackson2/pom.xml
index def789878..d8afee4f6 100644
--- a/google-http-client-jackson2/pom.xml
+++ b/google-http-client-jackson2/pom.xml
@@ -29,7 +29,7 @@
org.codehaus.mojobuild-helper-maven-plugin
- 3.3.0
+ 3.6.0add-test-source
diff --git a/google-http-client-test/pom.xml b/google-http-client-test/pom.xml
index 7c0feeb27..89648a188 100644
--- a/google-http-client-test/pom.xml
+++ b/google-http-client-test/pom.xml
@@ -29,7 +29,7 @@
org.codehaus.mojobuild-helper-maven-plugin
- 3.3.0
+ 3.6.0add-test-source
diff --git a/google-http-client-xml/pom.xml b/google-http-client-xml/pom.xml
index 7851bbab1..c3acca5f0 100644
--- a/google-http-client-xml/pom.xml
+++ b/google-http-client-xml/pom.xml
@@ -29,7 +29,7 @@
org.codehaus.mojobuild-helper-maven-plugin
- 3.3.0
+ 3.6.0add-test-source
diff --git a/samples/install-without-bom/pom.xml b/samples/install-without-bom/pom.xml
index 5891c62c8..b14c176e5 100644
--- a/samples/install-without-bom/pom.xml
+++ b/samples/install-without-bom/pom.xml
@@ -53,7 +53,7 @@
org.codehaus.mojobuild-helper-maven-plugin
- 3.3.0
+ 3.6.0add-snippets-source
diff --git a/samples/snapshot/pom.xml b/samples/snapshot/pom.xml
index cc6cb1fa8..b8adb0e8e 100644
--- a/samples/snapshot/pom.xml
+++ b/samples/snapshot/pom.xml
@@ -52,7 +52,7 @@
org.codehaus.mojobuild-helper-maven-plugin
- 3.3.0
+ 3.6.0add-snippets-source
From f65d8fcfcb380c3c407fc1aaf152ea512871a61f Mon Sep 17 00:00:00 2001
From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com>
Date: Tue, 23 Jul 2024 14:03:44 -0400
Subject: [PATCH 18/52] ci: [java] automatic kokoro label in and /gcbrun
comment (#1965) (#1958)
Source-Link: https://github.com/googleapis/synthtool/commit/bd2bae89f70bad380da47fab9ec25985dfb87d67
Post-Processor: gcr.io/cloud-devrel-public-resources/owlbot-java:latest@sha256:72f0d373307d128b2cb720c5cb4d90b31f0e86529dd138c632710ae0c69efae3
Co-authored-by: Owl Bot
---
.github/.OwlBot.lock.yaml | 4 ++--
.github/trusted-contribution.yml | 6 ++++++
2 files changed, 8 insertions(+), 2 deletions(-)
diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml
index 5db36a5f7..359fe71c1 100644
--- a/.github/.OwlBot.lock.yaml
+++ b/.github/.OwlBot.lock.yaml
@@ -13,5 +13,5 @@
# limitations under the License.
docker:
image: gcr.io/cloud-devrel-public-resources/owlbot-java:latest
- digest: sha256:68ba5f5164a4b55529d358bb262feaa000536a0c62980727dd05a91bbb47ea5e
-# created: 2024-05-09T16:31:37.168667071Z
+ digest: sha256:72f0d373307d128b2cb720c5cb4d90b31f0e86529dd138c632710ae0c69efae3
+# created: 2024-06-05T18:32:21.724930324Z
diff --git a/.github/trusted-contribution.yml b/.github/trusted-contribution.yml
index a0ba1f7d9..88d3ac9bf 100644
--- a/.github/trusted-contribution.yml
+++ b/.github/trusted-contribution.yml
@@ -1,3 +1,9 @@
trustedContributors:
- renovate-bot
- gcf-owl-bot[bot]
+
+annotations:
+- type: comment
+ text: "/gcbrun"
+- type: label
+ text: "kokoro:force-run"
From 792e44f6a2b7678fef30c3bdfc0955be533a7613 Mon Sep 17 00:00:00 2001
From: Min Zhu
Date: Tue, 23 Jul 2024 14:04:32 -0400
Subject: [PATCH 19/52] deps: update dependency
com.google.cloud:native-image-shared-config to v1.9.0 (#1961)
---
.kokoro/presubmit/graalvm-native-a.cfg | 2 +-
.kokoro/presubmit/graalvm-native-b.cfg | 4 ++--
pom.xml | 2 +-
3 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/.kokoro/presubmit/graalvm-native-a.cfg b/.kokoro/presubmit/graalvm-native-a.cfg
index b7c2b9dca..ad1099684 100644
--- a/.kokoro/presubmit/graalvm-native-a.cfg
+++ b/.kokoro/presubmit/graalvm-native-a.cfg
@@ -3,7 +3,7 @@
# Configure the docker image for kokoro-trampoline.
env_vars: {
key: "TRAMPOLINE_IMAGE"
- value: "gcr.io/cloud-devrel-public-resources/graalvm_a:1.7.7"
+ value: "gcr.io/cloud-devrel-public-resources/graalvm_a:1.9.0"
}
env_vars: {
diff --git a/.kokoro/presubmit/graalvm-native-b.cfg b/.kokoro/presubmit/graalvm-native-b.cfg
index 5a92b8122..e5229b14e 100644
--- a/.kokoro/presubmit/graalvm-native-b.cfg
+++ b/.kokoro/presubmit/graalvm-native-b.cfg
@@ -3,7 +3,7 @@
# Configure the docker image for kokoro-trampoline.
env_vars: {
key: "TRAMPOLINE_IMAGE"
- value: "gcr.io/cloud-devrel-public-resources/graalvm_b:1.7.7"
+ value: "gcr.io/cloud-devrel-public-resources/graalvm_b:1.9.0"
}
env_vars: {
@@ -30,4 +30,4 @@ env_vars: {
env_vars: {
key: "SECRET_MANAGER_KEYS"
value: "java-it-service-account"
-}
\ No newline at end of file
+}
diff --git a/pom.xml b/pom.xml
index 258e85db2..a73175e30 100644
--- a/pom.xml
+++ b/pom.xml
@@ -92,7 +92,7 @@
com.google.cloudnative-image-shared-config
- 1.7.7
+ 1.9.0
+ ../pom.xml
+
+ google-http-client-apache-v5
+ 1.44.3-SNAPSHOT
+ Apache HTTP transport v5 for the Google HTTP Client Library for Java.
+
+
+
+
+ maven-javadoc-plugin
+
+
+ https://download.oracle.com/javase/7/docs/api/
+
+ ${project.name} ${project.version}
+ ${project.artifactId} ${project.version}
+
+
+
+ maven-source-plugin
+
+
+ org.codehaus.mojo
+ build-helper-maven-plugin
+ 3.3.0
+
+
+ add-test-source
+ generate-test-sources
+
+ add-test-source
+
+
+
+ target/generated-test-sources
+
+
+
+
+
+
+ maven-jar-plugin
+
+
+ ${project.build.outputDirectory}/META-INF/MANIFEST.MF
+
+ com.google.api.client.http.apache.v5
+
+
+
+
+
+ org.apache.felix
+ maven-bundle-plugin
+ 5.1.9
+
+
+ bundle-manifest
+ process-classes
+
+ manifest
+
+
+
+
+
+ maven-compiler-plugin
+ 3.13.0
+
+ 1.8
+ 1.8
+
+
+
+
+
+
+ com.google.http-client
+ google-http-client
+
+
+ org.apache.httpcomponents
+ httpcore
+
+
+ org.apache.httpcomponents
+ httpclient
+
+
+
+
+ com.google.guava
+ guava
+
+
+ org.apache.httpcomponents.client5
+ httpclient5
+
+
+ org.apache.httpcomponents.core5
+ httpcore5
+
+
+ junit
+ junit
+ test
+
+
+
diff --git a/google-http-client-apache-v5/src/main/java/com/google/api/client/http/apache/v5/Apache5ContentEntity.java b/google-http-client-apache-v5/src/main/java/com/google/api/client/http/apache/v5/Apache5ContentEntity.java
new file mode 100644
index 000000000..4a5ab84e6
--- /dev/null
+++ b/google-http-client-apache-v5/src/main/java/com/google/api/client/http/apache/v5/Apache5ContentEntity.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2024 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * 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.apache.v5;
+
+import com.google.api.client.util.Preconditions;
+import com.google.api.client.util.StreamingContent;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import org.apache.hc.core5.http.io.entity.AbstractHttpEntity;
+
+/**
+ * Translation class to make google-http-client entity conform with Apache 5.x {@link
+ * AbstractHttpEntity}
+ */
+final class Apache5ContentEntity extends AbstractHttpEntity {
+
+ /** Content length or less than zero if not known. */
+ private final long contentLength;
+
+ /** Streaming content. */
+ private final StreamingContent streamingContent;
+
+ /**
+ * @param contentLength content length or less than zero if not known
+ * @param streamingContent streaming content
+ */
+ Apache5ContentEntity(
+ long contentLength,
+ StreamingContent streamingContent,
+ String contentType,
+ String contentEncoding) {
+ super(contentType, contentEncoding, contentLength == -1);
+ this.contentLength = contentLength;
+ this.streamingContent = Preconditions.checkNotNull(streamingContent);
+ }
+
+ @Override
+ public InputStream getContent() {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public long getContentLength() {
+ return contentLength;
+ }
+
+ @Override
+ public boolean isRepeatable() {
+ return false;
+ }
+
+ @Override
+ public boolean isStreaming() {
+ return true;
+ }
+
+ @Override
+ public void writeTo(OutputStream out) throws IOException {
+ if (contentLength != 0) {
+ streamingContent.writeTo(out);
+ }
+ }
+
+ @Override
+ public void close() throws IOException {}
+}
diff --git a/google-http-client-apache-v5/src/main/java/com/google/api/client/http/apache/v5/Apache5HttpRequest.java b/google-http-client-apache-v5/src/main/java/com/google/api/client/http/apache/v5/Apache5HttpRequest.java
new file mode 100644
index 000000000..99d6eca8e
--- /dev/null
+++ b/google-http-client-apache-v5/src/main/java/com/google/api/client/http/apache/v5/Apache5HttpRequest.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2024 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * 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.apache.v5;
+
+import com.google.api.client.http.LowLevelHttpRequest;
+import com.google.api.client.http.LowLevelHttpResponse;
+import java.io.IOException;
+import java.util.concurrent.TimeUnit;
+import org.apache.hc.client5.http.ClientProtocolException;
+import org.apache.hc.client5.http.classic.HttpClient;
+import org.apache.hc.client5.http.classic.methods.HttpUriRequestBase;
+import org.apache.hc.client5.http.config.RequestConfig;
+import org.apache.hc.client5.http.routing.RoutingSupport;
+import org.apache.hc.core5.http.ClassicHttpResponse;
+import org.apache.hc.core5.http.HttpException;
+import org.apache.hc.core5.http.HttpHost;
+import org.apache.hc.core5.util.Timeout;
+
+public final class Apache5HttpRequest extends LowLevelHttpRequest {
+
+ private final HttpUriRequestBase request;
+
+ private final RequestConfig.Builder requestConfig;
+
+ private final HttpClient httpClient;
+
+ Apache5HttpRequest(HttpClient httpClient, HttpUriRequestBase request) {
+ this.httpClient = httpClient;
+ this.request = request;
+ // disable redirects as google-http-client handles redirects
+ this.requestConfig = RequestConfig.custom().setRedirectsEnabled(false);
+ }
+
+ @Override
+ public void addHeader(String name, String value) {
+ request.addHeader(name, value);
+ }
+
+ @Override
+ public void setTimeout(int connectTimeout, int readTimeout) throws IOException {
+ requestConfig
+ .setConnectTimeout(Timeout.of(connectTimeout, TimeUnit.MILLISECONDS))
+ // ResponseTimeout behaves the same as 4.x's SocketTimeout
+ .setResponseTimeout(Timeout.of(readTimeout, TimeUnit.MILLISECONDS));
+ }
+
+ @Override
+ public LowLevelHttpResponse execute() throws IOException {
+ if (getStreamingContent() != null) {
+ Apache5ContentEntity entity =
+ new Apache5ContentEntity(
+ getContentLength(), getStreamingContent(), getContentType(), getContentEncoding());
+ request.setEntity(entity);
+ }
+ request.setConfig(requestConfig.build());
+ HttpHost target;
+ try {
+ target = RoutingSupport.determineHost(request);
+ } catch (HttpException e) {
+ throw new ClientProtocolException("The request's host is invalid.", e);
+ }
+ // we use a null context so the client creates the default one internally
+ ClassicHttpResponse httpResponse = httpClient.executeOpen(target, request, null);
+ return new Apache5HttpResponse(request, httpResponse);
+ }
+}
diff --git a/google-http-client-apache-v5/src/main/java/com/google/api/client/http/apache/v5/Apache5HttpResponse.java b/google-http-client-apache-v5/src/main/java/com/google/api/client/http/apache/v5/Apache5HttpResponse.java
new file mode 100644
index 000000000..1574c8c89
--- /dev/null
+++ b/google-http-client-apache-v5/src/main/java/com/google/api/client/http/apache/v5/Apache5HttpResponse.java
@@ -0,0 +1,102 @@
+/*
+ * Copyright 2024 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * 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.apache.v5;
+
+import com.google.api.client.http.LowLevelHttpResponse;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.logging.Logger;
+import org.apache.hc.client5.http.classic.methods.HttpUriRequestBase;
+import org.apache.hc.core5.http.ClassicHttpResponse;
+import org.apache.hc.core5.http.Header;
+import org.apache.hc.core5.http.HttpEntity;
+import org.apache.hc.core5.http.message.StatusLine;
+
+final class Apache5HttpResponse extends LowLevelHttpResponse {
+
+ private static final Logger LOGGER = Logger.getLogger(Apache5HttpResponse.class.getName());
+ private final HttpUriRequestBase request;
+ private final ClassicHttpResponse response;
+ private final Header[] allHeaders;
+ private final HttpEntity entity;
+
+ Apache5HttpResponse(HttpUriRequestBase request, ClassicHttpResponse response) {
+ this.request = request;
+ this.response = response;
+ this.allHeaders = response.getHeaders();
+ this.entity = response.getEntity();
+ }
+
+ @Override
+ public int getStatusCode() {
+ return response.getCode();
+ }
+
+ @Override
+ public InputStream getContent() throws IOException {
+ return new Apache5ResponseContent(entity.getContent(), response);
+ }
+
+ @Override
+ public String getContentEncoding() {
+ return entity != null ? entity.getContentEncoding() : null;
+ }
+
+ @Override
+ public long getContentLength() {
+ return entity == null ? -1 : entity.getContentLength();
+ }
+
+ @Override
+ public String getContentType() {
+ return entity == null ? null : entity.getContentType();
+ }
+
+ @Override
+ public String getReasonPhrase() {
+ return response.getReasonPhrase();
+ }
+
+ @Override
+ public String getStatusLine() {
+ return new StatusLine(response).toString();
+ }
+
+ public String getHeaderValue(String name) {
+ return response.getLastHeader(name).getValue();
+ }
+
+ @Override
+ public int getHeaderCount() {
+ return allHeaders.length;
+ }
+
+ @Override
+ public String getHeaderName(int index) {
+ return allHeaders[index].getName();
+ }
+
+ @Override
+ public String getHeaderValue(int index) {
+ return allHeaders[index].getValue();
+ }
+
+ /** Aborts execution of the request. */
+ @Override
+ public void disconnect() throws IOException {
+ request.abort();
+ response.close();
+ }
+}
diff --git a/google-http-client-apache-v5/src/main/java/com/google/api/client/http/apache/v5/Apache5HttpTransport.java b/google-http-client-apache-v5/src/main/java/com/google/api/client/http/apache/v5/Apache5HttpTransport.java
new file mode 100644
index 000000000..868a2cf93
--- /dev/null
+++ b/google-http-client-apache-v5/src/main/java/com/google/api/client/http/apache/v5/Apache5HttpTransport.java
@@ -0,0 +1,221 @@
+/*
+ * Copyright 2024 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * 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.apache.v5;
+
+import com.google.api.client.http.HttpMethods;
+import com.google.api.client.http.HttpTransport;
+import com.google.common.annotations.Beta;
+import com.google.common.base.Preconditions;
+import java.io.IOException;
+import java.net.ProxySelector;
+import java.net.URI;
+import java.util.concurrent.TimeUnit;
+import org.apache.hc.client5.http.classic.HttpClient;
+import org.apache.hc.client5.http.classic.methods.HttpDelete;
+import org.apache.hc.client5.http.classic.methods.HttpGet;
+import org.apache.hc.client5.http.classic.methods.HttpHead;
+import org.apache.hc.client5.http.classic.methods.HttpOptions;
+import org.apache.hc.client5.http.classic.methods.HttpPatch;
+import org.apache.hc.client5.http.classic.methods.HttpPost;
+import org.apache.hc.client5.http.classic.methods.HttpPut;
+import org.apache.hc.client5.http.classic.methods.HttpTrace;
+import org.apache.hc.client5.http.classic.methods.HttpUriRequestBase;
+import org.apache.hc.client5.http.config.ConnectionConfig;
+import org.apache.hc.client5.http.impl.classic.HttpClientBuilder;
+import org.apache.hc.client5.http.impl.classic.HttpClients;
+import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager;
+import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManagerBuilder;
+import org.apache.hc.client5.http.impl.routing.SystemDefaultRoutePlanner;
+import org.apache.hc.client5.http.ssl.SSLConnectionSocketFactory;
+import org.apache.hc.core5.io.CloseMode;
+import org.apache.hc.core5.io.ModalCloseable;
+
+/**
+ * Thread-safe HTTP transport based on the Apache HTTP Client library.
+ *
+ *
Implementation is thread-safe, as long as any parameter modification to the {@link
+ * #getHttpClient() Apache HTTP Client} is only done at initialization time. For maximum efficiency,
+ * applications should use a single globally-shared instance of the HTTP transport.
+ *
+ *
Default settings are specified in {@link #newDefaultHttpClient()}. Use the {@link
+ * #Apache5HttpTransport(HttpClient)} constructor to override the Apache HTTP Client used. Please
+ * read the
+ * Apache HTTP Client 5.x configuration example for more complex configuration options.
+ */
+public final class Apache5HttpTransport extends HttpTransport {
+
+ /** Apache HTTP client. */
+ private final HttpClient httpClient;
+
+ /** If the HTTP client uses mTLS channel. */
+ private final boolean isMtls;
+
+ /** Constructor that uses {@link #newDefaultHttpClient()} for the Apache HTTP client. */
+ public Apache5HttpTransport() {
+ this(newDefaultHttpClient(), false);
+ }
+
+ /**
+ * Constructor that allows an alternative Apache HTTP client to be used.
+ *
+ *
If you choose to provide your own Apache HttpClient implementation, be sure that
+ *
+ *
+ *
HTTP version is set to 1.1.
+ *
Retries are disabled (google-http-client handles retries).
+ *
+ *
+ * @param httpClient Apache HTTP client to use
+ */
+ public Apache5HttpTransport(HttpClient httpClient) {
+ this.httpClient = httpClient;
+ this.isMtls = false;
+ }
+
+ /**
+ * {@link Beta}
+ * Constructor that allows an alternative CLoseable Apache HTTP client to be used.
+ *
+ *
If you choose to provide your own Apache HttpClient implementation, be sure that
+ *
+ *
+ *
HTTP version is set to 1.1.
+ *
Retries are disabled (google-http-client handles retries).
+ *
Redirects are disabled (google-http-client handles retries).
+ *
+ *
+ * @param httpClient Apache HTTP client to use
+ * @param isMtls If the HTTP client is mutual TLS
+ */
+ @Beta
+ public Apache5HttpTransport(HttpClient httpClient, boolean isMtls) {
+ this.httpClient = httpClient;
+ this.isMtls = isMtls;
+ }
+
+ /**
+ * Creates a new instance of the Apache HTTP client that is used by the {@link
+ * #Apache5HttpTransport()} constructor.
+ *
+ *
Settings:
+ *
+ *
+ *
The client connection manager is set to {@link PoolingHttpClientConnectionManager}.
+ *
The retry mechanism is turned off using {@link
+ * HttpClientBuilder#disableAutomaticRetries()}.
+ *
Redirects are turned off using {@link HttpClientBuilder#disableRedirectHandling}.
+ *
The route planner uses {@link SystemDefaultRoutePlanner} with {@link
+ * ProxySelector#getDefault()}, which uses the proxy settings from system
+ * properties.
+ *
+ *
+ * @return new instance of the Apache HTTP client
+ */
+ public static HttpClient newDefaultHttpClient() {
+ return newDefaultHttpClientBuilder().build();
+ }
+
+ /**
+ * Creates a new Apache HTTP client builder that is used by the {@link #Apache5HttpTransport()}
+ * constructor.
+ *
+ *
Settings:
+ *
+ *
+ *
The client connection manager is set to {@link PoolingHttpClientConnectionManager}.
+ *
The retry mechanism is turned off using {@link
+ * HttpClientBuilder#disableAutomaticRetries()}.
+ *
Redirects are turned off using {@link HttpClientBuilder#disableRedirectHandling}.
+ *
The route planner uses {@link SystemDefaultRoutePlanner} with {@link
+ * ProxySelector#getDefault()}, which uses the proxy settings from system
+ * properties.
+ *
+ *
+ * @return new instance of the Apache HTTP client builder
+ */
+ public static HttpClientBuilder newDefaultHttpClientBuilder() {
+ PoolingHttpClientConnectionManager connectionManager =
+ PoolingHttpClientConnectionManagerBuilder.create()
+ .setSSLSocketFactory(SSLConnectionSocketFactory.getSocketFactory())
+ .setMaxConnTotal(200)
+ .setMaxConnPerRoute(20)
+ .setDefaultConnectionConfig(
+ ConnectionConfig.custom().setTimeToLive(-1, TimeUnit.MILLISECONDS).build())
+ .build();
+
+ return HttpClients.custom()
+ .useSystemProperties()
+ .setConnectionManager(connectionManager)
+ .setRoutePlanner(new SystemDefaultRoutePlanner(ProxySelector.getDefault()))
+ .disableRedirectHandling()
+ .disableAutomaticRetries();
+ }
+
+ @Override
+ public boolean supportsMethod(String method) {
+ return true;
+ }
+
+ @Override
+ protected Apache5HttpRequest buildRequest(String method, String url) {
+ HttpUriRequestBase requestBase;
+ if (method.equals(HttpMethods.DELETE)) {
+ requestBase = new HttpDelete(url);
+ } else if (method.equals(HttpMethods.GET)) {
+ requestBase = new HttpGet(url);
+ } else if (method.equals(HttpMethods.HEAD)) {
+ requestBase = new HttpHead(url);
+ } else if (method.equals(HttpMethods.PATCH)) {
+ requestBase = new HttpPatch(url);
+ } else if (method.equals(HttpMethods.POST)) {
+ requestBase = new HttpPost(url);
+ } else if (method.equals(HttpMethods.PUT)) {
+ requestBase = new HttpPut(url);
+ } else if (method.equals(HttpMethods.TRACE)) {
+ requestBase = new HttpTrace(url);
+ } else if (method.equals(HttpMethods.OPTIONS)) {
+ requestBase = new HttpOptions(url);
+ } else {
+ requestBase = new HttpUriRequestBase(Preconditions.checkNotNull(method), URI.create(url));
+ }
+ return new Apache5HttpRequest(httpClient, requestBase);
+ }
+
+ /**
+ * Gracefully shuts down the connection manager and releases allocated resources. This closes all
+ * connections, whether they are currently used or not.
+ */
+ @Override
+ public void shutdown() throws IOException {
+ if (httpClient instanceof ModalCloseable) {
+ ((ModalCloseable) httpClient).close(CloseMode.GRACEFUL);
+ }
+ // otherwise no-op
+ }
+
+ /** Returns the Apache HTTP client. */
+ public HttpClient getHttpClient() {
+ return httpClient;
+ }
+
+ /** Returns if the underlying HTTP client is mTLS. */
+ @Override
+ public boolean isMtls() {
+ return isMtls;
+ }
+}
diff --git a/google-http-client-apache-v5/src/main/java/com/google/api/client/http/apache/v5/Apache5ResponseContent.java b/google-http-client-apache-v5/src/main/java/com/google/api/client/http/apache/v5/Apache5ResponseContent.java
new file mode 100644
index 000000000..c2d3091df
--- /dev/null
+++ b/google-http-client-apache-v5/src/main/java/com/google/api/client/http/apache/v5/Apache5ResponseContent.java
@@ -0,0 +1,75 @@
+package com.google.api.client.http.apache.v5;
+
+import com.google.common.annotations.VisibleForTesting;
+import java.io.IOException;
+import java.io.InputStream;
+import org.apache.hc.core5.http.ClassicHttpResponse;
+import org.apache.hc.core5.http.HttpResponse;
+
+/**
+ * Class that wraps an {@link org.apache.hc.core5.http.HttpEntity}'s content {@link InputStream}
+ * along with the {@link ClassicHttpResponse} that contains this entity. The main purpose is to be
+ * able to close the response as well as the content input stream when {@link #close()} is called,
+ * in order to not break the existing contract with clients using apache v4 that only required them
+ * to close the input stream to clean up all resources.
+ */
+public class Apache5ResponseContent extends InputStream {
+ private final ClassicHttpResponse response;
+ private final InputStream wrappedStream;
+
+ public Apache5ResponseContent(InputStream wrappedStream, ClassicHttpResponse response) {
+ this.response = response;
+ this.wrappedStream = wrappedStream;
+ }
+
+ @Override
+ public int read() throws IOException {
+ return wrappedStream.read();
+ }
+
+ @Override
+ public int read(byte b[]) throws IOException {
+ return wrappedStream.read(b);
+ }
+
+ @Override
+ public int read(byte b[], int off, int len) throws IOException {
+ return wrappedStream.read(b, off, len);
+ }
+
+ @Override
+ public long skip(long n) throws IOException {
+ return wrappedStream.skip(n);
+ }
+
+ @Override
+ public int available() throws IOException {
+ return wrappedStream.available();
+ }
+
+ @Override
+ public synchronized void mark(int readlimit) {
+ wrappedStream.mark(readlimit);
+ }
+
+ @Override
+ public synchronized void reset() throws IOException {
+ wrappedStream.reset();
+ }
+
+ @Override
+ public void close() throws IOException {
+ wrappedStream.close();
+ response.close();
+ }
+
+ @Override
+ public boolean markSupported() {
+ return wrappedStream.markSupported();
+ }
+
+ @VisibleForTesting
+ HttpResponse getResponse() {
+ return response;
+ }
+}
diff --git a/google-http-client-apache-v5/src/main/java/com/google/api/client/http/apache/v5/package-info.java b/google-http-client-apache-v5/src/main/java/com/google/api/client/http/apache/v5/package-info.java
new file mode 100644
index 000000000..223edc82d
--- /dev/null
+++ b/google-http-client-apache-v5/src/main/java/com/google/api/client/http/apache/v5/package-info.java
@@ -0,0 +1,16 @@
+/*
+ * Copyright 2024 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * 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.
+ */
+
+/** HTTP Transport library for Google API's based on Apache HTTP Client/Core version 5.x */
+package com.google.api.client.http.apache.v5;
diff --git a/google-http-client-apache-v5/src/test/java/com/google/api/client/http/apache/v5/Apache5HttpRequestTest.java b/google-http-client-apache-v5/src/test/java/com/google/api/client/http/apache/v5/Apache5HttpRequestTest.java
new file mode 100644
index 000000000..3b7ca4a21
--- /dev/null
+++ b/google-http-client-apache-v5/src/test/java/com/google/api/client/http/apache/v5/Apache5HttpRequestTest.java
@@ -0,0 +1,131 @@
+/*
+ * Copyright 2019 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * 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.apache.v5;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import com.google.api.client.http.ByteArrayContent;
+import com.google.api.client.http.HttpContent;
+import com.google.api.client.http.InputStreamContent;
+import com.google.api.client.http.LowLevelHttpResponse;
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
+import java.util.Arrays;
+import java.util.concurrent.atomic.AtomicInteger;
+import org.apache.hc.client5.http.classic.methods.HttpPost;
+import org.apache.hc.client5.http.classic.methods.HttpUriRequestBase;
+import org.apache.hc.core5.http.ClassicHttpRequest;
+import org.apache.hc.core5.http.ClassicHttpResponse;
+import org.apache.hc.core5.http.ContentType;
+import org.apache.hc.core5.http.HttpEntity;
+import org.apache.hc.core5.http.HttpHost;
+import org.apache.hc.core5.http.io.entity.BasicHttpEntity;
+import org.apache.hc.core5.http.protocol.HttpContext;
+import org.junit.Test;
+
+public class Apache5HttpRequestTest {
+ @Test
+ public void testContentLengthSet() throws Exception {
+ HttpUriRequestBase base = new HttpPost("http://www.google.com");
+ Apache5HttpRequest request =
+ new Apache5HttpRequest(
+ new MockHttpClient() {
+ @Override
+ public ClassicHttpResponse executeOpen(
+ HttpHost target, ClassicHttpRequest request, HttpContext context) {
+ return new MockClassicHttpResponse();
+ }
+ },
+ base);
+ HttpContent content =
+ new ByteArrayContent("text/plain", "sample".getBytes(StandardCharsets.UTF_8));
+ request.setStreamingContent(content);
+ request.setContentLength(content.getLength());
+ request.execute();
+
+ assertFalse(base.getEntity().isChunked());
+ assertEquals(6, base.getEntity().getContentLength());
+ }
+
+ @Test
+ public void testChunked() throws Exception {
+ byte[] buf = new byte[300];
+ Arrays.fill(buf, (byte) ' ');
+ HttpUriRequestBase base = new HttpPost("http://www.google.com");
+ Apache5HttpRequest request =
+ new Apache5HttpRequest(
+ new MockHttpClient() {
+ @Override
+ public ClassicHttpResponse executeOpen(
+ HttpHost target, ClassicHttpRequest request, HttpContext context) {
+ return new MockClassicHttpResponse();
+ }
+ },
+ base);
+ HttpContent content = new InputStreamContent("text/plain", new ByteArrayInputStream(buf));
+ request.setStreamingContent(content);
+ request.execute();
+
+ assertTrue(base.getEntity().isChunked());
+ assertEquals(-1, base.getEntity().getContentLength());
+ }
+
+ @Test
+ public void testExecute_closeContent_closesResponse() throws Exception {
+ HttpUriRequestBase base = new HttpPost("http://www.google.com");
+ final InputStream responseContentStream = new ByteArrayInputStream(new byte[] {1, 2, 3});
+ BasicHttpEntity testEntity =
+ new BasicHttpEntity(responseContentStream, ContentType.DEFAULT_BINARY);
+ AtomicInteger closedResponseCounter = new AtomicInteger(0);
+ ClassicHttpResponse classicResponse =
+ new MockClassicHttpResponse() {
+ @Override
+ public HttpEntity getEntity() {
+ return testEntity;
+ }
+
+ @Override
+ public void close() {
+ closedResponseCounter.incrementAndGet();
+ }
+ };
+
+ Apache5HttpRequest request =
+ new Apache5HttpRequest(
+ new MockHttpClient() {
+ @Override
+ public ClassicHttpResponse executeOpen(
+ HttpHost target, ClassicHttpRequest request, HttpContext context) {
+ return classicResponse;
+ }
+ },
+ base);
+ LowLevelHttpResponse response = request.execute();
+ assertTrue(response instanceof Apache5HttpResponse);
+
+ // we confirm that the classic response we prepared in this test is the same as the content's
+ // response
+ assertTrue(response.getContent() instanceof Apache5ResponseContent);
+ assertEquals(classicResponse, ((Apache5ResponseContent) response.getContent()).getResponse());
+
+ // we close the response's content stream and confirm the response is also closed
+ assertEquals(0, closedResponseCounter.get());
+ response.getContent().close();
+ assertEquals(1, closedResponseCounter.get());
+ }
+}
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
new file mode 100644
index 000000000..99045d99d
--- /dev/null
+++ b/google-http-client-apache-v5/src/test/java/com/google/api/client/http/apache/v5/Apache5HttpTransportTest.java
@@ -0,0 +1,353 @@
+/*
+ * Copyright 2019 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * 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.apache.v5;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+import static org.junit.Assume.assumeTrue;
+
+import com.google.api.client.http.GenericUrl;
+import com.google.api.client.http.HttpResponseException;
+import com.google.api.client.http.HttpTransport;
+import com.google.api.client.http.LowLevelHttpResponse;
+import com.google.api.client.util.ByteArrayStreamingContent;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
+import org.apache.hc.client5.http.ConnectTimeoutException;
+import org.apache.hc.client5.http.HttpHostConnectException;
+import org.apache.hc.client5.http.classic.HttpClient;
+import org.apache.hc.client5.http.impl.classic.HttpClients;
+import org.apache.hc.core5.http.ClassicHttpRequest;
+import org.apache.hc.core5.http.ClassicHttpResponse;
+import org.apache.hc.core5.http.ContentType;
+import org.apache.hc.core5.http.EntityDetails;
+import org.apache.hc.core5.http.Header;
+import org.apache.hc.core5.http.HttpException;
+import org.apache.hc.core5.http.HttpHeaders;
+import org.apache.hc.core5.http.HttpHost;
+import org.apache.hc.core5.http.HttpRequest;
+import org.apache.hc.core5.http.HttpRequestInterceptor;
+import org.apache.hc.core5.http.HttpRequestMapper;
+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;
+import org.apache.hc.core5.http.protocol.HttpContext;
+import org.apache.hc.core5.http.protocol.HttpProcessor;
+import org.junit.Assert;
+import org.junit.Test;
+
+/** Tests {@link Apache5HttpTransport}. */
+public class Apache5HttpTransportTest {
+
+ @Test
+ public void testApacheHttpTransport() {
+ Apache5HttpTransport transport = new Apache5HttpTransport();
+ checkHttpTransport(transport);
+ assertFalse(transport.isMtls());
+ }
+
+ @Test
+ public void testApacheHttpTransportWithParam() {
+ Apache5HttpTransport transport = new Apache5HttpTransport(HttpClients.custom().build(), true);
+ checkHttpTransport(transport);
+ assertTrue(transport.isMtls());
+ }
+
+ @Test
+ public void testNewDefaultHttpClient() {
+ HttpClient client = Apache5HttpTransport.newDefaultHttpClient();
+ checkHttpClient(client);
+ }
+
+ private void checkHttpTransport(Apache5HttpTransport transport) {
+ assertNotNull(transport);
+ HttpClient client = transport.getHttpClient();
+ checkHttpClient(client);
+ }
+
+ private void checkHttpClient(HttpClient client) {
+ assertNotNull(client);
+ // TODO(chingor): Is it possible to test this effectively? The newer HttpClient implementations
+ // are read-only and we're testing that we built the client with the right configuration
+ }
+
+ @Test
+ public void testRequestsWithContent() throws IOException {
+ // This test confirms that we can set the content on any type of request
+ HttpClient mockClient =
+ new MockHttpClient() {
+ @Override
+ public ClassicHttpResponse executeOpen(
+ HttpHost target, ClassicHttpRequest request, HttpContext context) {
+ return new MockClassicHttpResponse();
+ }
+ };
+ Apache5HttpTransport transport = new Apache5HttpTransport(mockClient);
+
+ // Test GET.
+ execute(transport.buildRequest("GET", "http://www.test.url"));
+ // Test DELETE.
+ execute(transport.buildRequest("DELETE", "http://www.test.url"));
+ // Test HEAD.
+ execute(transport.buildRequest("HEAD", "http://www.test.url"));
+
+ // Test PATCH.
+ execute(transport.buildRequest("PATCH", "http://www.test.url"));
+ // Test PUT.
+ execute(transport.buildRequest("PUT", "http://www.test.url"));
+ // Test POST.
+ execute(transport.buildRequest("POST", "http://www.test.url"));
+ // Test PATCH.
+ execute(transport.buildRequest("PATCH", "http://www.test.url"));
+ }
+
+ private void execute(Apache5HttpRequest request) throws IOException {
+ byte[] bytes = "abc".getBytes(StandardCharsets.UTF_8);
+ request.setStreamingContent(new ByteArrayStreamingContent(bytes));
+ request.setContentType("text/html");
+ request.setContentLength(bytes.length);
+ request.execute();
+ }
+
+ @Test
+ public void testRequestShouldNotFollowRedirects() throws IOException {
+ final AtomicInteger requestsAttempted = new AtomicInteger(0);
+ HttpRequestExecutor requestExecutor =
+ new HttpRequestExecutor() {
+ @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;
+ }
+ };
+ 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());
+ }
+
+ @Test
+ public void testRequestCanSetHeaders() {
+ final AtomicBoolean interceptorCalled = new AtomicBoolean(false);
+ HttpClient client =
+ HttpClients.custom()
+ .addRequestInterceptorFirst(
+ new HttpRequestInterceptor() {
+ @Override
+ public void process(
+ HttpRequest request, EntityDetails details, HttpContext context)
+ throws HttpException, IOException {
+ Header header = request.getFirstHeader("foo");
+ assertNotNull("Should have found header", header);
+ assertEquals("bar", header.getValue());
+ interceptorCalled.set(true);
+ throw new IOException("cancelling request");
+ }
+ })
+ .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());
+ }
+ assertTrue("Expected to have called our test interceptor", interceptorCalled.get());
+ }
+
+ @Test(timeout = 10_000L)
+ public void testConnectTimeout() {
+ // TODO(chanseok): Java 17 returns an IOException (SocketException: Network is unreachable).
+ // Figure out a way to verify connection timeout works on Java 17+.
+ assumeTrue(System.getProperty("java.version").compareTo("17") < 0);
+
+ HttpTransport httpTransport = new Apache5HttpTransport();
+ GenericUrl url = new GenericUrl("http://google.com:81");
+ try {
+ httpTransport.createRequestFactory().buildGetRequest(url).setConnectTimeout(100).execute();
+ fail("should have thrown an exception");
+ } catch (HttpHostConnectException | ConnectTimeoutException expected) {
+ // expected
+ } catch (IOException e) {
+ fail("unexpected IOException: " + e.getClass().getName() + ": " + e.getMessage());
+ }
+ }
+
+ private static class FakeServer implements AutoCloseable {
+ private final HttpServer server;
+
+ FakeServer(final HttpRequestHandler httpHandler) throws IOException {
+ HttpRequestMapper mapper =
+ new HttpRequestMapper() {
+ @Override
+ public HttpRequestHandler resolve(HttpRequest request, HttpContext context)
+ throws HttpException {
+ return httpHandler;
+ };
+ };
+ server =
+ new HttpServer(
+ 0,
+ HttpService.builder()
+ .withHttpProcessor(
+ new HttpProcessor() {
+ @Override
+ public void process(
+ HttpRequest request, EntityDetails entity, HttpContext context)
+ throws HttpException, IOException {}
+
+ @Override
+ public void process(
+ HttpResponse response, EntityDetails entity, HttpContext context)
+ throws HttpException, IOException {}
+ })
+ .withHttpServerRequestHandler(new BasicHttpServerRequestHandler(mapper))
+ .build(),
+ null,
+ null,
+ null,
+ null,
+ null,
+ null);
+ // server.createContext("/", httpHandler);
+ server.start();
+ }
+
+ public int getPort() {
+ return server.getLocalPort();
+ }
+
+ @Override
+ public void close() {
+ server.initiateShutdown();
+ }
+ }
+
+ @Test
+ public void testNormalizedUrl() throws IOException {
+ final HttpRequestHandler handler =
+ new HttpRequestHandler() {
+ @Override
+ public void handle(
+ ClassicHttpRequest request, ClassicHttpResponse response, HttpContext context)
+ throws HttpException, IOException {
+ // Extract the request URI and convert to bytes
+ byte[] responseData = request.getRequestUri().getBytes(StandardCharsets.UTF_8);
+
+ // Set the response headers (status code and content length)
+ response.setCode(HttpStatus.SC_OK);
+ response.setHeader(HttpHeaders.CONTENT_LENGTH, String.valueOf(responseData.length));
+
+ // Set the response entity (body)
+ ByteArrayEntity entity = new ByteArrayEntity(responseData, ContentType.TEXT_PLAIN);
+ response.setEntity(entity);
+ }
+ };
+ try (FakeServer server = new FakeServer(handler)) {
+ HttpTransport transport = new Apache5HttpTransport();
+ GenericUrl testUrl = new GenericUrl("http://localhost/foo//bar");
+ testUrl.setPort(server.getPort());
+ com.google.api.client.http.HttpResponse response =
+ transport.createRequestFactory().buildGetRequest(testUrl).execute();
+ assertEquals(200, response.getStatusCode());
+ assertEquals("/foo//bar", response.parseAsString());
+ }
+ }
+
+ @Test
+ public void testReadErrorStream() throws IOException {
+ final HttpRequestHandler handler =
+ new HttpRequestHandler() {
+ @Override
+ public void handle(
+ ClassicHttpRequest request, ClassicHttpResponse response, HttpContext context)
+ throws HttpException, IOException {
+ byte[] responseData = "Forbidden".getBytes(StandardCharsets.UTF_8);
+ response.setCode(HttpStatus.SC_FORBIDDEN); // 403 Forbidden
+ response.setHeader(HttpHeaders.CONTENT_LENGTH, String.valueOf(responseData.length));
+ ByteArrayEntity entity = new ByteArrayEntity(responseData, ContentType.TEXT_PLAIN);
+ response.setEntity(entity);
+ }
+ };
+ try (FakeServer server = new FakeServer(handler)) {
+ HttpTransport transport = new Apache5HttpTransport();
+ GenericUrl testUrl = new GenericUrl("http://localhost/foo//bar");
+ testUrl.setPort(server.getPort());
+ com.google.api.client.http.HttpRequest getRequest =
+ transport.createRequestFactory().buildGetRequest(testUrl);
+ getRequest.setThrowExceptionOnExecuteError(false);
+ com.google.api.client.http.HttpResponse response = getRequest.execute();
+ assertEquals(403, response.getStatusCode());
+ assertEquals("Forbidden", response.parseAsString());
+ }
+ }
+
+ @Test
+ public void testReadErrorStream_withException() throws IOException {
+ final HttpRequestHandler handler =
+ new HttpRequestHandler() {
+ @Override
+ public void handle(
+ ClassicHttpRequest request, ClassicHttpResponse response, HttpContext context)
+ throws HttpException, IOException {
+ byte[] responseData = "Forbidden".getBytes(StandardCharsets.UTF_8);
+ response.setCode(HttpStatus.SC_FORBIDDEN); // 403 Forbidden
+ response.setHeader(HttpHeaders.CONTENT_LENGTH, String.valueOf(responseData.length));
+ ByteArrayEntity entity = new ByteArrayEntity(responseData, ContentType.TEXT_PLAIN);
+ response.setEntity(entity);
+ }
+ };
+ try (FakeServer server = new FakeServer(handler)) {
+ HttpTransport transport = new Apache5HttpTransport();
+ GenericUrl testUrl = new GenericUrl("http://localhost/foo//bar");
+ testUrl.setPort(server.getPort());
+ com.google.api.client.http.HttpRequest getRequest =
+ transport.createRequestFactory().buildGetRequest(testUrl);
+ try {
+ getRequest.execute();
+ Assert.fail();
+ } catch (HttpResponseException ex) {
+ assertEquals("Forbidden", ex.getContent());
+ }
+ }
+ }
+
+ private boolean isWindows() {
+ return System.getProperty("os.name").startsWith("Windows");
+ }
+}
diff --git a/google-http-client-apache-v5/src/test/java/com/google/api/client/http/apache/v5/MockClassicHttpResponse.java b/google-http-client-apache-v5/src/test/java/com/google/api/client/http/apache/v5/MockClassicHttpResponse.java
new file mode 100644
index 000000000..091721745
--- /dev/null
+++ b/google-http-client-apache-v5/src/test/java/com/google/api/client/http/apache/v5/MockClassicHttpResponse.java
@@ -0,0 +1,182 @@
+package com.google.api.client.http.apache.v5;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Locale;
+import java.util.stream.Collectors;
+import org.apache.hc.core5.http.ClassicHttpResponse;
+import org.apache.hc.core5.http.Header;
+import org.apache.hc.core5.http.HttpEntity;
+import org.apache.hc.core5.http.HttpVersion;
+import org.apache.hc.core5.http.ProtocolException;
+import org.apache.hc.core5.http.ProtocolVersion;
+
+public class MockClassicHttpResponse implements ClassicHttpResponse {
+ List headers = new ArrayList<>();
+ int code = 200;
+
+ @Override
+ public int getCode() {
+ return code;
+ }
+
+ @Override
+ public void setCode(int code) {
+ this.code = code;
+ }
+
+ @Override
+ public String getReasonPhrase() {
+ return null;
+ }
+
+ @Override
+ public void setReasonPhrase(String reason) {}
+
+ @Override
+ public Locale getLocale() {
+ return null;
+ }
+
+ @Override
+ public void setLocale(Locale loc) {}
+
+ @Override
+ public void setVersion(ProtocolVersion version) {}
+
+ @Override
+ public ProtocolVersion getVersion() {
+ return HttpVersion.HTTP_1_1;
+ }
+
+ @Override
+ public void addHeader(Header header) {
+ headers.add(header);
+ }
+
+ @Override
+ public void addHeader(String name, Object value) {
+ addHeader(newHeader(name, value));
+ }
+
+ private Header newHeader(String key, Object value) {
+ return new Header() {
+ @Override
+ public boolean isSensitive() {
+ return false;
+ }
+
+ @Override
+ public String getName() {
+ return key;
+ }
+
+ @Override
+ public String getValue() {
+ return value.toString();
+ }
+ };
+ }
+
+ @Override
+ public void setHeader(Header header) {
+ if (headers.contains(header)) {
+ int index = headers.indexOf(header);
+ headers.set(index, header);
+ } else {
+ addHeader(header);
+ }
+ }
+
+ @Override
+ public void setHeader(String name, Object value) {
+ setHeader(newHeader(name, value));
+ }
+
+ @Override
+ public void setHeaders(Header... headers) {
+ for (Header header : headers) {
+ setHeader(header);
+ }
+ }
+
+ @Override
+ public boolean removeHeader(Header header) {
+ if (headers.contains(header)) {
+ headers.remove(headers.indexOf(header));
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public boolean removeHeaders(String name) {
+ int initialSize = headers.size();
+ for (Header header :
+ headers.stream().filter(h -> h.getName() == name).collect(Collectors.toList())) {
+ removeHeader(header);
+ }
+ return headers.size() < initialSize;
+ }
+
+ @Override
+ public boolean containsHeader(String name) {
+ return headers.stream().anyMatch(h -> h.getName() == name);
+ }
+
+ @Override
+ public int countHeaders(String name) {
+ return headers.size();
+ }
+
+ @Override
+ public Header getFirstHeader(String name) {
+ return headers.stream().findFirst().orElse(null);
+ }
+
+ @Override
+ public Header getHeader(String name) throws ProtocolException {
+ return headers.stream().filter(h -> h.getName() == name).findFirst().orElse(null);
+ }
+
+ @Override
+ public Header[] getHeaders() {
+ return headers.toArray(new Header[0]);
+ }
+
+ @Override
+ public Header[] getHeaders(String name) {
+ return headers.stream()
+ .filter(h -> h.getName() == name)
+ .collect(Collectors.toList())
+ .toArray(new Header[0]);
+ }
+
+ @Override
+ public Header getLastHeader(String name) {
+ return headers.isEmpty() ? null : headers.get(headers.size() - 1);
+ }
+
+ @Override
+ public Iterator headerIterator() {
+ return headers.iterator();
+ }
+
+ @Override
+ public Iterator headerIterator(String name) {
+ return headers.stream().filter(h -> h.getName() == name).iterator();
+ }
+
+ @Override
+ public void close() throws IOException {}
+
+ @Override
+ public HttpEntity getEntity() {
+ return null;
+ }
+
+ @Override
+ public void setEntity(HttpEntity entity) {}
+}
diff --git a/google-http-client-apache-v5/src/test/java/com/google/api/client/http/apache/v5/MockHttpClient.java b/google-http-client-apache-v5/src/test/java/com/google/api/client/http/apache/v5/MockHttpClient.java
new file mode 100644
index 000000000..8d26096cf
--- /dev/null
+++ b/google-http-client-apache-v5/src/test/java/com/google/api/client/http/apache/v5/MockHttpClient.java
@@ -0,0 +1,86 @@
+package com.google.api.client.http.apache.v5;
+
+import com.google.api.client.util.Preconditions;
+import java.io.IOException;
+import org.apache.hc.client5.http.classic.HttpClient;
+import org.apache.hc.core5.http.ClassicHttpRequest;
+import org.apache.hc.core5.http.ClassicHttpResponse;
+import org.apache.hc.core5.http.HttpHost;
+import org.apache.hc.core5.http.HttpResponse;
+import org.apache.hc.core5.http.io.HttpClientResponseHandler;
+import org.apache.hc.core5.http.protocol.HttpContext;
+
+public class MockHttpClient implements HttpClient {
+
+ /** HTTP response code to use. */
+ int responseCode;
+
+ /** Returns the HTTP response code to use. */
+ public final int getResponseCode() {
+ return responseCode;
+ }
+
+ /** Sets the HTTP response code to use. */
+ public MockHttpClient setResponseCode(int responseCode) {
+ Preconditions.checkArgument(responseCode >= 0);
+ this.responseCode = responseCode;
+ return this;
+ }
+
+ @Override
+ public HttpResponse execute(ClassicHttpRequest request) throws IOException {
+ return null;
+ }
+
+ @Override
+ public HttpResponse execute(ClassicHttpRequest request, HttpContext context) throws IOException {
+ return null;
+ }
+
+ @Override
+ public ClassicHttpResponse execute(HttpHost target, ClassicHttpRequest request)
+ throws IOException {
+ return null;
+ }
+
+ @Override
+ public HttpResponse execute(HttpHost target, ClassicHttpRequest request, HttpContext context)
+ throws IOException {
+ return null;
+ }
+
+ @Override
+ public T execute(
+ ClassicHttpRequest request, HttpClientResponseHandler extends T> responseHandler)
+ throws IOException {
+ return null;
+ }
+
+ @Override
+ public T execute(
+ ClassicHttpRequest request,
+ HttpContext context,
+ HttpClientResponseHandler extends T> responseHandler)
+ throws IOException {
+ return null;
+ }
+
+ @Override
+ public T execute(
+ HttpHost target,
+ ClassicHttpRequest request,
+ HttpClientResponseHandler extends T> responseHandler)
+ throws IOException {
+ return null;
+ }
+
+ @Override
+ public T execute(
+ HttpHost target,
+ ClassicHttpRequest request,
+ HttpContext context,
+ HttpClientResponseHandler extends T> responseHandler)
+ throws IOException {
+ return null;
+ }
+}
diff --git a/google-http-client-assembly/classpath-include b/google-http-client-assembly/classpath-include
index c1bd80328..c7bbd573f 100644
--- a/google-http-client-assembly/classpath-include
+++ b/google-http-client-assembly/classpath-include
@@ -7,8 +7,8 @@
-
-
+
+
diff --git a/google-http-client-assembly/readme.html b/google-http-client-assembly/readme.html
index 5e7af564d..8a146df1e 100644
--- a/google-http-client-assembly/readme.html
+++ b/google-http-client-assembly/readme.html
@@ -135,8 +135,8 @@