Skip to content

Commit 3f4aabf

Browse files
Merge pull request #677 from jyn514/badges
URL-encode badge redirects
2 parents 4c704dc + d268cc9 commit 3f4aabf

File tree

1 file changed

+24
-9
lines changed

1 file changed

+24
-9
lines changed

src/web/rustdoc.rs

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -388,16 +388,13 @@ pub fn badge_handler(req: &mut Request) -> IronResult<Response> {
388388
}
389389
}
390390
MatchVersion::Semver((version, _)) => {
391-
let url = ctry!(Url::parse(
392-
&format!(
393-
"{}/{}/badge.svg?version={}",
394-
redirect_base(req),
395-
name,
396-
version
397-
)[..]
391+
let base_url = format!("{}/{}/badge.svg", redirect_base(req), name);
392+
let url = ctry!(url::Url::parse_with_params(
393+
&base_url,
394+
&[("version", version)]
398395
));
399-
400-
return Ok(super::redirect(url));
396+
let iron_url = ctry!(Url::from_generic_url(url));
397+
return Ok(super::redirect(iron_url));
401398
}
402399
MatchVersion::None => BadgeOptions {
403400
subject: "docs".to_owned(),
@@ -651,4 +648,22 @@ mod test {
651648
Ok(())
652649
})
653650
}
651+
#[test]
652+
fn badges_are_urlencoded() {
653+
wrapper(|env| {
654+
let db = env.db();
655+
db.fake_release()
656+
.name("zstd")
657+
.version("0.5.1+zstd.1.4.4")
658+
.create()?;
659+
660+
let frontend = env.frontend();
661+
assert_redirect(
662+
"/zstd/badge.svg",
663+
"/zstd/badge.svg?version=0.5.1%2Bzstd.1.4.4",
664+
&frontend,
665+
)?;
666+
Ok(())
667+
})
668+
}
654669
}

0 commit comments

Comments
 (0)