Skip to content

Commit 300cbf9

Browse files
authored
Fixed NullPointerException in S3 thrown when null metadata value is provided. (#5238)
1 parent 7436fdb commit 300cbf9

File tree

3 files changed

+29
-2
lines changed

3 files changed

+29
-2
lines changed
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"type": "bugfix",
3+
"category": "Amazon S3",
4+
"contributor": "",
5+
"description": "Fixed NullPointerException in S3 thrown when null metadata value is provided."
6+
}

services/s3/src/main/java/software/amazon/awssdk/services/s3/internal/handlers/ObjectMetadataInterceptor.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@
1515

1616
package software.amazon.awssdk.services.s3.internal.handlers;
1717

18+
import java.util.HashMap;
1819
import java.util.Map;
19-
import java.util.stream.Collectors;
2020
import software.amazon.awssdk.annotations.SdkInternalApi;
2121
import software.amazon.awssdk.core.SdkRequest;
2222
import software.amazon.awssdk.core.interceptor.Context;
@@ -69,6 +69,6 @@ private CreateMultipartUploadRequest trimMetadataNames(CreateMultipartUploadRequ
6969

7070
private Map<String, String> trimKeys(Map<String, String> map) {
7171
return map.entrySet().stream()
72-
.collect(Collectors.toMap(e -> StringUtils.trim(e.getKey()), Map.Entry::getValue));
72+
.collect(HashMap::new, (m, e) -> m.put(StringUtils.trim(e.getKey()), e.getValue()), HashMap::putAll);
7373
}
7474
}

services/s3/src/test/java/software/amazon/awssdk/services/s3/internal/handlers/ObjectMetadataInterceptorTest.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import static org.mockito.Mockito.mock;
2121
import static org.mockito.Mockito.when;
2222

23+
import java.util.HashMap;
2324
import java.util.List;
2425
import java.util.Map;
2526
import java.util.stream.Collectors;
@@ -71,6 +72,26 @@ public void modifyRequest_putObject_metadataKeysAreTrimmed(TestCase tc) {
7172
assertThat(modified.metadata().keySet()).containsExactlyElementsOf(tc.expectedKeys);
7273
}
7374

75+
@Test
76+
public void modifyRequest_putObjectMetadataValueNull_shouldNotThrowException() {
77+
Map<String, String> metadata = new HashMap<>();
78+
metadata.put("key", null);
79+
80+
Context.ModifyHttpRequest ctx = mock(Context.ModifyHttpRequest.class);
81+
82+
PutObjectRequest put = PutObjectRequest.builder()
83+
.metadata(metadata)
84+
.build();
85+
86+
when(ctx.request()).thenReturn(put);
87+
88+
ExecutionAttributes attrs = new ExecutionAttributes();
89+
attrs.putAttribute(SdkExecutionAttribute.OPERATION_NAME, "PutObject");
90+
91+
PutObjectRequest modified = (PutObjectRequest) INTERCEPTOR.modifyRequest(ctx, attrs);
92+
assertThat(modified.metadata().entrySet()).containsExactlyElementsOf(metadata.entrySet());
93+
}
94+
7495
@ParameterizedTest
7596
@MethodSource("testCases")
7697
public void modifyRequest_creatMultipartUpload_metadataKeysAreTrimmed(TestCase tc) {

0 commit comments

Comments
 (0)