From 6854068aeca7cd0d1e1981958d4da808a581aabb Mon Sep 17 00:00:00 2001 From: Robin Hundt <24554122+robinhundt@users.noreply.github.com> Date: Tue, 13 Oct 2020 17:33:50 +0200 Subject: [PATCH] Fixes #55 This fixes #55 while avoiding the mistake of placing the router_handler after the database_file_handler which acts differently in test and prod (#1051). --- src/web/error.rs | 10 +++++----- src/web/mod.rs | 14 +++++++------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/web/error.rs b/src/web/error.rs index b9a8c4479..ed1073576 100644 --- a/src/web/error.rs +++ b/src/web/error.rs @@ -144,7 +144,7 @@ mod tests { .next() .unwrap() .text_contents(), - "The requested resource does not exist", + "The requested crate does not exist", ); Ok(()) @@ -154,7 +154,7 @@ mod tests { #[test] fn check_404_page_content_resource() { // Resources with a `.js` and `.ico` extension are special cased in the - // routes_handler which is currently run last. This means that `get("resource.exe")` will + // routes_handler. This means that `get("resource.exe")` will // fail with a `no so such crate` instead of 'no such resource' wrapper(|env| { let page = kuchiki::parse_html().one( @@ -190,7 +190,7 @@ mod tests { .next() .unwrap() .text_contents(), - "The requested resource does not exist", + "The requested version does not exist", ); Ok(()) @@ -209,7 +209,7 @@ mod tests { .next() .unwrap() .text_contents(), - "The requested resource does not exist", + "The requested version does not exist", ); Ok(()) @@ -232,7 +232,7 @@ mod tests { .next() .unwrap() .text_contents(), - "The requested resource does not exist", + "The requested version does not exist", ); Ok(()) diff --git a/src/web/mod.rs b/src/web/mod.rs index 642251f79..f74b11c80 100644 --- a/src/web/mod.rs +++ b/src/web/mod.rs @@ -172,19 +172,19 @@ impl Handler for CratesfyiHandler { e: IronError, handle: impl FnOnce() -> IronResult, ) -> IronResult { - if e.response.status == Some(status::NotFound) { - handle() + let is_404 = |err: &IronError| err.response.status == Some(status::NotFound); + if is_404(&e) { + // we want to keep the original error from the router_handler + // in case of a 404, because it provides the best error messages to the user + handle().map_err(|err| if is_404(&err) { e } else { err }) } else { Err(e) } }; - // try serving shared rustdoc resources first, then db/static file handler and last router - // return 404 if none of them return Ok. It is important that the router comes last, - // because it gives the most specific errors, e.g. CrateNotFound or VersionNotFound - self.shared_resource_handler + self.router_handler .handle(req) - .or_else(|e| if_404(e, || self.router_handler.handle(req))) + .or_else(|e| if_404(e, || self.shared_resource_handler.handle(req))) .or_else(|e| if_404(e, || self.database_file_handler.handle(req))) .or_else(|e| if_404(e, || self.static_handler.handle(req))) .or_else(|e| {