pub fn detached_sig_url(url: &str) -> String {
let split = url.find(['?', '#']).unwrap_or(url.len());
let (path, rest) = url.split_at(split);
format!("{path}.sig{rest}")
}
pub fn detached_sig_filename(url: &str) -> Option<String> {
let sig_url = detached_sig_url(url);
let path = sig_url.split(['?', '#']).next()?;
let name = path.rsplit('/').next()?;
if name.is_empty() {
return None;
}
Some(name.to_string())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn sig_url_appends_to_the_path_component() {
assert_eq!(
detached_sig_url("https://h/app.onelf.zsync"),
"https://h/app.onelf.zsync.sig"
);
}
#[test]
fn sig_url_preserves_a_query_string() {
assert_eq!(
detached_sig_url("https://h/app.onelf.zsync?t=1"),
"https://h/app.onelf.zsync.sig?t=1"
);
assert_eq!(
detached_sig_url("https://h/app.onelf.zsync#frag"),
"https://h/app.onelf.zsync.sig#frag"
);
}
#[test]
fn filename_is_what_the_publisher_uploads() {
assert_eq!(
detached_sig_filename("https://h/d/app.onelf.zsync").as_deref(),
Some("app.onelf.zsync.sig")
);
assert_eq!(
detached_sig_filename("https://h/d/app.onelf.zsync?v=2").as_deref(),
Some("app.onelf.zsync.sig")
);
}
}