Merge branch 'master' into update-example-actix

This commit is contained in:
Nikolay Kim 2018-02-07 13:58:54 -08:00 committed by GitHub
commit 5b4a41a0bb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 33 additions and 15 deletions

View File

@ -4,11 +4,9 @@ use std::str::Utf8Error;
use std::string::FromUtf8Error; use std::string::FromUtf8Error;
use std::io::Error as IoError; use std::io::Error as IoError;
#[cfg(actix_nightly)]
use std::error::Error as StdError;
use cookie; use cookie;
use httparse; use httparse;
use actix::MailboxError;
use futures::Canceled; use futures::Canceled;
use failure; use failure;
use failure::{Fail, Backtrace}; use failure::{Fail, Backtrace};
@ -96,6 +94,7 @@ impl<T: ResponseError> From<T> for Error {
} }
} }
/// Compatibility for `failure::Error`
impl<T> ResponseError for failure::Compat<T> impl<T> ResponseError for failure::Compat<T>
where T: fmt::Display + fmt::Debug + Sync + Send + 'static where T: fmt::Display + fmt::Debug + Sync + Send + 'static
{ } { }
@ -106,14 +105,6 @@ impl From<failure::Error> for Error {
} }
} }
/// Default error is `InternalServerError`
#[cfg(actix_nightly)]
default impl<T: StdError + Sync + Send + 'static> ResponseError for T {
fn error_response(&self) -> HttpResponse {
HttpResponse::new(StatusCode::INTERNAL_SERVER_ERROR, Body::Empty)
}
}
/// `InternalServerError` for `JsonError` /// `InternalServerError` for `JsonError`
impl ResponseError for JsonError {} impl ResponseError for JsonError {}
@ -145,6 +136,9 @@ impl ResponseError for header::InvalidHeaderValue {}
/// `InternalServerError` for `futures::Canceled` /// `InternalServerError` for `futures::Canceled`
impl ResponseError for Canceled {} impl ResponseError for Canceled {}
/// `InternalServerError` for `actix::MailboxError`
impl ResponseError for MailboxError {}
/// A set of errors that can occur during parsing HTTP streams /// A set of errors that can occur during parsing HTTP streams
#[derive(Fail, Debug)] #[derive(Fail, Debug)]
pub enum ParseError { pub enum ParseError {

View File

@ -283,12 +283,18 @@ impl<S> Handler<S> for StaticFiles {
if path.is_dir() { if path.is_dir() {
if let Some(ref redir_index) = self.index { if let Some(ref redir_index) = self.index {
let mut base = Path::new(req.path()).join(relpath); // TODO: Don't redirect, just return the index content.
base.push(redir_index); // TODO: It'd be nice if there were a good usable URL manipulation library
let mut new_path: String = req.path().to_owned();
for el in relpath.iter() {
new_path.push_str(&el.to_string_lossy());
new_path.push('/');
}
new_path.push_str(redir_index);
Ok(FilesystemElement::Redirect( Ok(FilesystemElement::Redirect(
HTTPFound HTTPFound
.build() .build()
.header("LOCATION", base.to_string_lossy().as_ref()) .header::<_, &str>("LOCATION", &new_path)
.finish().unwrap())) .finish().unwrap()))
} else if self.show_index { } else if self.show_index {
Ok(FilesystemElement::Directory(Directory::new(self.directory.clone(), path))) Ok(FilesystemElement::Directory(Directory::new(self.directory.clone(), path)))
@ -340,7 +346,7 @@ mod tests {
} }
#[test] #[test]
fn test_redirec_to_index() { fn test_redirect_to_index() {
let mut st = StaticFiles::new(".", false).index_file("index.html"); let mut st = StaticFiles::new(".", false).index_file("index.html");
let mut req = HttpRequest::default(); let mut req = HttpRequest::default();
req.match_info_mut().add("tail", "guide"); req.match_info_mut().add("tail", "guide");
@ -348,5 +354,23 @@ mod tests {
let resp = st.handle(req).respond_to(HttpRequest::default()).unwrap(); let resp = st.handle(req).respond_to(HttpRequest::default()).unwrap();
assert_eq!(resp.status(), StatusCode::FOUND); assert_eq!(resp.status(), StatusCode::FOUND);
assert_eq!(resp.headers().get(header::LOCATION).unwrap(), "/guide/index.html"); assert_eq!(resp.headers().get(header::LOCATION).unwrap(), "/guide/index.html");
let mut req = HttpRequest::default();
req.match_info_mut().add("tail", "guide/");
let resp = st.handle(req).respond_to(HttpRequest::default()).unwrap();
assert_eq!(resp.status(), StatusCode::FOUND);
assert_eq!(resp.headers().get(header::LOCATION).unwrap(), "/guide/index.html");
}
#[test]
fn test_redirect_to_index_nested() {
let mut st = StaticFiles::new(".", false).index_file("Cargo.toml");
let mut req = HttpRequest::default();
req.match_info_mut().add("tail", "examples/basics");
let resp = st.handle(req).respond_to(HttpRequest::default()).unwrap();
assert_eq!(resp.status(), StatusCode::FOUND);
assert_eq!(resp.headers().get(header::LOCATION).unwrap(), "/examples/basics/Cargo.toml");
} }
} }