mirror of
https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs.git
synced 2024-06-02 07:41:11 +00:00
rusoto/s3: Allow passing custom AWS-compatible regions
For the region property this would be provided as `region-name+https://region.end/point` while for the URI this unfortunately has to be base32 encoded to allow usage as the host part of the URI.
This commit is contained in:
parent
502b336361
commit
69bb09f7ad
|
@ -30,6 +30,7 @@ serde = "1"
|
||||||
serde_derive = "1"
|
serde_derive = "1"
|
||||||
serde_json = "1"
|
serde_json = "1"
|
||||||
atomic_refcell = "0.1"
|
atomic_refcell = "0.1"
|
||||||
|
base32 = "0.4"
|
||||||
|
|
||||||
[lib]
|
[lib]
|
||||||
name = "gstrusoto"
|
name = "gstrusoto"
|
||||||
|
|
|
@ -95,7 +95,27 @@ impl Settings {
|
||||||
fn to_uri(&self) -> String {
|
fn to_uri(&self) -> String {
|
||||||
format!(
|
format!(
|
||||||
"s3://{}/{}/{}",
|
"s3://{}/{}/{}",
|
||||||
self.region.name(),
|
match self.region {
|
||||||
|
Region::Custom {
|
||||||
|
ref name,
|
||||||
|
ref endpoint,
|
||||||
|
} => {
|
||||||
|
format!(
|
||||||
|
"{}+{}",
|
||||||
|
base32::encode(
|
||||||
|
base32::Alphabet::RFC4648 { padding: true },
|
||||||
|
name.as_bytes(),
|
||||||
|
),
|
||||||
|
base32::encode(
|
||||||
|
base32::Alphabet::RFC4648 { padding: true },
|
||||||
|
endpoint.as_bytes(),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
_ => {
|
||||||
|
String::from(self.region.name())
|
||||||
|
}
|
||||||
|
},
|
||||||
self.bucket.as_ref().unwrap(),
|
self.bucket.as_ref().unwrap(),
|
||||||
self.key.as_ref().unwrap()
|
self.key.as_ref().unwrap()
|
||||||
)
|
)
|
||||||
|
@ -500,9 +520,17 @@ impl ObjectImpl for S3Sink {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
"region" => {
|
"region" => {
|
||||||
settings.region =
|
let region = value.get::<String>().expect("type checked upstream");
|
||||||
Region::from_str(&value.get::<String>().expect("type checked upstream"))
|
settings.region = Region::from_str(®ion)
|
||||||
.unwrap();
|
.or_else(|_| {
|
||||||
|
let (name, endpoint) = region.split_once('+').ok_or(())?;
|
||||||
|
Ok(Region::Custom {
|
||||||
|
name: name.into(),
|
||||||
|
endpoint: endpoint.into(),
|
||||||
|
})
|
||||||
|
})
|
||||||
|
.unwrap_or_else(|_: ()| panic!("Invalid region '{}'", region));
|
||||||
|
|
||||||
if settings.key.is_some() && settings.bucket.is_some() {
|
if settings.key.is_some() && settings.bucket.is_some() {
|
||||||
let _ = self.set_uri(obj, Some(&settings.to_uri()));
|
let _ = self.set_uri(obj, Some(&settings.to_uri()));
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,7 +31,27 @@ impl ToString for GstS3Url {
|
||||||
fn to_string(&self) -> String {
|
fn to_string(&self) -> String {
|
||||||
format!(
|
format!(
|
||||||
"s3://{}/{}/{}{}",
|
"s3://{}/{}/{}{}",
|
||||||
self.region.name(),
|
match self.region {
|
||||||
|
Region::Custom {
|
||||||
|
ref name,
|
||||||
|
ref endpoint,
|
||||||
|
} => {
|
||||||
|
format!(
|
||||||
|
"{}+{}",
|
||||||
|
base32::encode(
|
||||||
|
base32::Alphabet::RFC4648 { padding: true },
|
||||||
|
name.as_bytes(),
|
||||||
|
),
|
||||||
|
base32::encode(
|
||||||
|
base32::Alphabet::RFC4648 { padding: true },
|
||||||
|
endpoint.as_bytes(),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
_ => {
|
||||||
|
String::from(self.region.name())
|
||||||
|
}
|
||||||
|
},
|
||||||
self.bucket,
|
self.bucket,
|
||||||
percent_encode(self.object.as_bytes(), PATH_SEGMENT),
|
percent_encode(self.object.as_bytes(), PATH_SEGMENT),
|
||||||
if self.version.is_some() {
|
if self.version.is_some() {
|
||||||
|
@ -55,7 +75,18 @@ pub fn parse_s3_url(url_str: &str) -> Result<GstS3Url, String> {
|
||||||
}
|
}
|
||||||
|
|
||||||
let host = url.host_str().unwrap();
|
let host = url.host_str().unwrap();
|
||||||
let region = Region::from_str(host).map_err(|_| format!("Invalid region '{}'", host))?;
|
let region = Region::from_str(host)
|
||||||
|
.or_else(|_| {
|
||||||
|
let (name, endpoint) = host.split_once('+').ok_or(())?;
|
||||||
|
let name =
|
||||||
|
base32::decode(base32::Alphabet::RFC4648 { padding: true }, name).ok_or(())?;
|
||||||
|
let endpoint =
|
||||||
|
base32::decode(base32::Alphabet::RFC4648 { padding: true }, endpoint).ok_or(())?;
|
||||||
|
let name = String::from_utf8(name).map_err(|_| ())?;
|
||||||
|
let endpoint = String::from_utf8(endpoint).map_err(|_| ())?;
|
||||||
|
Ok(Region::Custom { name, endpoint })
|
||||||
|
})
|
||||||
|
.map_err(|_: ()| format!("Invalid region '{}'", host))?;
|
||||||
|
|
||||||
let mut path = url
|
let mut path = url
|
||||||
.path_segments()
|
.path_segments()
|
||||||
|
|
Loading…
Reference in a new issue