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() }
19
20fn internal_server_error() -> Response<Body> {
21 Response::builder()
22 .status(StatusCode::INTERNAL_SERVER_ERROR)
23 .body(Body::empty())
24 .unwrap() }
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}