diff options
| author | Yuval Adam <_@yuv.al> | 2018-07-12 18:47:57 +0300 |
|---|---|---|
| committer | Yuval Adam <_@yuv.al> | 2018-07-12 18:47:57 +0300 |
| commit | 6ab657f0e6211aed4452ba7b0e06e803b25c8ccc (patch) | |
| tree | 3697af30807da415775c0d440045eb2427e71774 /src/serve.rs | |
| parent | bcc03e52efc76bc2bf02d2d0fb59034c6aa79770 (diff) | |
Test HTTP file serving
Diffstat (limited to 'src/serve.rs')
| -rw-r--r-- | src/serve.rs | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/src/serve.rs b/src/serve.rs new file mode 100644 index 0000000..ad7ee0f --- /dev/null +++ b/src/serve.rs @@ -0,0 +1,65 @@ +extern crate futures; +extern crate hyper; +extern crate tokio_fs; +extern crate tokio_io; + +use self::futures::{future, Future}; +use self::hyper::{Body, Method, Request, Response, Server, StatusCode}; +use self::hyper::service::service_fn; + +use std::io; + +static NOTFOUND: &[u8] = b"Not Found"; + +pub fn run() { + let addr = "0.0.0.0:51497".parse().unwrap(); + + let server = Server::bind(&addr) + .serve(|| service_fn(response_examples)) + .map_err(|e| eprintln!("server error: {}", e)); + + println!("Listening on http://{}", addr); + + hyper::rt::run(server); +} + +type ResponseFuture = Box<Future<Item=Response<Body>, Error=io::Error> + Send>; + +fn response_examples(req: Request<Body>) -> ResponseFuture { + match (req.method(), req.uri().path()) { + (&Method::GET, "/0") => { + simple_file_send("/home/yuval/Videos/0") + }, + _ => { + Box::new(future::ok(Response::builder() + .status(StatusCode::NOT_FOUND) + .body(Body::empty()) + .unwrap())) + } + } + +} + +fn simple_file_send(f: &str) -> ResponseFuture { + let filename = f.to_string(); + Box::new(tokio_fs::file::File::open(filename) + .and_then(|file| { + let buf: Vec<u8> = Vec::new(); + tokio_io::io::read_to_end(file, buf) + .and_then(|item| { + Ok(Response::new(item.1.into())) + }) + .or_else(|_| { + Ok(Response::builder() + .status(StatusCode::INTERNAL_SERVER_ERROR) + .body(Body::empty()) + .unwrap()) + }) + }) + .or_else(|_| { + Ok(Response::builder() + .status(StatusCode::NOT_FOUND) + .body(NOTFOUND.into()) + .unwrap()) + })) +} |
