From b746efa5ef030d49c2bb925bb5e2bc6ab0388e87 Mon Sep 17 00:00:00 2001 From: Denis Cornehl Date: Sun, 30 May 2021 09:10:06 +0200 Subject: [PATCH 1/2] fixes #1409: internal server error with two slashes at the end of the URL --- src/web/mod.rs | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/src/web/mod.rs b/src/web/mod.rs index 2f3450efd..fd55507b2 100644 --- a/src/web/mod.rs +++ b/src/web/mod.rs @@ -109,7 +109,7 @@ use iron::{ }; use page::TemplateData; use postgres::Client; -use router::NoRoute; +use router::{NoRoute, TrailingSlash}; use semver::{Version, VersionReq}; use serde::Serialize; use std::{borrow::Cow, fmt, net::SocketAddr, sync::Arc}; @@ -167,6 +167,18 @@ impl Handler for MainHandler { } } + fn pass_iron_errors_with_redirect(e: IronError) -> IronResult { + // in some cases the iron router will return a redirect as an `IronError`. + // Here we convert these into an `Ok(Response)`. + if e.error.downcast_ref::().is_some() + || e.response.status == Some(status::MovedPermanently) + { + Ok(e.response) + } else { + Err(e) + } + } + // This is kind of a mess. // // Almost all files should be served through the `router_handler`; eventually @@ -183,6 +195,7 @@ impl Handler for MainHandler { self.shared_resource_handler .handle(req) .or_else(|e| if_404(e, || self.router_handler.handle(req))) + .or_else(pass_iron_errors_with_redirect) .or_else(|e| { let err = if let Some(err) = e.error.downcast_ref::() { *err @@ -740,6 +753,20 @@ mod test { }) } + #[test] + fn double_slash_does_redirect_and_remove_slash() { + wrapper(|env| { + env.fake_release() + .name("bat") + .version("0.2.0") + .create() + .unwrap(); + let web = env.frontend(); + assert_redirect("/bat//", "/bat/0.2.0/bat/", web)?; + Ok(()) + }) + } + #[test] fn binary_docs_redirect_to_crate() { wrapper(|env| { From 8a5b123d8810470846b45126e9dd967170005ac8 Mon Sep 17 00:00:00 2001 From: Denis Cornehl Date: Sat, 5 Jun 2021 08:22:04 +0200 Subject: [PATCH 2/2] move handler into clojure --- src/web/mod.rs | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/src/web/mod.rs b/src/web/mod.rs index fd55507b2..92c75bae8 100644 --- a/src/web/mod.rs +++ b/src/web/mod.rs @@ -167,18 +167,6 @@ impl Handler for MainHandler { } } - fn pass_iron_errors_with_redirect(e: IronError) -> IronResult { - // in some cases the iron router will return a redirect as an `IronError`. - // Here we convert these into an `Ok(Response)`. - if e.error.downcast_ref::().is_some() - || e.response.status == Some(status::MovedPermanently) - { - Ok(e.response) - } else { - Err(e) - } - } - // This is kind of a mess. // // Almost all files should be served through the `router_handler`; eventually @@ -195,7 +183,17 @@ impl Handler for MainHandler { self.shared_resource_handler .handle(req) .or_else(|e| if_404(e, || self.router_handler.handle(req))) - .or_else(pass_iron_errors_with_redirect) + .or_else(|e| { + // in some cases the iron router will return a redirect as an `IronError`. + // Here we convert these into an `Ok(Response)`. + if e.error.downcast_ref::().is_some() + || e.response.status == Some(status::MovedPermanently) + { + Ok(e.response) + } else { + Err(e) + } + }) .or_else(|e| { let err = if let Some(err) = e.error.downcast_ref::() { *err