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 | |
| parent | bcc03e52efc76bc2bf02d2d0fb59034c6aa79770 (diff) | |
Test HTTP file serving
Diffstat (limited to 'src')
| -rw-r--r-- | src/main.rs | 45 | ||||
| -rw-r--r-- | src/serve.rs | 65 |
2 files changed, 89 insertions, 21 deletions
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<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()) + })) +} |
