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",