diff options
| author | Fuwn <[email protected]> | 2022-03-26 04:16:14 +0000 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2022-03-26 04:16:14 +0000 |
| commit | 676e8968f92caf28c21f4e0a91db82a91ea9939c (patch) | |
| tree | e601a5b4814903453475bcf824812e4e6bae6c88 | |
| parent | refactor(router): move default logger to logger feature (diff) | |
| download | windmark-676e8968f92caf28c21f4e0a91db82a91ea9939c.tar.xz windmark-676e8968f92caf28c21f4e0a91db82a91ea9939c.zip | |
feat: expose url to route
| -rw-r--r-- | examples/windmark.rs | 23 | ||||
| -rw-r--r-- | src/lib.rs | 65 |
2 files changed, 48 insertions, 40 deletions
diff --git a/examples/windmark.rs b/examples/windmark.rs index 847f2c3..378d0ad 100644 --- a/examples/windmark.rs +++ b/examples/windmark.rs @@ -24,30 +24,31 @@ fn main() -> std::io::Result<()> { .set_private_key_file("windmark_private.pem") .set_certificate_chain_file("windmark_pair.pem") .enable_default_logger(true) - .set_error_handler(|_| "error...".to_string()) - .set_pre_route_callback(|stream| { + .set_error_handler(|_, _| "error...".to_string()) + .set_pre_route_callback(|stream, url| { info!( - "accepted connection from {}", - stream.peer_addr().unwrap().ip() + "accepted connection from {} to {}", + stream.peer_addr().unwrap().ip(), + url.to_string() ) }) - .set_post_route_callback(|stream| { + .set_post_route_callback(|stream, _url| { info!( "closed connection from {}", stream.peer_addr().unwrap().ip() ) }) - .set_header(|_| "```\nART IS COOL\n```".to_string()) - .set_footer(|_| "Copyright 2022".to_string()) - .mount("/", |_| { + .set_header(|_, _| "```\nART IS COOL\n```".to_string()) + .set_footer(|_, _| "Copyright 2022".to_string()) + .mount("/", |_, _| { "# INDEX\n\nWelcome!\n\n=> /test Test Page\n=> /time Unix Epoch\n" .to_string() }) - .mount("/ip", |stream| { + .mount("/ip", |stream, _| { { format!("Hello, {}", stream.peer_addr().unwrap().ip()) }.into() }) - .mount("/test", |_| "hi there\n=> / back".to_string()) - .mount("/time", |_| { + .mount("/test", |_, _| "hi there\n=> / back".to_string()) + .mount("/time", |_, _| { std::time::UNIX_EPOCH .elapsed() .unwrap() @@ -41,17 +41,17 @@ use url::Url; #[derive(Clone)] pub struct Router { - routes: HashMap<String, fn(&TcpStream) -> String>, - error_handler: fn(&TcpStream) -> String, + routes: HashMap<String, fn(&TcpStream, &Url) -> String>, + error_handler: fn(&TcpStream, &Url) -> String, private_key_file_name: String, certificate_chain_file_name: String, - header: fn(&TcpStream) -> String, - footer: fn(&TcpStream) -> String, + header: fn(&TcpStream, &Url) -> String, + footer: fn(&TcpStream, &Url) -> String, ssl_acceptor: Arc<SslAcceptor>, #[cfg(feature = "logger")] default_logger: bool, - pre_route_callback: fn(&TcpStream), - post_route_callback: fn(&TcpStream), + pre_route_callback: fn(&TcpStream, &Url), + post_route_callback: fn(&TcpStream, &Url), } impl Router { /// Create a new `Router` @@ -106,13 +106,13 @@ impl Router { /// /// ```rust /// windmark::Router::new() - /// .mount("/", |_| "This is the index page!".into()) - /// .mount("/test", |_| "This is a test page!".into()); + /// .mount("/", |_, _| "This is the index page!".into()) + /// .mount("/test", |_, _| "This is a test page!".into()); /// ``` pub fn mount( &mut self, route: &str, - handler: fn(&TcpStream) -> String, + handler: fn(&TcpStream, &Url) -> String, ) -> &mut Self { self.routes.insert(route.to_string(), handler); @@ -125,11 +125,11 @@ impl Router { /// /// ```rust /// windmark::Router::new() - /// .set_error_handler(|_| "You have encountered an error!".into()); + /// .set_error_handler(|_, _| "You have encountered an error!".into()); /// ``` pub fn set_error_handler( &mut self, - handler: fn(&TcpStream) -> String, + handler: fn(&TcpStream, &Url) -> String, ) -> &mut Self { self.error_handler = handler; @@ -141,11 +141,14 @@ impl Router { /// # Examples /// /// ```rust - /// windmark::Router::new().set_header(|_| { + /// windmark::Router::new().set_header(|_, _| { /// "This will be displayed on every route! (at the top)".into() /// }); /// ``` - pub fn set_header(&mut self, handler: fn(&TcpStream) -> String) -> &mut Self { + pub fn set_header( + &mut self, + handler: fn(&TcpStream, &Url) -> String, + ) -> &mut Self { self.header = handler; self @@ -156,11 +159,14 @@ impl Router { /// # Examples /// /// ```rust - /// windmark::Router::new().set_footer(|_| { + /// windmark::Router::new().set_footer(|_, _| { /// "This will be displayed on every route! (at the bottom)".into() /// }); /// ``` - pub fn set_footer(&mut self, handler: fn(&TcpStream) -> String) -> &mut Self { + pub fn set_footer( + &mut self, + handler: fn(&TcpStream, &Url) -> String, + ) -> &mut Self { self.footer = handler; self @@ -228,14 +234,14 @@ impl Router { } } - (self.pre_route_callback)(stream.get_ref()); + (self.pre_route_callback)(stream.get_ref(), &url); stream .ssl_write( format!( "20 text/gemini; charset=utf-8\r\n{}{}{}", { - let header = (self.header)(stream.get_ref()); + let header = (self.header)(stream.get_ref(), &url); if header.is_empty() { "".to_string() @@ -244,10 +250,11 @@ impl Router { } }, self.routes.get(url.path()).unwrap_or(&self.error_handler)( - stream.get_ref() + stream.get_ref(), + &url ), { - let footer = (self.footer)(stream.get_ref()); + let footer = (self.footer)(stream.get_ref(), &url); if footer.is_empty() { "".to_string() @@ -260,7 +267,7 @@ impl Router { ) .unwrap(); - (self.post_route_callback)(stream.get_ref()); + (self.post_route_callback)(stream.get_ref(), &url); stream.shutdown().unwrap(); } @@ -326,7 +333,7 @@ impl Router { /// ```rust /// use log::info; /// - /// windmark::Router::new().set_pre_route_callback(|stream| { + /// windmark::Router::new().set_pre_route_callback(|stream, _url| { /// info!( /// "accepted connection from {}", /// stream.peer_addr().unwrap().ip(), @@ -335,7 +342,7 @@ impl Router { /// ``` pub fn set_pre_route_callback( &mut self, - callback: fn(&TcpStream), + callback: fn(&TcpStream, &Url), ) -> &mut Self { self.pre_route_callback = callback; @@ -349,7 +356,7 @@ impl Router { /// ```rust /// use log::info; /// - /// windmark::Router::new().set_post_route_callback(|stream| { + /// windmark::Router::new().set_post_route_callback(|stream, _url| { /// info!( /// "closed connection from {}", /// stream.peer_addr().unwrap().ip(), @@ -358,7 +365,7 @@ impl Router { /// ``` pub fn set_post_route_callback( &mut self, - callback: fn(&TcpStream), + callback: fn(&TcpStream, &Url), ) -> &mut Self { self.post_route_callback = callback; @@ -369,13 +376,13 @@ impl Default for Router { fn default() -> Self { Self { routes: HashMap::default(), - error_handler: |_| { + error_handler: |_, _| { "This capsule has not implemented an error handler...".to_string() }, private_key_file_name: "".to_string(), certificate_chain_file_name: "".to_string(), - header: |_| "".to_string(), - footer: |_| "".to_string(), + header: |_, _| "".to_string(), + footer: |_, _| "".to_string(), ssl_acceptor: Arc::new( SslAcceptor::mozilla_intermediate(SslMethod::tls()) .unwrap() @@ -383,8 +390,8 @@ impl Default for Router { ), #[cfg(feature = "logger")] default_logger: false, - pre_route_callback: |_| {}, - post_route_callback: |_| {}, + pre_route_callback: |_, _| {}, + post_route_callback: |_, _| {}, } } } |