1
0
mirror of https://github.com/actix/actix-extras.git synced 2024-11-24 07:53:00 +01:00

added fs tests

This commit is contained in:
Nikolay Kim 2017-12-03 18:15:09 -08:00
parent 69f0c098e3
commit 5decff9154
4 changed files with 79 additions and 2 deletions

View File

@ -1 +1,41 @@
# Static file handling # Static file handling
## Individual file
It is possible to serve static files with tail path pattern and `NamedFile`.
```rust
extern crate actix_web;
use actix_web::*;
use std::path::PathBuf;
fn index(req: HttpRequest) -> Result<fs::NamedFile> {
let path: PathBuf = req.match_info().query("tail")?;
Ok(fs::NamedFile::open(path)?)
}
fn main() {
Application::default("/")
.resource(r"/a/{tail:*}", |r| r.get(index))
.finish();
}
```
## Directory
To serve all files from specific directory `StaticFiles` type could be used.
`StaticFiles` could be registered with `Application::route` method.
```rust
extern crate actix_web;
fn main() {
actix_web::Application::default("/")
.route("/static", actix_web::fs::StaticFiles::new(".", true))
.finish();
}
```
First parameter is a base directory. Second parameter is `show_index`, if it set to *true*
directory listing would be returned for directories, if it is set to *false*
then *404 Not Found* would be returned instead of directory listing.

View File

@ -28,7 +28,7 @@ use httpcodes::{HTTPBadRequest, HTTPMethodNotAllowed, HTTPExpectationFailed};
/// ///
/// This typedef is generally used to avoid writing out `actix_web::error::Error` directly and /// This typedef is generally used to avoid writing out `actix_web::error::Error` directly and
/// is otherwise a direct mapping to `Result`. /// is otherwise a direct mapping to `Result`.
pub type Result<T> = result::Result<T, Error>; pub type Result<T, E=Error> = result::Result<T, E>;
/// General purpose actix web error /// General purpose actix web error
#[derive(Fail, Debug)] #[derive(Fail, Debug)]

View File

@ -270,3 +270,38 @@ impl<S> Handler<S> for StaticFiles {
} }
} }
} }
#[cfg(test)]
mod tests {
use super::*;
use http::header;
#[test]
fn test_named_file() {
assert!(NamedFile::open("test--").is_err());
let mut file = NamedFile::open("Cargo.toml").unwrap();
{ file.file();
let _f: &File = &file; }
{ let _f: &mut File = &mut file; }
let resp = file.from_request(HttpRequest::default()).unwrap();
assert_eq!(resp.headers().get(header::CONTENT_TYPE).unwrap(), "text/x-toml")
}
#[test]
fn test_static_files() {
let mut st = StaticFiles::new(".", true);
st.accessible = false;
assert!(st.handle(HttpRequest::default()).is_err());
st.accessible = true;
st.show_index = false;
assert!(st.handle(HttpRequest::default()).is_err());
st.show_index = true;
let resp = st.handle(HttpRequest::default()).from_request(HttpRequest::default()).unwrap();
assert_eq!(resp.headers().get(header::CONTENT_TYPE).unwrap(), "text/html; charset=utf-8");
assert!(resp.body().is_binary());
assert!(format!("{:?}", resp.body()).contains("README.md"));
}
}

View File

@ -600,7 +600,9 @@ mod tests {
.version(Version::HTTP_10) .version(Version::HTTP_10)
.finish().unwrap(); .finish().unwrap();
assert_eq!(resp.version(), Some(Version::HTTP_10)); assert_eq!(resp.version(), Some(Version::HTTP_10));
assert_eq!(resp.status(), StatusCode::NO_CONTENT) assert_eq!(resp.status(), StatusCode::NO_CONTENT);
let _t = format!("{:?}", resp);
} }
#[test] #[test]