This is an automated email from the ASF dual-hosted git repository.

tustvold pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/arrow-rs.git


The following commit(s) were added to refs/heads/master by this push:
     new 615dde061 Recognise R2 URLs (#4190) (#4194)
615dde061 is described below

commit 615dde061e79652594340bdce648fbec5e15ea96
Author: Raphael Taylor-Davies <[email protected]>
AuthorDate: Wed May 10 18:43:13 2023 +0100

    Recognise R2 URLs (#4190) (#4194)
---
 object_store/src/aws/mod.rs | 28 +++++++++++++++++++++++++---
 1 file changed, 25 insertions(+), 3 deletions(-)

diff --git a/object_store/src/aws/mod.rs b/object_store/src/aws/mod.rs
index 5de177afa..6ea24fb70 100644
--- a/object_store/src/aws/mod.rs
+++ b/object_store/src/aws/mod.rs
@@ -724,6 +724,7 @@ impl AmazonS3Builder {
     /// - `s3a://<bucket>/<path>`
     /// - `https://s3.<bucket>.amazonaws.com`
     /// - `https://<bucket>.s3.<region>.amazonaws.com`
+    /// - `https://ACCOUNT_ID.r2.cloudflarestorage.com/bucket`
     ///
     /// Note: Settings derived from the URL will override any others set on 
this builder
     ///
@@ -849,9 +850,8 @@ impl AmazonS3Builder {
             "https" => match host.splitn(4, '.').collect_tuple() {
                 Some(("s3", region, "amazonaws", "com")) => {
                     self.region = Some(region.to_string());
-                    if let Some(bucket) =
-                        parsed.path_segments().and_then(|mut path| path.next())
-                    {
+                    let bucket = 
parsed.path_segments().into_iter().flatten().next();
+                    if let Some(bucket) = bucket {
                         self.bucket_name = Some(bucket.into());
                     }
                 }
@@ -860,6 +860,16 @@ impl AmazonS3Builder {
                     self.region = Some(region.to_string());
                     self.virtual_hosted_style_request = true;
                 }
+                Some((account, "r2", "cloudflarestorage", "com")) => {
+                    self.region = Some("auto".to_string());
+                    let endpoint = 
format!("https://{account}.r2.cloudflarestorage.com";);
+                    self.endpoint = Some(endpoint);
+
+                    let bucket = 
parsed.path_segments().into_iter().flatten().next();
+                    if let Some(bucket) = bucket {
+                        self.bucket_name = Some(bucket.into());
+                    }
+                }
                 _ => return Err(UrlNotRecognisedSnafu { url }.build().into()),
             },
             scheme => return Err(UnknownUrlSchemeSnafu { scheme 
}.build().into()),
@@ -1556,6 +1566,18 @@ mod tests {
         assert_eq!(builder.region, Some("region".to_string()));
         assert!(builder.virtual_hosted_style_request);
 
+        let mut builder = AmazonS3Builder::new();
+        builder
+            
.parse_url("https://account123.r2.cloudflarestorage.com/bucket-123";)
+            .unwrap();
+
+        assert_eq!(builder.bucket_name, Some("bucket-123".to_string()));
+        assert_eq!(builder.region, Some("auto".to_string()));
+        assert_eq!(
+            builder.endpoint,
+            Some("https://account123.r2.cloudflarestorage.com".to_string())
+        );
+
         let err_cases = [
             "mailto://bucket/path";,
             "https://s3.bucket.mydomain.com";,

Reply via email to