From e9c1c5ddaa8727e074660ed16e46eb7cad935589 Mon Sep 17 00:00:00 2001 From: Shaurya Shubham Date: Fri, 22 Jan 2021 06:53:02 +0000 Subject: [PATCH 1/4] Make /crate/:crate/latest/builds.json not strip .json suffix --- src/web/builds.rs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/web/builds.rs b/src/web/builds.rs index f7c7613f3..11ca9a27e 100644 --- a/src/web/builds.rs +++ b/src/web/builds.rs @@ -43,18 +43,22 @@ pub fn build_list_handler(req: &mut Request) -> IronResult { let mut conn = extension!(req, Pool).get()?; let limits = ctry!(req, Limits::for_crate(&mut conn, name)); + let is_json = req.url.path().join("/").ends_with(".json"); + let version = match match_version(&mut conn, name, req_version).and_then(|m| m.assume_exact())? { MatchSemver::Exact((version, _)) => version, MatchSemver::Semver((version, _)) => { + let ext = if is_json { ".json" } else { "" }; let url = ctry!( req, Url::parse(&format!( - "{}/crate/{}/{}/builds", + "{}/crate/{}/{}/builds{}", redirect_base(req), name, - version + version, + ext )), ); @@ -95,7 +99,7 @@ pub fn build_list_handler(req: &mut Request) -> IronResult { }) .collect(); - if req.url.path().join("/").ends_with(".json") { + if is_json { let mut resp = Response::with((status::Ok, serde_json::to_string(&builds).unwrap())); resp.headers.set(ContentType::json()); resp.headers.set(Expires(HttpDate(time::now()))); From b8ddf1e4d5ec0665e3077f1da79513cfa5d4e328 Mon Sep 17 00:00:00 2001 From: Shaurya Date: Fri, 22 Jan 2021 22:05:48 +0530 Subject: [PATCH 2/4] Check for .json extension in a non-allocating way Co-authored-by: Joshua Nelson --- src/web/builds.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/web/builds.rs b/src/web/builds.rs index 11ca9a27e..183a5b77d 100644 --- a/src/web/builds.rs +++ b/src/web/builds.rs @@ -43,7 +43,7 @@ pub fn build_list_handler(req: &mut Request) -> IronResult { let mut conn = extension!(req, Pool).get()?; let limits = ctry!(req, Limits::for_crate(&mut conn, name)); - let is_json = req.url.path().join("/").ends_with(".json"); + let is_json = req.url.path().last().map_or(false, |segment| segment.ends_with(".json")); let version = match match_version(&mut conn, name, req_version).and_then(|m| m.assume_exact())? { From 6c54341c89187c57af47ad5090edbdac8e6bf504 Mon Sep 17 00:00:00 2001 From: Shaurya Shubham Date: Fri, 22 Jan 2021 17:11:52 +0000 Subject: [PATCH 3/4] Run cargo fmt --- src/web/builds.rs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/web/builds.rs b/src/web/builds.rs index 183a5b77d..06e6b41dc 100644 --- a/src/web/builds.rs +++ b/src/web/builds.rs @@ -43,7 +43,11 @@ pub fn build_list_handler(req: &mut Request) -> IronResult { let mut conn = extension!(req, Pool).get()?; let limits = ctry!(req, Limits::for_crate(&mut conn, name)); - let is_json = req.url.path().last().map_or(false, |segment| segment.ends_with(".json")); + let is_json = req + .url + .path() + .last() + .map_or(false, |segment| segment.ends_with(".json")); let version = match match_version(&mut conn, name, req_version).and_then(|m| m.assume_exact())? { @@ -58,7 +62,7 @@ pub fn build_list_handler(req: &mut Request) -> IronResult { redirect_base(req), name, version, - ext + ext, )), ); From 9aa1a9c37582c6b8700d801e1638fe119d76955e Mon Sep 17 00:00:00 2001 From: Shaurya Shubham Date: Sat, 23 Jan 2021 05:49:56 +0000 Subject: [PATCH 4/4] Add test --- src/web/builds.rs | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/src/web/builds.rs b/src/web/builds.rs index 06e6b41dc..6d371bf8e 100644 --- a/src/web/builds.rs +++ b/src/web/builds.rs @@ -310,7 +310,7 @@ mod tests { fn latest_redirect() { wrapper(|env| { env.fake_release() - .name("foo") + .name("aquarelle") .version("0.1.0") .builds(vec![FakeBuild::default() .rustc_version("rustc 1.0.0") @@ -318,15 +318,31 @@ mod tests { .create()?; env.fake_release() - .name("foo") + .name("aquarelle") .version("0.2.0") .builds(vec![FakeBuild::default() .rustc_version("rustc 1.0.0") .docsrs_version("docs.rs 1.0.0")]) .create()?; - let resp = env.frontend().get("/crate/foo/latest/builds").send()?; - assert!(resp.url().as_str().ends_with("/crate/foo/0.2.0/builds")); + let resp = env + .frontend() + .get("/crate/aquarelle/latest/builds") + .send()?; + assert!(resp + .url() + .as_str() + .ends_with("/crate/aquarelle/0.2.0/builds")); + + let resp_json = env + .frontend() + .get("/crate/aquarelle/latest/builds.json") + .send()?; + assert!(resp_json + .url() + .as_str() + .ends_with("/crate/aquarelle/0.2.0/builds.json")); + Ok(()) }); }