diff --git a/.changes/next-release/bugfix-AmazonS3-3b61c48.json b/.changes/next-release/bugfix-AmazonS3-3b61c48.json new file mode 100644 index 000000000000..2d769593c561 --- /dev/null +++ b/.changes/next-release/bugfix-AmazonS3-3b61c48.json @@ -0,0 +1,6 @@ +{ + "category": "Amazon S3", + "contributor": "", + "type": "bugfix", + "description": "Fixed an issue that resulted in a NullPointerException when an invalid or global region was used on an S3 client. Fixes [#2885](https://github.com/aws/aws-sdk-java-v2/issues/2885)." +} diff --git a/services/s3/src/it/java/software/amazon/awssdk/services/s3/ListBucketsIntegrationTest.java b/services/s3/src/it/java/software/amazon/awssdk/services/s3/ListBucketsIntegrationTest.java new file mode 100644 index 000000000000..6bc78b9fce93 --- /dev/null +++ b/services/s3/src/it/java/software/amazon/awssdk/services/s3/ListBucketsIntegrationTest.java @@ -0,0 +1,28 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). + * You may not use this file except in compliance with the License. + * A copy of the License is located at + * + * http://aws.amazon.com/apache2.0 + * + * or in the "license" file accompanying this file. This file 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 software.amazon.awssdk.services.s3; + +import org.junit.Test; +import software.amazon.awssdk.regions.Region; + +public class ListBucketsIntegrationTest extends S3IntegrationTestBase { + @Test + public void listBuckets_InGlobal_DoesNotThrowException() { + try (S3Client s3 = s3ClientBuilder().region(Region.AWS_GLOBAL).build()) { + s3.listBuckets(); + } + } +} diff --git a/services/s3/src/main/java/software/amazon/awssdk/services/s3/internal/endpoints/S3BucketEndpointResolver.java b/services/s3/src/main/java/software/amazon/awssdk/services/s3/internal/endpoints/S3BucketEndpointResolver.java index ea11e64b5395..fc1612d75cdf 100644 --- a/services/s3/src/main/java/software/amazon/awssdk/services/s3/internal/endpoints/S3BucketEndpointResolver.java +++ b/services/s3/src/main/java/software/amazon/awssdk/services/s3/internal/endpoints/S3BucketEndpointResolver.java @@ -26,6 +26,7 @@ import java.net.URI; import software.amazon.awssdk.annotations.SdkInternalApi; import software.amazon.awssdk.http.SdkHttpRequest; +import software.amazon.awssdk.regions.PartitionMetadata; import software.amazon.awssdk.regions.RegionMetadata; import software.amazon.awssdk.services.s3.S3Configuration; import software.amazon.awssdk.services.s3.internal.BucketUtils; @@ -69,7 +70,10 @@ public ConfiguredS3SdkHttpRequest applyEndpointConfiguration(S3EndpointResolverC private static URI resolveEndpoint(S3EndpointResolverContext context) { SdkHttpRequest request = context.request(); String protocol = request.protocol(); - String dnsSuffixWithoutTagConsideration = RegionMetadata.of(context.region()).domain(); + RegionMetadata regionMetadata = RegionMetadata.of(context.region()); + String dnsSuffixWithoutTagConsideration = regionMetadata != null ? + regionMetadata.domain() : + PartitionMetadata.of(context.region()).dnsSuffix(); S3Configuration serviceConfiguration = context.serviceConfiguration(); boolean useAccelerate = isAccelerateEnabled(serviceConfiguration) && isAccelerateSupported(context.originalRequest()); diff --git a/services/s3/src/test/java/software/amazon/awssdk/services/s3/InvalidRegionTest.java b/services/s3/src/test/java/software/amazon/awssdk/services/s3/InvalidRegionTest.java index 467f949301dd..029d6ef6c5d0 100644 --- a/services/s3/src/test/java/software/amazon/awssdk/services/s3/InvalidRegionTest.java +++ b/services/s3/src/test/java/software/amazon/awssdk/services/s3/InvalidRegionTest.java @@ -22,6 +22,7 @@ import software.amazon.awssdk.auth.credentials.AnonymousCredentialsProvider; import software.amazon.awssdk.core.exception.SdkClientException; import software.amazon.awssdk.regions.Region; +import software.amazon.awssdk.services.s3.model.HeadBucketRequest; import software.amazon.awssdk.services.s3.presigner.S3Presigner; public class InvalidRegionTest { @@ -47,6 +48,17 @@ public void invalidS3UtilitiesRegionAtRequestGivesHelpfulMessage() { .hasMessageContaining("us-west-2"); } + @Test + public void nonExistentRegionGivesHelpfulMessage() { + S3Client s3Client = S3Client.builder() + .region(Region.of("does-not-exist")) + .credentialsProvider(AnonymousCredentialsProvider.create()) + .build(); + assertThatThrownBy(() -> s3Client.headBucket(HeadBucketRequest.builder().bucket("myBucket").build())) + .isInstanceOf(SdkClientException.class) + .hasMessageContaining("UnknownHostException"); + } + @Test public void invalidS3ArnRegionAtRequestGivesHelpfulMessage() { S3Client client = S3Client.builder()