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/main.rs | 45 +++++++++++++++++++++-------------------- src/serve.rs | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 89 insertions(+), 21 deletions(-) create mode 100644 src/serve.rs (limited to 'src') diff --git a/src/main.rs b/src/main.rs index 42208dc..398e76d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -14,6 +14,7 @@ use std::sync::mpsc; mod cli; mod upnp; +mod serve; fn main() { let app = App::new(env!("CARGO_PKG_NAME")) @@ -47,29 +48,31 @@ fn main() { process::exit(1); } - let _udp = thread::spawn(move || { - upnp::discover(); - }); + serve::run(); - let (tx, rx) = mpsc::channel(); - let child = thread::spawn(move || { - let mut controller = cli::Controller::init(); - loop { - let c = controller.read(); - tx.send(c).unwrap(); - if c == 113 { - break; - } - } - controller.destroy(); - }); + // let _udp = thread::spawn(move || { + // upnp::discover(); + // }); - for received in rx { - println!("Got char: {}", received); - } + // let (tx, rx) = mpsc::channel(); + // let child = thread::spawn(move || { + // let mut controller = cli::Controller::init(); + // loop { + // let c = controller.read(); + // tx.send(c).unwrap(); + // if c == 113 { + // break; + // } + // } + // controller.destroy(); + // }); + + // for received in rx { + // println!("Got char: {}", received); + // } - println!("Waiting for all thread"); - let _res = child.join(); - println!("Done!"); + // println!("Waiting for all thread"); + // let _res = child.join(); + // println!("Done!"); } 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