30
30
import software .amazon .awssdk .auth .credentials .AwsCredentials ;
31
31
import software .amazon .awssdk .auth .signer .AwsS3V4Signer ;
32
32
import software .amazon .awssdk .awscore .AwsRequestOverrideConfiguration ;
33
- import software .amazon .awssdk .core .client .config .ClientOverrideConfiguration ;
34
33
import software .amazon .awssdk .core .signer .NoOpSigner ;
35
34
import software .amazon .awssdk .regions .Region ;
36
35
import software .amazon .awssdk .services .s3 .model .RequestPayer ;
41
40
@ RunWith (MockitoJUnitRunner .class )
42
41
public class S3PresignerTest {
43
42
private static final URI FAKE_URL ;
43
+ private static final String BUCKET = "some-bucket" ;
44
44
45
45
private S3Presigner presigner ;
46
46
@@ -64,8 +64,12 @@ private S3Presigner.Builder presignerBuilder() {
64
64
.credentialsProvider (() -> AwsBasicCredentials .create ("x" , "x" ));
65
65
}
66
66
67
+
67
68
private S3Presigner generateMaximal () {
68
69
return S3Presigner .builder ()
70
+ .serviceConfiguration (S3Configuration .builder ()
71
+ .checksumValidationEnabled (false )
72
+ .build ())
69
73
.credentialsProvider (() -> AwsBasicCredentials .create ("x" , "x" ))
70
74
.region (Region .US_EAST_1 )
71
75
.endpointOverride (FAKE_URL )
@@ -325,4 +329,128 @@ public void putObject_Sigv4PresignerHonorsSignatureDuration() {
325
329
assertThat (Integer .parseInt (expires )).isCloseTo (1234 , Offset .offset (2 ));
326
330
});
327
331
}
332
+
333
+ @ Test
334
+ public void getObject_S3ConfigurationCanBeOverriddenToLeverageTransferAcceleration () {
335
+ S3Presigner presigner = presignerBuilder ().serviceConfiguration (S3Configuration .builder ()
336
+ .accelerateModeEnabled (true )
337
+ .build ())
338
+ .build ();
339
+
340
+ PresignedGetObjectRequest presignedRequest =
341
+ presigner .presignGetObject (r -> r .signatureDuration (Duration .ofMinutes (5 ))
342
+ .getObjectRequest (go -> go .bucket ("foo34343434" )
343
+ .key ("bar" )));
344
+
345
+
346
+ System .out .println (presignedRequest .url ());
347
+
348
+ assertThat (presignedRequest .httpRequest ().host ()).contains (".s3-accelerate." );
349
+ }
350
+
351
+
352
+ @ Test
353
+ public void accelerateEnabled_UsesVirtualAddressingWithAccelerateEndpoint () {
354
+ S3Presigner presigner = presignerBuilder ().serviceConfiguration (S3Configuration .builder ()
355
+ .accelerateModeEnabled (true )
356
+ .build ())
357
+ .build ();
358
+
359
+ PresignedGetObjectRequest presignedRequest =
360
+ presigner .presignGetObject (r -> r .signatureDuration (Duration .ofMinutes (5 ))
361
+ .getObjectRequest (go -> go .bucket (BUCKET )
362
+ .key ("bar" )));
363
+
364
+ assertThat (presignedRequest .httpRequest ().host ()).isEqualTo (String .format ("%s.s3-accelerate.amazonaws.com" , BUCKET ));
365
+ }
366
+
367
+ /**
368
+ * Dualstack uses regional endpoints that support virtual addressing.
369
+ */
370
+ @ Test
371
+ public void dualstackEnabled_UsesVirtualAddressingWithDualstackEndpoint () throws Exception {
372
+ S3Presigner presigner = presignerBuilder ().serviceConfiguration (S3Configuration .builder ()
373
+ .dualstackEnabled (true )
374
+ .build ())
375
+ .build ();
376
+
377
+ PresignedGetObjectRequest presignedRequest =
378
+ presigner .presignGetObject (r -> r .signatureDuration (Duration .ofMinutes (5 ))
379
+ .getObjectRequest (go -> go .bucket (BUCKET )
380
+ .key ("bar" )));
381
+
382
+ assertThat (presignedRequest .httpRequest ().host ()).contains (String .format ("%s.s3.dualstack.us-west-2.amazonaws.com" , BUCKET ));
383
+ }
384
+
385
+ /**
386
+ * Dualstack also supports path style endpoints just like the normal endpoints.
387
+ */
388
+ @ Test
389
+ public void dualstackAndPathStyleEnabled_UsesPathStyleAddressingWithDualstackEndpoint () throws Exception {
390
+ S3Presigner presigner = presignerBuilder ().serviceConfiguration (S3Configuration .builder ()
391
+ .dualstackEnabled (true )
392
+ .pathStyleAccessEnabled (true )
393
+ .build ())
394
+ .build ();
395
+
396
+ PresignedGetObjectRequest presignedRequest =
397
+ presigner .presignGetObject (r -> r .signatureDuration (Duration .ofMinutes (5 ))
398
+ .getObjectRequest (go -> go .bucket (BUCKET )
399
+ .key ("bar" )));
400
+
401
+ assertThat (presignedRequest .httpRequest ().host ()).isEqualTo ("s3.dualstack.us-west-2.amazonaws.com" );
402
+ assertThat (presignedRequest .url ().toString ()).startsWith (String .format ("https://s3.dualstack.us-west-2.amazonaws.com/%s/%s?" , BUCKET , "bar" ));
403
+ }
404
+
405
+ /**
406
+ * When dualstack and accelerate are both enabled there is a special, global dualstack endpoint we must use.
407
+ */
408
+ @ Test
409
+ public void dualstackAndAccelerateEnabled_UsesDualstackAccelerateEndpoint () throws Exception {
410
+ S3Presigner presigner = presignerBuilder ().serviceConfiguration (S3Configuration .builder ()
411
+ .dualstackEnabled (true )
412
+ .accelerateModeEnabled (true )
413
+ .build ())
414
+ .build ();
415
+
416
+ PresignedGetObjectRequest presignedRequest =
417
+ presigner .presignGetObject (r -> r .signatureDuration (Duration .ofMinutes (5 ))
418
+ .getObjectRequest (go -> go .bucket (BUCKET )
419
+ .key ("bar" )));
420
+
421
+ assertThat (presignedRequest .httpRequest ().host ()).isEqualTo (String .format ("%s.s3-accelerate.dualstack.amazonaws.com" , BUCKET ));
422
+ }
423
+
424
+ @ Test
425
+ public void accessPointArn_differentRegion_useArnRegionTrue () throws Exception {
426
+ String customEndpoint = "https://foobar-12345678910.s3-accesspoint.us-west-2.amazonaws.com" ;
427
+ String accessPointArn = "arn:aws:s3:us-west-2:12345678910:accesspoint:foobar" ;
428
+
429
+ S3Presigner presigner = presignerBuilder ().serviceConfiguration (S3Configuration .builder ()
430
+ .useArnRegionEnabled (true )
431
+ .build ())
432
+ .build ();
433
+
434
+ PresignedGetObjectRequest presignedRequest =
435
+ presigner .presignGetObject (r -> r .signatureDuration (Duration .ofMinutes (5 ))
436
+ .getObjectRequest (go -> go .bucket (accessPointArn )
437
+ .key ("bar" )));
438
+
439
+ assertThat (presignedRequest .url ().toString ()).startsWith (customEndpoint );
440
+ }
441
+
442
+ @ Test
443
+ public void accessPointArn_differentRegion_useArnRegionFalse_throwsIllegalArgumentException () throws Exception {
444
+ String accessPointArn = "arn:aws:s3:us-east-1:12345678910:accesspoint:foobar" ;
445
+
446
+ S3Presigner presigner = presignerBuilder ().serviceConfiguration (S3Configuration .builder ()
447
+ .useArnRegionEnabled (false )
448
+ .build ())
449
+ .build ();
450
+
451
+ assertThatThrownBy (() -> presigner .presignGetObject (r -> r .signatureDuration (Duration .ofMinutes (5 ))
452
+ .getObjectRequest (go -> go .bucket (accessPointArn ).key ("bar" ))))
453
+ .isInstanceOf (IllegalArgumentException .class )
454
+ .hasMessageContaining ("region" );
455
+ }
328
456
}
0 commit comments