summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorYuval Adam <_@yuv.al>2018-07-12 18:47:57 +0300
committerYuval Adam <_@yuv.al>2018-07-12 18:47:57 +0300
commit6ab657f0e6211aed4452ba7b0e06e803b25c8ccc (patch)
tree3697af30807da415775c0d440045eb2427e71774 /src
parentbcc03e52efc76bc2bf02d2d0fb59034c6aa79770 (diff)
Test HTTP file serving
Diffstat (limited to 'src')
-rw-r--r--src/main.rs45
-rw-r--r--src/serve.rs65
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())
+ }))
+}