From 9244953e5796f078d1ed564894ce95bfa97ad427 Mon Sep 17 00:00:00 2001 From: _ <_@_> Date: Sat, 31 Oct 2020 12:56:36 -0500 Subject: [PATCH] :recycle: Extract load_templates fn for file server --- src/bin/file_server.rs | 21 +++++------------ src/lib.rs | 4 ++-- src/relay/mod.rs | 49 ++++++++------------------------------- src/server/file_server.rs | 16 +++++++++++++ src/server/mod.rs | 10 +++----- todo.md | 2 ++ 6 files changed, 39 insertions(+), 63 deletions(-) diff --git a/src/bin/file_server.rs b/src/bin/file_server.rs index 1e608c6..777ba03 100644 --- a/src/bin/file_server.rs +++ b/src/bin/file_server.rs @@ -18,6 +18,11 @@ use hyper::{ StatusCode, }; +use ptth::{ + http_serde::RequestParts, + server::file_server, +}; + struct ServerState <'a> { handlebars: Arc >, } @@ -41,11 +46,6 @@ fn prefix_match <'a> (hay: &'a str, needle: &str) -> Option <&'a str> async fn handle_all (req: Request , state: Arc >) -> Result , Infallible> { - use ptth::{ - http_serde::RequestParts, - server::file_server, - }; - let path = req.uri ().path (); //println! ("{}", path); @@ -90,16 +90,7 @@ async fn handle_all (req: Request , state: Arc >) async fn main () -> Result <(), Box > { let addr = SocketAddr::from(([0, 0, 0, 0], 4000)); - let mut handlebars = handlebars::Handlebars::new (); - - for (k, v) in vec! [ - ("file_server_dir_entry", "ptth_handlebars/file_server_dir_entry.html"), - ("file_server_dir", "ptth_handlebars/file_server_dir.html"), - ].into_iter () { - handlebars.register_template_file (k, v)?; - } - - let handlebars = Arc::new (handlebars); + let handlebars = Arc::new (file_server::load_templates ()?); let state = Arc::new (ServerState { handlebars, diff --git a/src/lib.rs b/src/lib.rs index 62d4871..745eeac 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -44,7 +44,7 @@ mod tests { spawn (async move { let opt = server::Opt { relay_url: relay_url_2, - file_server_root: ".".into (), + file_server_root: "./".into (), }; server::main (opt).await.unwrap (); @@ -57,7 +57,7 @@ mod tests { assert_eq! (resp, "Relay is up\n"); - let resp = client.get (&format! ("{}/http_request/alien_wildlands/COPYING", relay_url)) + let resp = client.get (&format! ("{}/servers/alien_wildlands/COPYING", relay_url)) .send ().await.unwrap ().bytes ().await.unwrap (); assert_eq! (blake3::hash (&resp), blake3::Hash::from ([ diff --git a/src/relay/mod.rs b/src/relay/mod.rs index 9fb077b..7841d25 100644 --- a/src/relay/mod.rs +++ b/src/relay/mod.rs @@ -32,7 +32,6 @@ use crate::{ use watcher::*; enum Message { - Meow, HttpRequestResponse (http_serde::WrappedRequest), HttpResponseResponseStream ((http_serde::ResponseParts, Body)), } @@ -48,35 +47,13 @@ fn status_reply > (status: StatusCode, b: B) Response::builder ().status (status).body (b.into ()).unwrap () } -async fn handle_watch (state: Arc , watcher_code: String) --> Response -{ - match Watchers::long_poll (state.watchers.clone (), watcher_code).await { - None => status_reply (StatusCode::OK, "no\n"), - Some (_) => status_reply (StatusCode::OK, "actually, yes\n"), - } -} - -async fn handle_wake (state: Arc , watcher_code: String) --> Response -{ - let mut watchers = state.watchers.lock ().await; - - if watchers.wake_one (Message::Meow, &watcher_code) { - status_reply (StatusCode::OK, "ok\n") - } - else { - status_reply (StatusCode::BAD_REQUEST, "no\n") - } -} - async fn handle_http_listen (state: Arc , watcher_code: String) -> Response { //println! ("Step 1"); match Watchers::long_poll (state.watchers.clone (), watcher_code).await { Some (Message::HttpRequestResponse (parts)) => { - println! ("Step 3"); + //println! ("Step 3"); status_reply (StatusCode::OK, rmp_serde::to_vec (&parts).unwrap ()) }, _ => status_reply (StatusCode::GATEWAY_TIMEOUT, "no\n"), @@ -90,21 +67,21 @@ async fn handle_http_response ( ) -> Response { - println! ("Step 6"); + //println! ("Step 6"); let (parts, body) = req.into_parts (); let resp_parts: http_serde::ResponseParts = rmp_serde::from_read_ref (&base64::decode (parts.headers.get (crate::PTTH_MAGIC_HEADER).unwrap ()).unwrap ()).unwrap (); { let mut watchers = state.watchers.lock ().await; - println! ("Step 7"); + //println! ("Step 7"); if ! watchers.wake_one (Message::HttpResponseResponseStream ((resp_parts, body)), &req_id) { println! ("Step 8 (bad thing)"); status_reply (StatusCode::BAD_REQUEST, "A bad thing happened.\n") } else { - println! ("Step 8"); + //println! ("Step 8"); status_reply (StatusCode::OK, "ok\n") } } @@ -131,7 +108,7 @@ async fn handle_http_request ( } }; - println! ("Step 2 {}", parts.id); + //println! ("Step 2 {}", parts.id); let (s, r) = oneshot::channel (); let timeout = Duration::from_secs (5); @@ -148,7 +125,7 @@ async fn handle_http_request ( { let mut watchers = state.watchers.lock ().await; - println! ("Step 3"); + //println! ("Step 3"); if ! watchers.wake_one (Message::HttpRequestResponse (parts), &watcher_code) { watchers.remove_watcher (&req_id); } @@ -163,7 +140,7 @@ async fn handle_http_request ( match r.await { Ok (Message::HttpResponseResponseStream ((resp_parts, body))) => { - println! ("Step 7"); + //println! ("Step 7"); let mut resp = Response::builder () .status (hyper::StatusCode::from (resp_parts.status_code)); @@ -200,7 +177,7 @@ async fn handle_all (req: Request , state: Arc ) // This is stuff the server can use. Clients can't // POST right now - return Ok (if let Some (request_code) = prefix_match (path, "/http_response/") { + return Ok (if let Some (request_code) = prefix_match (path, "/7ZSFUKGV_http_response/") { let request_code = request_code.into (); handle_http_response (req, state, request_code).await } @@ -209,16 +186,10 @@ async fn handle_all (req: Request , state: Arc ) }); } - if let Some (watch_code) = prefix_match (path, "/watch/") { - Ok (handle_watch (state, watch_code.into ()).await) - } - else if let Some (watch_code) = prefix_match (path, "/wake/") { - Ok (handle_wake (state, watch_code.into ()).await) - } - else if let Some (listen_code) = prefix_match (path, "/http_listen/") { + if let Some (listen_code) = prefix_match (path, "/7ZSFUKGV_http_listen/") { Ok (handle_http_listen (state, listen_code.into ()).await) } - else if let Some (rest) = prefix_match (path, "/http_request/") { + else if let Some (rest) = prefix_match (path, "/servers/") { if let Some (idx) = rest.find ('/') { let listen_code = String::from (&rest [0..idx]); let path = String::from (&rest [idx..]); diff --git a/src/server/file_server.rs b/src/server/file_server.rs index 2e2e30c..614b55b 100644 --- a/src/server/file_server.rs +++ b/src/server/file_server.rs @@ -3,6 +3,7 @@ use std::{ cmp::{min, max}, convert::{Infallible, TryInto}, + error::Error, io::SeekFrom, path::{Path, PathBuf}, sync::Arc, @@ -283,6 +284,21 @@ pub async fn serve_all ( } } +pub fn load_templates () +-> Result , Box > +{ + let mut handlebars = handlebars::Handlebars::new (); + + for (k, v) in vec! [ + ("file_server_dir_entry", "ptth_handlebars/file_server_dir_entry.html"), + ("file_server_dir", "ptth_handlebars/file_server_dir.html"), + ].into_iter () { + handlebars.register_template_file (k, v)?; + } + + Ok (handlebars) +} + #[cfg (test)] mod tests { #[test] diff --git a/src/server/mod.rs b/src/server/mod.rs index e60c8c7..c710fc7 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -45,7 +45,7 @@ async fn handle_req_resp <'a> ( let response = file_server::serve_all (handlebars, &opt.file_server_root, parts).await; let mut resp_req = client - .post (&format! ("{}/http_response/{}", opt.relay_url, req_id)) + .post (&format! ("{}/7ZSFUKGV_http_response/{}", opt.relay_url, req_id)) .header (crate::PTTH_MAGIC_HEADER, base64::encode (rmp_serde::to_vec (&response.parts).unwrap ())); if let Some (body) = response.body { @@ -67,11 +67,7 @@ pub async fn main (opt: Opt) -> Result <(), Box > { let client = Arc::new (Client::new ()); let opt = Arc::new (opt); - let mut handlebars = handlebars::Handlebars::new (); - - handlebars.register_template_file ("file_server_dir_entry", "ptth_handlebars/file_server_dir_entry.html")?; - - let handlebars = Arc::new (handlebars); + let handlebars = Arc::new (file_server::load_templates ()?); let mut backoff_delay = 0; @@ -80,7 +76,7 @@ pub async fn main (opt: Opt) -> Result <(), Box > { delay_for (Duration::from_millis (backoff_delay)).await; } - let req_req = client.get (&format! ("{}/http_listen/{}", opt.relay_url, SERVER_NAME)); + let req_req = client.get (&format! ("{}/7ZSFUKGV_http_listen/{}", opt.relay_url, SERVER_NAME)); let req_resp = match req_req.send ().await { Err (e) => { diff --git a/todo.md b/todo.md index cb80038..9186089 100644 --- a/todo.md +++ b/todo.md @@ -8,3 +8,5 @@ impersonate servers - Prevent directory traversal attacks - Fix possible timing gap when refreshing http_listen (Just have client wait a few seconds?) - Error handling + +- Reverse proxy to other local servers