summaryrefslogtreecommitdiff
path: root/src/serve.rs
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/serve.rs
parentbcc03e52efc76bc2bf02d2d0fb59034c6aa79770 (diff)
Test HTTP file serving
Diffstat (limited to 'src/serve.rs')
-rw-r--r--src/serve.rs65
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())
+ }))
+}