Skip to content

Commit 454b650

Browse files
authored
fix losing encoding prefix in ListObjectsV2 (#179)
1 parent 540a036 commit 454b650

File tree

2 files changed

+29
-14
lines changed

2 files changed

+29
-14
lines changed

local-s3-core/src/main/java/com/robothy/s3/core/service/ListObjectsV2Service.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ default ListObjectsV2Ans listObjectsV2(String bucket, String continuationToken,
4242
.isTruncated(listObjectsAns.isTruncated())
4343
.keyCount(listObjectsAns.getObjects().size() + listObjectsAns.getCommonPrefixes().size())
4444
.maxKeys(listObjectsAns.getMaxKeys())
45-
.prefix(StringUtils.isBlank(prefix) ? null : prefix)
45+
.prefix(listObjectsAns.getPrefix())
4646
.startAfter(StringUtils.isBlank(startAfter) || StringUtils.isNotBlank(continuationToken) ? null : startAfter)
4747
.objects(listObjectsAns.getObjects())
4848
.commonPrefixes(listObjectsAns.getCommonPrefixes())

local-s3-integrationtest/src/test/java/com/robothy/s3/test/ListObjectsV2IntegrationTest.java

Lines changed: 28 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ void testListAllKeys(S3Client s3) {
3333
assertNotEquals(Boolean.TRUE, result1.isTruncated());
3434
assertEquals(bucket, result1.name());
3535
assertNull(result1.nextContinuationToken());
36-
assertNull(result1.prefix());
36+
assertEquals("", result1.prefix());
3737
assertNull(result1.delimiter());
3838
assertEquals(1000, result1.maxKeys());
3939
assertNull(result1.encodingType());
@@ -65,7 +65,7 @@ void testListObjectsV2EncodingType(S3Client s3) {
6565
assertFalse(Boolean.TRUE.equals(objectsV2Result.isTruncated()));
6666
assertEquals(bucket, objectsV2Result.name());
6767
assertNull(objectsV2Result.nextContinuationToken());
68-
assertNull(objectsV2Result.prefix());
68+
assertEquals("", objectsV2Result.prefix());
6969
assertNull(objectsV2Result.delimiter());
7070
assertEquals(1000, objectsV2Result.maxKeys());
7171
assertEquals(EncodingType.URL, objectsV2Result.encodingType());
@@ -93,7 +93,7 @@ void testListObjectsV2WithDelimiter(S3Client s3) {
9393
assertEquals(bucketName, objectsV2Result.name());
9494
assertEquals(3, objectsV2Result.keyCount());
9595
assertNull(objectsV2Result.nextContinuationToken());
96-
assertNull(objectsV2Result.prefix());
96+
assertEquals("", objectsV2Result.prefix());
9797
assertEquals("/", objectsV2Result.delimiter());
9898
assertEquals(1000, objectsV2Result.maxKeys());
9999
assertNull(objectsV2Result.encodingType());
@@ -231,7 +231,7 @@ void testListObjectsV2Prefix(S3Client s3) {
231231
assertEquals(2, objectsV2Result2.contents().size());
232232
assertEquals(0, objectsV2Result2.commonPrefixes().size());
233233
assertEquals(2, objectsV2Result2.keyCount());
234-
assertNull(objectsV2Result2.prefix());
234+
assertEquals("", objectsV2Result2.prefix());
235235
assertEquals(1000, objectsV2Result2.maxKeys());
236236
assertNull(objectsV2Result2.startAfter());
237237
assertNull(objectsV2Result2.nextContinuationToken());
@@ -292,7 +292,7 @@ void testListObjectsV2WithContinuationToken(S3Client s3) {
292292
assertEquals(2, objectsV2Result.keyCount());
293293
assertEquals(2, objectsV2Result.maxKeys());
294294
assertNotNull(objectsV2Result.nextContinuationToken());
295-
assertNull(objectsV2Result.prefix());
295+
assertEquals("", objectsV2Result.prefix());
296296
assertNull(objectsV2Result.delimiter());
297297
assertNull(objectsV2Result.encodingType());
298298
assertNull(objectsV2Result.continuationToken());
@@ -308,7 +308,7 @@ void testListObjectsV2WithContinuationToken(S3Client s3) {
308308
assertEquals(2, objectsV2Result1.keyCount());
309309
assertEquals(1000, objectsV2Result1.maxKeys());
310310
assertNull(objectsV2Result1.nextContinuationToken());
311-
assertNull(objectsV2Result1.prefix());
311+
assertEquals("", objectsV2Result1.prefix());
312312
assertNull(objectsV2Result1.delimiter());
313313
assertNull(objectsV2Result1.encodingType());
314314
assertEquals(objectsV2Result.nextContinuationToken(), objectsV2Result1.continuationToken());
@@ -327,7 +327,7 @@ void testListObjectsV2WithContinuationToken(S3Client s3) {
327327
assertEquals(1, objectsV2Result2.keyCount());
328328
assertEquals(1, objectsV2Result2.maxKeys());
329329
assertNotNull(objectsV2Result2.nextContinuationToken());
330-
assertNull(objectsV2Result2.prefix());
330+
assertEquals("", objectsV2Result2.prefix());
331331
assertNull(objectsV2Result2.delimiter());
332332
assertNull(objectsV2Result2.encodingType());
333333
assertEquals(objectsV2Result.nextContinuationToken(), objectsV2Result2.continuationToken());
@@ -344,7 +344,7 @@ void testListObjectsV2WithContinuationToken(S3Client s3) {
344344
assertEquals(1, objectsV2Result3.keyCount());
345345
assertEquals(1000, objectsV2Result3.maxKeys());
346346
assertNull(objectsV2Result3.nextContinuationToken());
347-
assertNull(objectsV2Result3.prefix());
347+
assertEquals("", objectsV2Result3.prefix());
348348
assertNull(objectsV2Result3.delimiter());
349349
assertNull(objectsV2Result3.encodingType());
350350
assertEquals(objectsV2Result2.nextContinuationToken(), objectsV2Result3.continuationToken());
@@ -379,7 +379,7 @@ void testContinuationTokenWithDelimiter(S3Client s3) {
379379
assertEquals(2, objectsV2Result1.keyCount());
380380
assertEquals(1000, objectsV2Result1.maxKeys());
381381
assertNull(objectsV2Result1.nextContinuationToken());
382-
assertNull(objectsV2Result1.prefix());
382+
assertEquals("", objectsV2Result1.prefix());
383383
assertNull(objectsV2Result1.delimiter());
384384
assertNull(objectsV2Result1.encodingType());
385385
assertEquals(objectsV2Result.nextContinuationToken(), objectsV2Result1.continuationToken());
@@ -402,7 +402,7 @@ void testContinuationTokenWithStartAfter(S3Client s3) {
402402
assertEquals(1, objectsV2Result.keyCount());
403403
assertEquals(1, objectsV2Result.maxKeys());
404404
assertNotNull(objectsV2Result.nextContinuationToken());
405-
assertNull(objectsV2Result.prefix());
405+
assertEquals("", objectsV2Result.prefix());
406406
assertNull(objectsV2Result.delimiter());
407407
assertNull(objectsV2Result.encodingType());
408408
assertNull(objectsV2Result.continuationToken());
@@ -422,7 +422,7 @@ void testContinuationTokenWithStartAfter(S3Client s3) {
422422
assertEquals(1, objectsV2Result1.keyCount());
423423
assertEquals(1, objectsV2Result1.maxKeys());
424424
assertNotNull(objectsV2Result1.nextContinuationToken());
425-
assertNull(objectsV2Result1.prefix());
425+
assertEquals("", objectsV2Result1.prefix());
426426
assertNull(objectsV2Result1.delimiter());
427427
assertNull(objectsV2Result1.encodingType());
428428
assertEquals(objectsV2Result.nextContinuationToken(), objectsV2Result1.continuationToken());
@@ -442,15 +442,30 @@ void testContinuationTokenWithStartAfter(S3Client s3) {
442442
assertEquals(1, objectsV2Result2.keyCount());
443443
assertEquals(1, objectsV2Result2.maxKeys());
444444
assertNotNull(objectsV2Result2.nextContinuationToken());
445-
assertNull(objectsV2Result2.prefix());
445+
assertEquals("", objectsV2Result2.prefix());
446446
assertNull(objectsV2Result2.delimiter());
447447
assertNull(objectsV2Result2.encodingType());
448448
assertEquals(objectsV2Result1.nextContinuationToken(), objectsV2Result2.continuationToken());
449449
assertNull(objectsV2Result1.startAfter());
450450
assertEquals("dir2@key1", objectsV2Result2.contents().get(0).key());
451451
}
452452

453-
//@Test
453+
@LocalS3
454+
@Test
455+
void testListObjectsWithSpecialCharsInPrefix(S3Client s3) throws Exception {
456+
String bucketName = prepareKeys(s3, "é/key1");
457+
ListObjectsV2Response objectsV2Result = s3.listObjectsV2(ListObjectsV2Request.builder()
458+
.bucket(bucketName)
459+
.prefix("é/")
460+
.encodingType(EncodingType.URL)
461+
.build());
462+
assertEquals(1, objectsV2Result.contents().size());
463+
assertEquals(0, objectsV2Result.commonPrefixes().size());
464+
assertEquals(1, objectsV2Result.keyCount());
465+
assertEquals("é/", objectsV2Result.prefix());
466+
}
467+
468+
// @Test
454469
void test() {
455470
S3Client s3 = S3Client.builder()
456471
.credentialsProvider(StaticCredentialsProvider.create(AwsBasicCredentials.create("", "")))

0 commit comments

Comments
 (0)