pub fn get_ns_from_query(uri: &http::Uri) -> Option<String> {
let query = uri.query()?;
let (_, value) = url::form_urlencoded::parse(query.as_bytes()).find(|(key, _)| key == "ns")?;
if value.contains("://") {
Some(value.into_owned())
} else {
Some(format!("https://{value}"))
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_get_ns_from_query_with_ns_param() {
let uri: http::Uri = "/v2/library/nginx/manifests/latest?ns=docker.io"
.parse()
.unwrap();
assert_eq!(
get_ns_from_query(&uri),
Some("https://docker.io".to_string())
);
}
#[test]
fn test_get_ns_from_query_with_scheme() {
let uri: http::Uri = "/v2/library/nginx/manifests/latest?ns=https://registry.example.com"
.parse()
.unwrap();
assert_eq!(
get_ns_from_query(&uri),
Some("https://registry.example.com".to_string())
);
}
#[test]
fn test_get_ns_from_query_no_ns_param() {
let uri: http::Uri = "/v2/library/nginx/manifests/latest?foo=bar"
.parse()
.unwrap();
assert_eq!(get_ns_from_query(&uri), None);
}
#[test]
fn test_get_ns_from_query_no_query() {
let uri: http::Uri = "/v2/library/nginx/manifests/latest".parse().unwrap();
assert_eq!(get_ns_from_query(&uri), None);
}
#[test]
fn test_get_ns_from_query_multiple_params() {
let uri: http::Uri = "/v2/library/nginx/manifests/latest?foo=bar&ns=ghcr.io&baz=qux"
.parse()
.unwrap();
assert_eq!(get_ns_from_query(&uri), Some("https://ghcr.io".to_string()));
}
}