You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jclouds.apache.org by ga...@apache.org on 2017/01/12 06:54:06 UTC

jclouds git commit: GetBucketLocation should use path-style requests.

Repository: jclouds
Updated Branches:
  refs/heads/master 47350e354 -> 98ea91747


GetBucketLocation should use path-style requests.

When making a GetBucketLocation request, Amazon may route the request
to the bucket region. When making it with v4 signer, the request may
fail because of the region mismatch. Concretely, a request to
test.s3.amazonaws.com may resolve to s3-us-west-2-w.amazonaws.com. The
request itself is prepared for the us-east-1 region (s3.amazonaws.com
endpoint), but then fails when the DNS resolution points to a
us-west-2 endpoint.

Bucket-in-path works around this for the GetBucketLocation requests.
That means that every GetBucketLocation request will be of the form:
https://s3.amazonaws.com/{bucket}?location. This ensures that jclouds
requests will not be subjected to Amazon's routing/DNS pointers.

Fixes: JCLOUDS-1213


Project: http://git-wip-us.apache.org/repos/asf/jclouds/repo
Commit: http://git-wip-us.apache.org/repos/asf/jclouds/commit/98ea9174
Tree: http://git-wip-us.apache.org/repos/asf/jclouds/tree/98ea9174
Diff: http://git-wip-us.apache.org/repos/asf/jclouds/diff/98ea9174

Branch: refs/heads/master
Commit: 98ea9174770693035158b5efba8efef1abe4a934
Parents: 47350e3
Author: Timur Alperovich <ti...@swiftstack.com>
Authored: Wed Jan 11 18:14:57 2017 -0800
Committer: Timur Alperovich <ti...@swiftstack.com>
Committed: Wed Jan 11 18:14:57 2017 -0800

----------------------------------------------------------------------
 apis/s3/src/main/java/org/jclouds/s3/S3Client.java        |  4 ++--
 .../java/org/jclouds/aws/s3/AWSS3ClientExpectTest.java    |  5 ++---
 .../src/test/java/org/jclouds/aws/s3/AWSS3ClientTest.java | 10 ++++------
 3 files changed, 8 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds/blob/98ea9174/apis/s3/src/main/java/org/jclouds/s3/S3Client.java
----------------------------------------------------------------------
diff --git a/apis/s3/src/main/java/org/jclouds/s3/S3Client.java b/apis/s3/src/main/java/org/jclouds/s3/S3Client.java
index cb1d9bd..7f80f3b 100644
--- a/apis/s3/src/main/java/org/jclouds/s3/S3Client.java
+++ b/apis/s3/src/main/java/org/jclouds/s3/S3Client.java
@@ -533,10 +533,10 @@ public interface S3Client extends Closeable {
    @Named("GetBucketLocation")
    @GET
    @QueryParams(keys = "location")
-   @Path("/")
+   @Path("/{bucket}")
    @Endpoint(Bucket.class)
    @XMLResponseParser(LocationConstraintHandler.class)
-   String getBucketLocation(@Bucket @BinderParam(BindAsHostPrefixIfConfigured.class) @ParamValidators(
+   String getBucketLocation(@Bucket @PathParam("bucket") @ParamValidators(
          BucketNameValidator.class) String bucketName);
 
 

http://git-wip-us.apache.org/repos/asf/jclouds/blob/98ea9174/providers/aws-s3/src/test/java/org/jclouds/aws/s3/AWSS3ClientExpectTest.java
----------------------------------------------------------------------
diff --git a/providers/aws-s3/src/test/java/org/jclouds/aws/s3/AWSS3ClientExpectTest.java b/providers/aws-s3/src/test/java/org/jclouds/aws/s3/AWSS3ClientExpectTest.java
index b4e493c..db1ed95 100644
--- a/providers/aws-s3/src/test/java/org/jclouds/aws/s3/AWSS3ClientExpectTest.java
+++ b/providers/aws-s3/src/test/java/org/jclouds/aws/s3/AWSS3ClientExpectTest.java
@@ -36,10 +36,9 @@ public class AWSS3ClientExpectTest extends BaseAWSS3ClientExpectTest {
 
    HttpRequest bucketLocationRequest = HttpRequest.builder()
                                                   .method("GET")
-                                                  .endpoint("https://test.s3.amazonaws.com/?location")
-                                                  .addHeader("Host", "test.s3.amazonaws.com")
+                                                  .endpoint("https://s3.amazonaws.com/test?location")
                                                   .addHeader("Date", CONSTANT_DATE)
-                                                  .addHeader("Authorization", "AWS identity:D1rymKrEdvzvhmZXeg+Z0R+tiug=").build();
+                                                  .addHeader("Authorization", "AWS identity:sOZnJSLuwnMVn7CiEKcVmpFI0rU=").build();
 
    HttpResponse bucketLocationResponse = HttpResponse.builder()
                                                      .statusCode(200)

http://git-wip-us.apache.org/repos/asf/jclouds/blob/98ea9174/providers/aws-s3/src/test/java/org/jclouds/aws/s3/AWSS3ClientTest.java
----------------------------------------------------------------------
diff --git a/providers/aws-s3/src/test/java/org/jclouds/aws/s3/AWSS3ClientTest.java b/providers/aws-s3/src/test/java/org/jclouds/aws/s3/AWSS3ClientTest.java
index 4d58afb..6b2f36f 100644
--- a/providers/aws-s3/src/test/java/org/jclouds/aws/s3/AWSS3ClientTest.java
+++ b/providers/aws-s3/src/test/java/org/jclouds/aws/s3/AWSS3ClientTest.java
@@ -80,8 +80,7 @@ public class AWSS3ClientTest extends S3ClientTest<AWSS3Client> {
       Invokable<?, ?> method = method(AWSS3Client.class, "getBucketLocation", String.class);
       GeneratedHttpRequest request = processor.createRequest(method, ImmutableList.<Object> of("bucket-eu-west-1"));
 
-      assertRequestLineEquals(request, "GET https://bucket-eu-west-1.s3.amazonaws.com/?location HTTP/1.1");
-      assertNonPayloadHeadersEqual(request, "Host: bucket-eu-west-1.s3.amazonaws.com\n");
+      assertRequestLineEquals(request, "GET https://s3.amazonaws.com/bucket-eu-west-1?location HTTP/1.1");
       assertPayloadEquals(request, null, null, false);
 
       assertResponseParserClassEquals(method, request, ParseSax.class);
@@ -116,16 +115,15 @@ public class AWSS3ClientTest extends S3ClientTest<AWSS3Client> {
       Invokable<?, ?> method = method(AWSS3Client.class, "getBucketLocation", String.class);
       GeneratedHttpRequest request = processor.createRequest(method, ImmutableList.<Object> of("bucket"));
 
-      assertRequestLineEquals(request, "GET https://bucket.s3.amazonaws.com/?location HTTP/1.1");
-      assertNonPayloadHeadersEqual(request, "Host: bucket.s3.amazonaws.com\n");
+      assertRequestLineEquals(request, "GET https://s3.amazonaws.com/bucket?location HTTP/1.1");
       assertPayloadEquals(request, null, null, false);
 
       request = (GeneratedHttpRequest) filter.filter(request);
 
-      assertRequestLineEquals(request, "GET https://bucket.s3.amazonaws.com/?location HTTP/1.1");
+      assertRequestLineEquals(request, "GET https://s3.amazonaws.com/bucket?location HTTP/1.1");
       assertNonPayloadHeadersEqual(
             request,
-            "Authorization: AWS identity:2fFTeYJTDwiJmaAkKj732RjNbOg=\nDate: 2009-11-08T15:54:08.897Z\nHost: bucket.s3.amazonaws.com\n");
+            "Authorization: AWS identity:f1Pt8/8Yr/HZahuc6KPI1B2+Mw4=\nDate: 2009-11-08T15:54:08.897Z\n");
       assertPayloadEquals(request, null, null, false);
 
       assertResponseParserClassEquals(method, request, ParseSax.class);