From 6ab657f0e6211aed4452ba7b0e06e803b25c8ccc Mon Sep 17 00:00:00 2001 From: Yuval Adam <_@yuv.al> Date: Thu, 12 Jul 2018 18:47:57 +0300 Subject: Test HTTP file serving --- src/serve.rs | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 src/serve.rs (limited to 'src/serve.rs') 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, Error=io::Error> + Send>; + +fn response_examples(req: Request) -> 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 = 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()) + })) +} -- cgit v1.3.1