From d268cc9ea5719a24755d6ce500db0d6965cae737 Mon Sep 17 00:00:00 2001 From: Joshua Nelson Date: Wed, 1 Apr 2020 17:04:03 -0400 Subject: [PATCH] URL-encode badge redirects Closes https://github.com/rust-lang/docs.rs/issues/395 --- src/web/rustdoc.rs | 33 ++++++++++++++++++++++++--------- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/src/web/rustdoc.rs b/src/web/rustdoc.rs index 8365be6c4..45d89ca83 100644 --- a/src/web/rustdoc.rs +++ b/src/web/rustdoc.rs @@ -388,16 +388,13 @@ pub fn badge_handler(req: &mut Request) -> IronResult { } } MatchVersion::Semver((version, _)) => { - let url = ctry!(Url::parse( - &format!( - "{}/{}/badge.svg?version={}", - redirect_base(req), - name, - version - )[..] + let base_url = format!("{}/{}/badge.svg", redirect_base(req), name); + let url = ctry!(url::Url::parse_with_params( + &base_url, + &[("version", version)] )); - - return Ok(super::redirect(url)); + let iron_url = ctry!(Url::from_generic_url(url)); + return Ok(super::redirect(iron_url)); } MatchVersion::None => BadgeOptions { subject: "docs".to_owned(), @@ -651,4 +648,22 @@ mod test { Ok(()) }) } + #[test] + fn badges_are_urlencoded() { + wrapper(|env| { + let db = env.db(); + db.fake_release() + .name("zstd") + .version("0.5.1+zstd.1.4.4") + .create()?; + + let frontend = env.frontend(); + assert_redirect( + "/zstd/badge.svg", + "/zstd/badge.svg?version=0.5.1%2Bzstd.1.4.4", + &frontend, + )?; + Ok(()) + }) + } }