in src/aws/builder.rs [642:685]
fn parse_url(&mut self, url: &str) -> Result<()> {
let parsed = Url::parse(url).map_err(|source| {
let url = url.into();
Error::UnableToParseUrl { url, source }
})?;
let host = parsed
.host_str()
.ok_or_else(|| Error::UrlNotRecognised { url: url.into() })?;
match parsed.scheme() {
"s3" | "s3a" => self.bucket_name = Some(host.to_string()),
"https" => match host.splitn(4, '.').collect_tuple() {
Some(("s3", region, "amazonaws", "com")) => {
self.region = Some(region.to_string());
let bucket = parsed.path_segments().into_iter().flatten().next();
if let Some(bucket) = bucket {
self.bucket_name = Some(bucket.into());
}
}
Some((bucket, "s3", region, "amazonaws.com")) => {
self.bucket_name = Some(bucket.to_string());
self.region = Some(region.to_string());
self.virtual_hosted_style_request = true.into();
}
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(Error::UrlNotRecognised { url: url.into() }.into()),
},
scheme => {
let scheme = scheme.into();
return Err(Error::UnknownUrlScheme { scheme }.into());
}
};
Ok(())
}