mirror of https://github.com/fafhrd91/actix-web
Merge branch 'master' into update-example-actix
This commit is contained in:
commit
5b4a41a0bb
16
src/error.rs
16
src/error.rs
|
@ -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 {
|
||||||
|
|
32
src/fs.rs
32
src/fs.rs
|
@ -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");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue