d/
send.rs

1use crate::error::Error;
2use crate::utils::get_mime_type_str;
3use futures::future::ok;
4use futures::Future;
5use futures_fs::FsPool;
6use hyper::{Body, Response, StatusCode};
7
8static NOTFOUND: &[u8] = b"Not Found";
9
10pub type ResponseFuture =
11    Box<Future<Item = Response<Body>, Error = Error> + Send>;
12
13fn not_found() -> Response<Body> {
14    Response::builder()
15        .status(StatusCode::NOT_FOUND)
16        .body(NOTFOUND.into())
17        .unwrap() // will success
18}
19
20fn internal_server_error() -> Response<Body> {
21    Response::builder()
22        .status(StatusCode::INTERNAL_SERVER_ERROR)
23        .body(Body::empty())
24        .unwrap() // will success
25}
26
27pub fn send_file(f: &str) -> ResponseFuture {
28    let filename = f.to_owned();
29
30    let mime = get_mime_type_str(&filename);
31
32    let fspool = FsPool::default();
33    let maybe_resp = Response::builder()
34        .status(200)
35        .header("Content-Type", mime.to_string() + ";charset=utf-8")
36        .body(Body::wrap_stream(fspool.read(filename, Default::default())));
37
38    match maybe_resp {
39        Ok(resp) => Box::new(ok(resp)),
40        _ => send_500(),
41    }
42}
43
44pub fn send_string(s: &str) -> ResponseFuture {
45    Box::new(ok(Response::new(Body::from(s.to_owned()))))
46}
47
48pub fn send_404() -> ResponseFuture {
49    Box::new(ok(not_found()))
50}
51
52pub fn send_500() -> ResponseFuture {
53    Box::new(ok(internal_server_error()))
54}