@@ -53,6 +53,7 @@ pub mod constants {
53
53
pub const X_AMZ_COPY_SOURCE : & str = "x-amz-copy-source" ;
54
54
55
55
pub const X_AMZ_SERVER_SIDE_ENCRYPTION : & str = "x-amz-server-side-encryption" ;
56
+ pub const X_AMZ_SERVER_REQUEST_PAYER : ( & str , & str ) = ( "x-amz-request-payer" , "requester" ) ;
56
57
pub const X_AMZ_SERVER_SIDE_ENCRYPTION_CUSTOMER_ALGORITHM : & str =
57
58
"x-amz-server-side-encryption-customer-algorithm" ;
58
59
pub const X_AMZ_SERVER_SIDE_ENCRYPTION_CUSTOMER_KEY : & str =
@@ -98,6 +99,7 @@ pub struct S3Core {
98
99
pub default_storage_class : Option < HeaderValue > ,
99
100
pub allow_anonymous : bool ,
100
101
pub disable_list_objects_v2 : bool ,
102
+ pub enable_request_payer : bool ,
101
103
102
104
pub signer : AwsV4Signer ,
103
105
pub loader : Box < dyn AwsCredentialLoad > ,
@@ -340,6 +342,19 @@ impl S3Core {
340
342
}
341
343
req
342
344
}
345
+
346
+ pub fn insert_request_payer_header (
347
+ & self ,
348
+ mut req : http:: request:: Builder ,
349
+ ) -> http:: request:: Builder {
350
+ if self . enable_request_payer {
351
+ req = req. header (
352
+ HeaderName :: from_static ( constants:: X_AMZ_SERVER_REQUEST_PAYER . 0 ) ,
353
+ HeaderValue :: from_static ( constants:: X_AMZ_SERVER_REQUEST_PAYER . 1 ) ,
354
+ ) ;
355
+ }
356
+ req
357
+ }
343
358
}
344
359
345
360
impl S3Core {
@@ -406,8 +421,11 @@ impl S3Core {
406
421
) ;
407
422
}
408
423
424
+ // Set request payer header if enabled.
425
+ req = self . insert_request_payer_header ( req) ;
426
+
409
427
// Inject operation to the request.
410
- let req = req. extension ( Operation :: Stat ) ;
428
+ req = req. extension ( Operation :: Stat ) ;
411
429
412
430
let req = req. body ( Buffer :: new ( ) ) . map_err ( new_request_build_error) ?;
413
431
@@ -487,12 +505,15 @@ impl S3Core {
487
505
) ;
488
506
}
489
507
508
+ // Set request payer header if enabled.
509
+ req = self . insert_request_payer_header ( req) ;
510
+
490
511
// Set SSE headers.
491
512
// TODO: how will this work with presign?
492
513
req = self . insert_sse_headers ( req, false ) ;
493
514
494
515
// Inject operation to the request.
495
- let req = req. extension ( Operation :: Read ) ;
516
+ req = req. extension ( Operation :: Read ) ;
496
517
497
518
let req = req. body ( Buffer :: new ( ) ) . map_err ( new_request_build_error) ?;
498
519
@@ -527,6 +548,9 @@ impl S3Core {
527
548
528
549
req = self . insert_metadata_headers ( req, size, args) ;
529
550
551
+ // Set request payer header if enabled.
552
+ req = self . insert_request_payer_header ( req) ;
553
+
530
554
// Set SSE headers.
531
555
req = self . insert_sse_headers ( req, true ) ;
532
556
@@ -537,7 +561,7 @@ impl S3Core {
537
561
}
538
562
539
563
// Inject operation to the request.
540
- let req = req. extension ( Operation :: Write ) ;
564
+ req = req. extension ( Operation :: Write ) ;
541
565
542
566
// Set body
543
567
let req = req. body ( body) . map_err ( new_request_build_error) ?;
@@ -567,11 +591,14 @@ impl S3Core {
567
591
568
592
req = req. header ( constants:: X_AMZ_WRITE_OFFSET_BYTES , position. to_string ( ) ) ;
569
593
594
+ // Set request payer header if enabled.
595
+ req = self . insert_request_payer_header ( req) ;
596
+
570
597
// Set SSE headers.
571
598
req = self . insert_sse_headers ( req, true ) ;
572
599
573
600
// Inject operation to the request.
574
- let req = req. extension ( Operation :: Write ) ;
601
+ req = req. extension ( Operation :: Write ) ;
575
602
576
603
// Set body
577
604
let req = req. body ( body) . map_err ( new_request_build_error) ?;
@@ -606,7 +633,12 @@ impl S3Core {
606
633
url. push_str ( & format ! ( "?{}" , query_args. join( "&" ) ) ) ;
607
634
}
608
635
609
- let mut req = Request :: delete ( & url)
636
+ let mut req = Request :: delete ( & url) ;
637
+
638
+ // Set request payer header if enabled.
639
+ req = self . insert_request_payer_header ( req) ;
640
+
641
+ let mut req = req
610
642
// Inject operation to the request.
611
643
. extension ( Operation :: Delete )
612
644
. body ( Buffer :: new ( ) )
@@ -665,6 +697,9 @@ impl S3Core {
665
697
)
666
698
}
667
699
700
+ // Set request payer header if enabled.
701
+ req = self . insert_request_payer_header ( req) ;
702
+
668
703
let mut req = req
669
704
// Inject operation to the request.
670
705
. extension ( Operation :: Copy )
@@ -701,7 +736,12 @@ impl S3Core {
701
736
url = url. push ( "marker" , & percent_encode_path ( marker) ) ;
702
737
}
703
738
704
- let mut req = Request :: get ( url. finish ( ) )
739
+ let mut req = Request :: get ( url. finish ( ) ) ;
740
+
741
+ // Set request payer header if enabled.
742
+ req = self . insert_request_payer_header ( req) ;
743
+
744
+ let mut req = req
705
745
// Inject operation to the request.
706
746
. extension ( Operation :: List )
707
747
. body ( Buffer :: new ( ) )
@@ -748,7 +788,12 @@ impl S3Core {
748
788
) ;
749
789
}
750
790
751
- let mut req = Request :: get ( url. finish ( ) )
791
+ let mut req = Request :: get ( url. finish ( ) ) ;
792
+
793
+ // Set request payer header if enabled.
794
+ req = self . insert_request_payer_header ( req) ;
795
+
796
+ let mut req = req
752
797
// Inject operation to the request.
753
798
. extension ( Operation :: List )
754
799
. body ( Buffer :: new ( ) )
@@ -794,14 +839,17 @@ impl S3Core {
794
839
}
795
840
}
796
841
842
+ // Set request payer header if enabled.
843
+ req = self . insert_request_payer_header ( req) ;
844
+
797
845
// Set SSE headers.
798
- let req = self . insert_sse_headers ( req, true ) ;
846
+ req = self . insert_sse_headers ( req, true ) ;
799
847
800
848
// Set SSE headers.
801
- let req = self . insert_checksum_type_header ( req) ;
849
+ req = self . insert_checksum_type_header ( req) ;
802
850
803
851
// Inject operation to the request.
804
- let req = req. extension ( Operation :: Write ) ;
852
+ req = req. extension ( Operation :: Write ) ;
805
853
806
854
let mut req = req. body ( Buffer :: new ( ) ) . map_err ( new_request_build_error) ?;
807
855
@@ -833,6 +881,9 @@ impl S3Core {
833
881
834
882
req = req. header ( CONTENT_LENGTH , size) ;
835
883
884
+ // Set request payer header if enabled.
885
+ req = self . insert_request_payer_header ( req) ;
886
+
836
887
// Set SSE headers.
837
888
req = self . insert_sse_headers ( req, true ) ;
838
889
@@ -842,7 +893,7 @@ impl S3Core {
842
893
}
843
894
844
895
// Inject operation to the request.
845
- let req = req. extension ( Operation :: Write ) ;
896
+ req = req. extension ( Operation :: Write ) ;
846
897
847
898
// Set body
848
899
let req = req. body ( body) . map_err ( new_request_build_error) ?;
@@ -865,20 +916,23 @@ impl S3Core {
865
916
percent_encode_path( upload_id)
866
917
) ;
867
918
868
- let req = Request :: post ( & url) ;
919
+ let mut req = Request :: post ( & url) ;
869
920
870
921
// Set SSE headers.
871
- let req = self . insert_sse_headers ( req, true ) ;
922
+ req = self . insert_sse_headers ( req, true ) ;
872
923
873
924
let content = quick_xml:: se:: to_string ( & CompleteMultipartUploadRequest { part : parts } )
874
925
. map_err ( new_xml_serialize_error) ?;
875
926
// Make sure content length has been set to avoid post with chunked encoding.
876
- let req = req. header ( CONTENT_LENGTH , content. len ( ) ) ;
927
+ req = req. header ( CONTENT_LENGTH , content. len ( ) ) ;
877
928
// Set content-type to `application/xml` to avoid mixed with form post.
878
- let req = req. header ( CONTENT_TYPE , "application/xml" ) ;
929
+ req = req. header ( CONTENT_TYPE , "application/xml" ) ;
930
+
931
+ // Set request payer header if enabled.
932
+ req = self . insert_request_payer_header ( req) ;
879
933
880
934
// Inject operation to the request.
881
- let req = req. extension ( Operation :: Write ) ;
935
+ req = req. extension ( Operation :: Write ) ;
882
936
883
937
let mut req = req
884
938
. body ( Buffer :: from ( Bytes :: from ( content) ) )
@@ -904,11 +958,17 @@ impl S3Core {
904
958
percent_encode_path( upload_id)
905
959
) ;
906
960
907
- let mut req = Request :: delete ( & url)
961
+ let mut req = Request :: delete ( & url) ;
962
+
963
+ // Set request payer header if enabled.
964
+ req = self . insert_request_payer_header ( req) ;
965
+
966
+ let mut req = req
908
967
// Inject operation to the request.
909
968
. extension ( Operation :: Write )
910
969
. body ( Buffer :: new ( ) )
911
970
. map_err ( new_request_build_error) ?;
971
+
912
972
self . sign ( & mut req) . await ?;
913
973
self . send ( req) . await
914
974
}
@@ -919,7 +979,7 @@ impl S3Core {
919
979
) -> Result < Response < Buffer > > {
920
980
let url = format ! ( "{}/?delete" , self . endpoint) ;
921
981
922
- let req = Request :: post ( & url) ;
982
+ let mut req = Request :: post ( & url) ;
923
983
924
984
let content = quick_xml:: se:: to_string ( & DeleteObjectsRequest {
925
985
object : paths
@@ -933,14 +993,17 @@ impl S3Core {
933
993
. map_err ( new_xml_serialize_error) ?;
934
994
935
995
// Make sure content length has been set to avoid post with chunked encoding.
936
- let req = req. header ( CONTENT_LENGTH , content. len ( ) ) ;
996
+ req = req. header ( CONTENT_LENGTH , content. len ( ) ) ;
937
997
// Set content-type to `application/xml` to avoid mixed with form post.
938
- let req = req. header ( CONTENT_TYPE , "application/xml" ) ;
998
+ req = req. header ( CONTENT_TYPE , "application/xml" ) ;
939
999
// Set content-md5 as required by API.
940
- let req = req. header ( "CONTENT-MD5" , format_content_md5 ( content. as_bytes ( ) ) ) ;
1000
+ req = req. header ( "CONTENT-MD5" , format_content_md5 ( content. as_bytes ( ) ) ) ;
1001
+
1002
+ // Set request payer header if enabled.
1003
+ req = self . insert_request_payer_header ( req) ;
941
1004
942
1005
// Inject operation to the request.
943
- let req = req. extension ( Operation :: Delete ) ;
1006
+ req = req. extension ( Operation :: Delete ) ;
944
1007
945
1008
let mut req = req
946
1009
. body ( Buffer :: from ( Bytes :: from ( content) ) )
@@ -986,7 +1049,12 @@ impl S3Core {
986
1049
. expect ( "write into string must succeed" ) ;
987
1050
}
988
1051
989
- let mut req = Request :: get ( & url)
1052
+ let mut req = Request :: get ( & url) ;
1053
+
1054
+ // Set request payer header if enabled.
1055
+ req = self . insert_request_payer_header ( req) ;
1056
+
1057
+ let mut req = req
990
1058
// Inject operation to the request.
991
1059
. extension ( Operation :: List )
992
1060
. body ( Buffer :: new ( ) )
0 commit comments