@@ -559,6 +559,19 @@ impl GetClient for AzureClient {
559
559
}
560
560
}
561
561
562
+ #[ cfg( feature = "experimental-azure-list-offset" ) ]
563
+ fn marker_for_offset ( offset : & str , is_emulator : bool ) -> String {
564
+ if is_emulator {
565
+ return offset. to_string ( ) ;
566
+ } else {
567
+ let encoded_part = BASE64_STANDARD . encode (
568
+ & format ! ( "{:06}!{} !000028!9999-12-31T23:59:59.9999999Z!" , offset. len( ) + 1 , offset)
569
+ ) . replace ( "=" , "-" ) ;
570
+ let length_string = format ! ( "{}" , encoded_part. len( ) ) ;
571
+ return format ! ( "{}!{}!{}" , length_string. len( ) , length_string, encoded_part) ;
572
+ }
573
+ }
574
+
562
575
#[ async_trait]
563
576
impl ListClient for AzureClient {
564
577
/// Make an Azure List request <https://docs.microsoft.com/en-us/rest/api/storageservices/list-blobs>
@@ -569,6 +582,7 @@ impl ListClient for AzureClient {
569
582
token : Option < & str > ,
570
583
offset : Option < & str > ,
571
584
) -> Result < ( ListResult , Option < String > ) > {
585
+ #[ cfg( not( feature = "experimental-azure-list-offset" ) ) ]
572
586
assert ! ( offset. is_none( ) ) ; // Not yet supported
573
587
574
588
let credential = self . get_credential ( ) . await ?;
@@ -586,6 +600,22 @@ impl ListClient for AzureClient {
586
600
query. push ( ( "delimiter" , DELIMITER ) )
587
601
}
588
602
603
+ #[ cfg( feature = "experimental-azure-list-offset" ) ]
604
+ let token_string = match ( token, offset) {
605
+ ( Some ( token) , _) => {
606
+ Some ( token. to_string ( ) )
607
+ }
608
+ ( None , Some ( offset) ) => {
609
+ Some ( marker_for_offset ( offset, self . config . is_emulator ) )
610
+ }
611
+ ( None , None ) => {
612
+ None
613
+ }
614
+ } ;
615
+
616
+ #[ cfg( feature = "experimental-azure-list-offset" ) ]
617
+ let token = token_string. as_deref ( ) ;
618
+
589
619
if let Some ( token) = token {
590
620
query. push ( ( "marker" , token) )
591
621
}
@@ -967,4 +997,16 @@ mod tests {
967
997
let _delegated_key_response_internal: UserDelegationKey =
968
998
quick_xml:: de:: from_str ( S ) . unwrap ( ) ;
969
999
}
1000
+
1001
+ #[ cfg( feature = "experimental-azure-list-offset" ) ]
1002
+ #[ test]
1003
+ fn test_marker_for_offset ( ) {
1004
+ // BlobStorage
1005
+ let marker = marker_for_offset ( "file.txt" , false ) ;
1006
+ assert_eq ! ( marker, "2!72!MDAwMDA5IWZpbGUudHh0ICEwMDAwMjghOTk5OS0xMi0zMVQyMzo1OTo1OS45OTk5OTk5WiE-" ) ;
1007
+
1008
+ // Azurite
1009
+ let marker = marker_for_offset ( "file.txt" , true ) ;
1010
+ assert_eq ! ( marker, "file.txt" ) ;
1011
+ }
970
1012
}
0 commit comments