Skip to content

Commit 40f074f

Browse files
authored
S3Resource improved getURL handling (#795)
1 parent c1b850a commit 40f074f

File tree

2 files changed

+10
-14
lines changed

2 files changed

+10
-14
lines changed

spring-cloud-aws-s3-parent/spring-cloud-aws-s3/src/main/java/io/awspring/cloud/s3/S3Resource.java

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20,17 +20,14 @@
2020
import java.io.InputStream;
2121
import java.io.OutputStream;
2222
import java.net.URL;
23-
import java.net.URLEncoder;
24-
import java.nio.charset.StandardCharsets;
2523
import java.time.Instant;
26-
import java.util.ArrayList;
27-
import java.util.List;
2824
import java.util.Map;
2925
import org.springframework.core.io.AbstractResource;
3026
import org.springframework.core.io.WritableResource;
3127
import org.springframework.lang.Nullable;
3228
import org.springframework.util.Assert;
3329
import software.amazon.awssdk.services.s3.S3Client;
30+
import software.amazon.awssdk.services.s3.model.GetUrlRequest;
3431
import software.amazon.awssdk.services.s3.model.HeadObjectResponse;
3532
import software.amazon.awssdk.services.s3.model.NoSuchKeyException;
3633

@@ -85,12 +82,9 @@ public S3Resource(Location location, S3Client s3Client, S3OutputStreamProvider s
8582

8683
@Override
8784
public URL getURL() throws IOException {
88-
List<String> splits = new ArrayList<>();
89-
for (String split : location.getObject().split("/")) {
90-
splits.add(URLEncoder.encode(split, StandardCharsets.UTF_8.toString()));
91-
}
92-
String encodedObjectName = String.join("/", splits);
93-
return new URL("https", location.getBucket() + ".s3.amazonaws.com", "/" + encodedObjectName);
85+
GetUrlRequest getUrlRequest = GetUrlRequest.builder().bucket(this.getLocation().getBucket())
86+
.key(this.location.getObject()).versionId(this.location.getVersion()).build();
87+
return s3Client.utilities().getUrl(getUrlRequest);
9488
}
9589

9690
@Override

spring-cloud-aws-s3-parent/spring-cloud-aws-s3/src/test/java/io/awspring/cloud/s3/S3ResourceIntegrationTests.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -150,16 +150,18 @@ void contentLengthThrowsWhenResourceDoesNotExist(S3OutputStreamProvider s3Output
150150
@TestAvailableOutputStreamProviders
151151
void returnsResourceUrl(S3OutputStreamProvider s3OutputStreamProvider) throws IOException {
152152
S3Resource resource = s3Resource("s3://first-bucket/a-file.txt", s3OutputStreamProvider);
153-
assertThat(resource.getURL().toString()).isEqualTo("https://first-bucket.s3.amazonaws.com/a-file.txt");
153+
assertThat(resource.getURL().toString())
154+
.isEqualTo("http://127.0.0.1:" + localstack.getFirstMappedPort() + "/first-bucket/a-file.txt");
154155
}
155156

156157
@TestAvailableOutputStreamProviders
157158
void returnsEncodedResourceUrlAndUri(S3OutputStreamProvider s3OutputStreamProvider)
158159
throws IOException, URISyntaxException {
159160
S3Resource resource = s3Resource("s3://first-bucket/some/[objectName]", s3OutputStreamProvider);
160-
assertThat(resource.getURL().toString())
161-
.isEqualTo("https://first-bucket.s3.amazonaws.com/some/%5BobjectName%5D");
162-
assertThat(resource.getURI()).isEqualTo(new URI("https://first-bucket.s3.amazonaws.com/some/%5BobjectName%5D"));
161+
assertThat(resource.getURL().toString()).isEqualTo(
162+
"http://127.0.0.1:" + localstack.getFirstMappedPort() + "/first-bucket/some/%5BobjectName%5D");
163+
assertThat(resource.getURI()).isEqualTo(
164+
new URI("http://127.0.0.1:" + localstack.getFirstMappedPort() + "/first-bucket/some/%5BobjectName%5D"));
163165
}
164166

165167
@TestAvailableOutputStreamProviders

0 commit comments

Comments
 (0)