use url::Url;
pub fn jwks_url(issuer: &str) -> Result<Url, url::ParseError> {
let mut base = issuer.parse::<Url>()?;
if !base.path().ends_with('/') {
let new_path = format!("{}/", base.path());
base.set_path(&new_path);
}
base.join(".well-known/jwks.json")
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn preserves_full_path_when_issuer_has_trailing_slash() {
let url = jwks_url("https://foo.com/auth/v1/").unwrap();
assert_eq!(
url.as_str(),
"https://foo.com/auth/v1/.well-known/jwks.json"
);
}
#[test]
fn preserves_full_path_when_issuer_has_no_trailing_slash() {
let url = jwks_url("https://foo.com/auth/v1").unwrap();
assert_eq!(
url.as_str(),
"https://foo.com/auth/v1/.well-known/jwks.json"
);
}
#[test]
fn handles_root_issuer() {
let url = jwks_url("https://foo.com").unwrap();
assert_eq!(url.as_str(), "https://foo.com/.well-known/jwks.json");
}
}