Skip to content
This repository was archived by the owner on Aug 6, 2025. It is now read-only.

Commit d3a261b

Browse files
committed
JCLOUDS-1641: Use POST instead of PATCH for GCS
Modern Java versions do not allow the reflection workaround previously used.
1 parent 6b51855 commit d3a261b

File tree

12 files changed

+36
-19
lines changed

12 files changed

+36
-19
lines changed

core/src/main/java/org/jclouds/http/internal/JavaUrlHttpCommandExecutorService.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,8 @@ private void setRequestMethodBypassingJREMethodLimitation(final HttpURLConnectio
242242
try {
243243
// SSL connections may have the HttpURLConnection wrapped inside
244244
delegateField = connectionClass.getDeclaredField("delegate");
245+
// TODO: Fails on modern Java versions:
246+
// Unable to make field private final sun.net.www.protocol.https.DelegateHttpsURLConnection sun.net.www.protocol.https.HttpsURLConnectionImpl.delegate accessible: module java.base does not "opens sun.net.www.protocol.https" to unnamed module @1ed4004b connecting to PATCH
245247
delegateField.setAccessible(true);
246248
HttpURLConnection delegateConnection = (HttpURLConnection) delegateField.get(httpURLConnection);
247249
setRequestMethodBypassingJREMethodLimitation(delegateConnection, method);

providers/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/config/GoogleCloudStorageOAuthScopes.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ public static GoogleCloudStorageOAuthScopes create() {
4747
return fullControlScopes();
4848
} else if (input.getMethod().equalsIgnoreCase("PUT") || input.getMethod().equalsIgnoreCase("PATCH")) {
4949
return fullControlScopes();
50+
} else if ("PATCH".equalsIgnoreCase(input.getFirstHeaderOrNull("X-HTTP-Method-Override"))) {
51+
return fullControlScopes();
5052
}
5153
return readOrWriteScopes().forRequest(input);
5254
}

providers/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/features/BucketAccessControlsApi.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
import org.jclouds.oauth.v2.filters.OAuthFilter;
3939
import org.jclouds.rest.annotations.BinderParam;
4040
import org.jclouds.rest.annotations.Fallback;
41-
import org.jclouds.rest.annotations.PATCH;
41+
import org.jclouds.rest.annotations.Headers;
4242
import org.jclouds.rest.annotations.RequestFilters;
4343
import org.jclouds.rest.annotations.SelectJson;
4444
import org.jclouds.rest.annotations.SkipEncoding;
@@ -162,7 +162,8 @@ BucketAccessControls updateBucketAccessControls(@PathParam("bucket") String buck
162162
* @return If successful, this method returns a BucketAccessControls resource in the response body
163163
*/
164164
@Named("BucketAccessControls:patch")
165-
@PATCH
165+
@POST
166+
@Headers(keys = "X-HTTP-Method-Override", values = "PATCH")
166167
@Produces(APPLICATION_JSON)
167168
@Path("/b/{bucket}/acl/{entity}")
168169
@Fallback(NullOnNotFoundOr404.class)

providers/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/features/BucketApi.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@
4545
import org.jclouds.oauth.v2.filters.OAuthFilter;
4646
import org.jclouds.rest.annotations.BinderParam;
4747
import org.jclouds.rest.annotations.Fallback;
48-
import org.jclouds.rest.annotations.PATCH;
48+
import org.jclouds.rest.annotations.Headers;
4949
import org.jclouds.rest.annotations.RequestFilters;
5050
import org.jclouds.rest.annotations.SkipEncoding;
5151
import org.jclouds.rest.binders.BindToJsonPayload;
@@ -250,7 +250,8 @@ Bucket updateBucket(@PathParam("bucket") String bucketName,
250250
* @return If successful, this method returns the updated {@link Bucket} resource.
251251
*/
252252
@Named("Bucket:patch")
253-
@PATCH
253+
@POST
254+
@Headers(keys = "X-HTTP-Method-Override", values = "PATCH")
254255
@Produces(APPLICATION_JSON)
255256
@Path("/b/{bucket}")
256257
@Fallback(NullOnNotFoundOr404.class)
@@ -272,7 +273,8 @@ Bucket patchBucket(@PathParam("bucket") String bucketName,
272273
* @return If successful, this method returns the updated {@link Bucket} resource.
273274
*/
274275
@Named("Bucket:patch")
275-
@PATCH
276+
@POST
277+
@Headers(keys = "X-HTTP-Method-Override", values = "PATCH")
276278
@Produces(APPLICATION_JSON)
277279
@Path("/b/{bucket}")
278280
@Fallback(NullOnNotFoundOr404.class)

providers/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/features/DefaultObjectAccessControlsApi.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
import org.jclouds.oauth.v2.filters.OAuthFilter;
4141
import org.jclouds.rest.annotations.BinderParam;
4242
import org.jclouds.rest.annotations.Fallback;
43-
import org.jclouds.rest.annotations.PATCH;
43+
import org.jclouds.rest.annotations.Headers;
4444
import org.jclouds.rest.annotations.RequestFilters;
4545
import org.jclouds.rest.annotations.SelectJson;
4646
import org.jclouds.rest.annotations.SkipEncoding;
@@ -170,7 +170,8 @@ ObjectAccessControls updateDefaultObjectAccessControls(@PathParam("bucket") Stri
170170
* Name of the bucket which contains the object
171171
*/
172172
@Named("DefaultObjectAccessControls:patch")
173-
@PATCH
173+
@POST
174+
@Headers(keys = "X-HTTP-Method-Override", values = "PATCH")
174175
@Produces(APPLICATION_JSON)
175176
@Path("/b/{bucket}/defaultObjectAcl/{entity}")
176177
@Fallback(NullOnNotFoundOr404.class)

providers/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/features/ObjectAccessControlsApi.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
import org.jclouds.oauth.v2.filters.OAuthFilter;
4040
import org.jclouds.rest.annotations.BinderParam;
4141
import org.jclouds.rest.annotations.Fallback;
42-
import org.jclouds.rest.annotations.PATCH;
42+
import org.jclouds.rest.annotations.Headers;
4343
import org.jclouds.rest.annotations.RequestFilters;
4444
import org.jclouds.rest.annotations.SelectJson;
4545
import org.jclouds.rest.binders.BindToJsonPayload;
@@ -282,7 +282,8 @@ ObjectAccessControls updateObjectAccessControls(@PathParam("bucket") String buck
282282
* @return an {@link ObjectAccessControls }
283283
*/
284284
@Named("ObjectAccessControls:patch")
285-
@PATCH
285+
@POST
286+
@Headers(keys = "X-HTTP-Method-Override", values = "PATCH")
286287
@Produces(APPLICATION_JSON)
287288
@Path("/b/{bucket}/o/{object}/acl/{entity}")
288289
ObjectAccessControls patchObjectAccessControls(@PathParam("bucket") String bucketName,
@@ -307,7 +308,8 @@ ObjectAccessControls patchObjectAccessControls(@PathParam("bucket") String bucke
307308
* @return {@link ObjectAccessControls }
308309
*/
309310
@Named("ObjectAccessControls:patch")
310-
@PATCH
311+
@POST
312+
@Headers(keys = "X-HTTP-Method-Override", values = "PATCH")
311313
@Produces(APPLICATION_JSON)
312314
@Path("/b/{bucket}/o/{object}/acl/{entity}")
313315
ObjectAccessControls patchObjectAccessControls(@PathParam("bucket") String bucketName,

providers/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/features/ObjectApi.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,8 @@
5454
import org.jclouds.oauth.v2.filters.OAuthFilter;
5555
import org.jclouds.rest.annotations.BinderParam;
5656
import org.jclouds.rest.annotations.Fallback;
57+
import org.jclouds.rest.annotations.Headers;
5758
import org.jclouds.rest.annotations.MapBinder;
58-
import org.jclouds.rest.annotations.PATCH;
5959
import org.jclouds.rest.annotations.PayloadParam;
6060
import org.jclouds.rest.annotations.QueryParams;
6161
import org.jclouds.rest.annotations.RequestFilters;
@@ -310,7 +310,8 @@ GoogleCloudStorageObject updateObject(@PathParam("bucket") String bucketName,
310310
* @return a {@link GoogleCloudStorageObject}
311311
*/
312312
@Named("Object:patch")
313-
@PATCH
313+
@POST
314+
@Headers(keys = "X-HTTP-Method-Override", values = "PATCH")
314315
@Consumes(APPLICATION_JSON)
315316
@Produces(APPLICATION_JSON)
316317
@Path("storage/v1/b/{bucket}/o/{object}")
@@ -334,7 +335,8 @@ GoogleCloudStorageObject patchObject(@PathParam("bucket") String bucketName,
334335
* @return a {@link GoogleCloudStorageObject}
335336
*/
336337
@Named("Object:patch")
337-
@PUT
338+
@POST
339+
@Headers(keys = "X-HTTP-Method-Override", values = "PATCH")
338340
@Consumes(APPLICATION_JSON)
339341
@Produces(APPLICATION_JSON)
340342
@Path("storage/v1/b/{bucket}/o/{object}")

providers/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/features/BucketAccessControlsApiExpectTest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,10 +167,11 @@ public void testUpdateBucketAclResponseIs2xx() throws Exception {
167167
public void testPatchBucketAclResponseIs2xx() throws Exception {
168168
HttpRequest patchRequest = HttpRequest
169169
.builder()
170-
.method("PATCH")
170+
.method("POST")
171171
.endpoint("https://www.googleapis.com/storage/v1/b/jcloudstestbucket/acl/allUsers")
172172
.addHeader("Accept", "application/json")
173173
.addHeader("Authorization", "Bearer " + TOKEN)
174+
.addHeader("X-HTTP-Method-Override", "PATCH")
174175
.payload(payloadFromResourceWithContentType("/bucket_acl_update_initial.json",
175176
MediaType.APPLICATION_JSON)).build();
176177

providers/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/features/BucketApiExpectTest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -212,10 +212,11 @@ public void testPatchBucketWithNoOptionsResponseIs2xx() throws Exception {
212212

213213
HttpRequest patchRequest = HttpRequest
214214
.builder()
215-
.method("PATCH")
215+
.method("POST")
216216
.endpoint("https://www.googleapis.com/storage/v1/b/" + EXPECTED_TEST_BUCKET)
217217
.addHeader("Accept", "application/json")
218218
.addHeader("Authorization", "Bearer " + TOKEN)
219+
.addHeader("X-HTTP-Method-Override", "PATCH")
219220
.payload(payloadFromResourceWithContentType("/bucket_update_request_payload.json",
220221
MediaType.APPLICATION_JSON)).build();
221222

providers/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/features/DefaultObjectAccessControlsApiExpectTest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -198,10 +198,11 @@ public void testUpdateDefaultObjectAclWithOptionsResponseIs2xx() throws Exceptio
198198
public void testPatchDefaultObjectAclWithNoOptionsResponseIs2xx() throws Exception {
199199
HttpRequest update = HttpRequest
200200
.builder()
201-
.method("PATCH")
201+
.method("POST")
202202
.endpoint("https://www.googleapis.com/storage/v1/b/jcloudstestbucket/defaultObjectAcl/allUsers")
203203
.addHeader("Accept", "application/json")
204204
.addHeader("Authorization", "Bearer " + TOKEN)
205+
.addHeader("X-HTTP-Method-Override", "PATCH")
205206
.payload(payloadFromResourceWithContentType("/default_object_acl_update_request_payload.json",
206207
MediaType.APPLICATION_JSON)).build();
207208

0 commit comments

Comments
 (0)