14
14
import com .sun .net .httpserver .HttpExchange ;
15
15
import com .sun .net .httpserver .HttpPrincipal ;
16
16
17
+ import org .elasticsearch .common .Randomness ;
17
18
import org .elasticsearch .common .Strings ;
18
19
import org .elasticsearch .common .bytes .BytesArray ;
19
20
import org .elasticsearch .common .bytes .BytesReference ;
28
29
import java .net .InetSocketAddress ;
29
30
import java .net .URI ;
30
31
import java .nio .charset .StandardCharsets ;
32
+ import java .util .ArrayList ;
31
33
import java .util .List ;
32
34
import java .util .Objects ;
33
35
@@ -45,63 +47,81 @@ public void testRejectsBadUri() {
45
47
);
46
48
}
47
49
50
+ private static void assertListObjectsResponse (
51
+ S3HttpHandler handler ,
52
+ @ Nullable String prefix ,
53
+ @ Nullable String delimiter ,
54
+ String expectedResponse
55
+ ) {
56
+ final var queryParts = new ArrayList <String >(3 );
57
+ if (prefix != null ) {
58
+ queryParts .add ("prefix=" + prefix );
59
+ }
60
+ if (delimiter != null ) {
61
+ queryParts .add ("delimiter=" + delimiter );
62
+ }
63
+ if (randomBoolean ()) {
64
+ // test both ListObjects and ListObjectsV2 - they only differ in terms of pagination but S3HttpHandler doesn't do that
65
+ queryParts .add ("list-type=2" );
66
+ }
67
+ Randomness .shuffle (queryParts );
68
+
69
+ final var requestUri = "/bucket" + randomFrom ("" , "/" ) + (queryParts .isEmpty () ? "" : "?" + String .join ("&" , queryParts ));
70
+ assertEquals ("GET " + requestUri , new TestHttpResponse (RestStatus .OK , expectedResponse ), handleRequest (handler , "GET" , requestUri ));
71
+ }
72
+
48
73
public void testSimpleObjectOperations () {
49
74
final var handler = new S3HttpHandler ("bucket" , "path" );
50
75
51
76
assertEquals (RestStatus .NOT_FOUND , handleRequest (handler , "GET" , "/bucket/path/blob" ).status ());
52
77
53
- assertEquals (
54
- new TestHttpResponse (RestStatus .OK , """
55
- <?xml version="1.0" encoding="UTF-8"?><ListBucketResult><Prefix></Prefix></ListBucketResult>""" ),
56
- handleRequest (handler , "GET" , "/bucket/?prefix=" )
57
- );
78
+ assertListObjectsResponse (handler , "" , null , """
79
+ <?xml version="1.0" encoding="UTF-8"?><ListBucketResult><Prefix></Prefix><IsTruncated>false</IsTruncated>\
80
+ </ListBucketResult>""" );
58
81
59
82
final var body = randomAlphaOfLength (50 );
60
83
assertEquals (RestStatus .OK , handleRequest (handler , "PUT" , "/bucket/path/blob" , body ).status ());
61
84
assertEquals (new TestHttpResponse (RestStatus .OK , body ), handleRequest (handler , "GET" , "/bucket/path/blob" ));
62
85
63
- assertEquals ( new TestHttpResponse ( RestStatus . OK , """
64
- <?xml version="1.0" encoding="UTF-8"?><ListBucketResult><Prefix></Prefix>\
86
+ assertListObjectsResponse ( handler , "" , null , """
87
+ <?xml version="1.0" encoding="UTF-8"?><ListBucketResult><Prefix></Prefix><IsTruncated>false</IsTruncated> \
65
88
<Contents><Key>path/blob</Key><Size>50</Size></Contents>\
66
- </ListBucketResult>""" ), handleRequest ( handler , "GET" , "/bucket/?prefix=" )) ;
89
+ </ListBucketResult>""" );
67
90
68
- assertEquals ( new TestHttpResponse ( RestStatus . OK , """
69
- <?xml version="1.0" encoding="UTF-8"?><ListBucketResult><Prefix>path/</Prefix>\
91
+ assertListObjectsResponse ( handler , "path/" , null , """
92
+ <?xml version="1.0" encoding="UTF-8"?><ListBucketResult><Prefix>path/</Prefix><IsTruncated>false</IsTruncated> \
70
93
<Contents><Key>path/blob</Key><Size>50</Size></Contents>\
71
- </ListBucketResult>""" ), handleRequest ( handler , "GET" , "/bucket/?prefix=path/" )) ;
94
+ </ListBucketResult>""" );
72
95
73
- assertEquals (
74
- new TestHttpResponse (RestStatus .OK , """
75
- <?xml version="1.0" encoding="UTF-8"?><ListBucketResult><Prefix>path/other</Prefix></ListBucketResult>""" ),
76
- handleRequest (handler , "GET" , "/bucket/?prefix=path/other" )
77
- );
96
+ assertListObjectsResponse (handler , "path/other" , null , """
97
+ <?xml version="1.0" encoding="UTF-8"?><ListBucketResult><Prefix>path/other</Prefix><IsTruncated>false</IsTruncated>\
98
+ </ListBucketResult>""" );
78
99
79
100
assertEquals (RestStatus .OK , handleRequest (handler , "PUT" , "/bucket/path/subpath1/blob" , randomAlphaOfLength (50 )).status ());
80
101
assertEquals (RestStatus .OK , handleRequest (handler , "PUT" , "/bucket/path/subpath2/blob" , randomAlphaOfLength (50 )).status ());
81
- assertEquals (new TestHttpResponse (RestStatus .OK , """
82
- <?xml version="1.0" encoding="UTF-8"?><ListBucketResult><Prefix>path/</Prefix>\
83
- <Delimiter>/</Delimiter><Contents><Key>path/blob</Key><Size>50</Size></Contents>\
102
+ assertListObjectsResponse (handler , "path/" , "/" , """
103
+ <?xml version="1.0" encoding="UTF-8"?><ListBucketResult>\
104
+ <Prefix>path/</Prefix><Delimiter>/</Delimiter><IsTruncated>false</IsTruncated>\
105
+ <Contents><Key>path/blob</Key><Size>50</Size></Contents>\
84
106
<CommonPrefixes><Prefix>path/subpath1/</Prefix></CommonPrefixes>\
85
107
<CommonPrefixes><Prefix>path/subpath2/</Prefix></CommonPrefixes>\
86
- </ListBucketResult>""" ), handleRequest ( handler , "GET" , "/bucket/?delimiter=/&prefix=path/" )) ;
108
+ </ListBucketResult>""" );
87
109
88
110
assertEquals (RestStatus .OK , handleRequest (handler , "DELETE" , "/bucket/path/blob" ).status ());
89
111
assertEquals (RestStatus .NO_CONTENT , handleRequest (handler , "DELETE" , "/bucket/path/blob" ).status ());
90
112
91
- assertEquals ( new TestHttpResponse ( RestStatus . OK , """
92
- <?xml version="1.0" encoding="UTF-8"?><ListBucketResult><Prefix></Prefix>\
113
+ assertListObjectsResponse ( handler , "" , null , """
114
+ <?xml version="1.0" encoding="UTF-8"?><ListBucketResult><Prefix></Prefix><IsTruncated>false</IsTruncated> \
93
115
<Contents><Key>path/subpath1/blob</Key><Size>50</Size></Contents>\
94
116
<Contents><Key>path/subpath2/blob</Key><Size>50</Size></Contents>\
95
- </ListBucketResult>""" ), handleRequest ( handler , "GET" , "/bucket/?prefix=" )) ;
117
+ </ListBucketResult>""" );
96
118
97
119
assertEquals (RestStatus .OK , handleRequest (handler , "DELETE" , "/bucket/path/subpath1/blob" ).status ());
98
120
assertEquals (RestStatus .OK , handleRequest (handler , "DELETE" , "/bucket/path/subpath2/blob" ).status ());
99
121
100
- assertEquals (
101
- new TestHttpResponse (RestStatus .OK , """
102
- <?xml version="1.0" encoding="UTF-8"?><ListBucketResult><Prefix></Prefix></ListBucketResult>""" ),
103
- handleRequest (handler , "GET" , "/bucket/?prefix=" )
104
- );
122
+ assertListObjectsResponse (handler , "" , null , """
123
+ <?xml version="1.0" encoding="UTF-8"?><ListBucketResult><Prefix></Prefix><IsTruncated>false</IsTruncated>\
124
+ </ListBucketResult>""" );
105
125
}
106
126
107
127
public void testGetWithBytesRange () {
@@ -216,10 +236,10 @@ public void testSingleMultipartUpload() {
216
236
</CompleteMultipartUpload>""" , part1Etag , part2Etag ))
217
237
);
218
238
219
- assertEquals ( new TestHttpResponse ( RestStatus . OK , """
220
- <?xml version="1.0" encoding="UTF-8"?><ListBucketResult><Prefix></Prefix>\
239
+ assertListObjectsResponse ( handler , "" , null , """
240
+ <?xml version="1.0" encoding="UTF-8"?><ListBucketResult><Prefix></Prefix><IsTruncated>false</IsTruncated> \
221
241
<Contents><Key>path/blob</Key><Size>100</Size></Contents>\
222
- </ListBucketResult>""" ), handleRequest ( handler , "GET" , "/bucket/?prefix=" )) ;
242
+ </ListBucketResult>""" );
223
243
224
244
assertEquals (new TestHttpResponse (RestStatus .OK , part1 + part2 ), handleRequest (handler , "GET" , "/bucket/path/blob" ));
225
245
0 commit comments