From 3afda2a37969bb08d014f06917158dde6aac9651 Mon Sep 17 00:00:00 2001 From: Rohit Joshi Date: Wed, 6 Mar 2019 22:27:49 -0500 Subject: [PATCH 1/6] Added shutdown flag --- src/lib.rs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index 383ae63..c5b7bd0 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -47,6 +47,8 @@ use std::io::prelude::*; use std::net::{TcpListener, TcpStream}; use std::path::{Path, PathBuf}; use std::time::Duration; +use std::sync::Arc; +use std::sync::atomic::{AtomicBool,Ordering}; use std::borrow::Borrow; @@ -69,6 +71,7 @@ pub struct Server { handler: Handler, timeout: Option, static_directory: Option, + shutdown: Arc, } impl fmt::Debug for Server { @@ -117,6 +120,7 @@ impl Server { handler: Box::new(handler), timeout: None, static_directory: Some(PathBuf::from("public")), + shutdown: AtomicBool::new(false) } } @@ -157,6 +161,7 @@ impl Server { handler: Box::new(handler), timeout: Some(timeout), static_directory: Some(PathBuf::from("public")), + shutdown: AtomicBool::new(false) } } @@ -253,6 +258,10 @@ impl Server { let mut incoming = listener.incoming(); loop { + // check if shutdown received + if shutdown.load(Ordering::SeqCst) { + return; + } // Incoming is an endless iterator, so it's okay to unwrap on it. let stream = incoming.next().unwrap(); let stream = stream.expect("Error handling TCP stream."); From 2414e088974d2c1d77205c9024e81f4974d919d8 Mon Sep 17 00:00:00 2001 From: Rohit Joshi Date: Wed, 6 Mar 2019 22:28:17 -0500 Subject: [PATCH 2/6] Update lib.rs --- src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index c5b7bd0..c23d6da 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -71,7 +71,7 @@ pub struct Server { handler: Handler, timeout: Option, static_directory: Option, - shutdown: Arc, + pub shutdown: Arc, } impl fmt::Debug for Server { From 724ee28eaad6456695221972601ff83a0aee6cf6 Mon Sep 17 00:00:00 2001 From: Rohit Joshi Date: Wed, 6 Mar 2019 22:29:39 -0500 Subject: [PATCH 3/6] Update lib.rs --- src/lib.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index c23d6da..753dd68 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -120,7 +120,7 @@ impl Server { handler: Box::new(handler), timeout: None, static_directory: Some(PathBuf::from("public")), - shutdown: AtomicBool::new(false) + shutdown: Arc::new(AtomicBool::new(false)) } } @@ -161,7 +161,7 @@ impl Server { handler: Box::new(handler), timeout: Some(timeout), static_directory: Some(PathBuf::from("public")), - shutdown: AtomicBool::new(false) + shutdown: Arc::new(AtomicBool::new(false)) } } From 9754926f8859046d4a50179763c94ae5c3815096 Mon Sep 17 00:00:00 2001 From: Rohit Joshi Date: Wed, 6 Mar 2019 22:35:59 -0500 Subject: [PATCH 4/6] Update lib.rs --- src/lib.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 753dd68..f1f031c 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -251,7 +251,7 @@ impl Server { /// server.listen_on_socket(listener); /// } /// ``` - pub fn listen_on_socket(&self, listener: TcpListener) -> ! { + pub fn listen_on_socket(&self, listener: TcpListener) { const READ_TIMEOUT_MS: u64 = 20; let num_threads = self.pool_size(); let mut pool = Pool::new(num_threads); @@ -259,7 +259,7 @@ impl Server { loop { // check if shutdown received - if shutdown.load(Ordering::SeqCst) { + if self.shutdown.load(Ordering::SeqCst) { return; } // Incoming is an endless iterator, so it's okay to unwrap on it. From e49611c18bc2f119774fa608b47c0b7a74918d30 Mon Sep 17 00:00:00 2001 From: Rohit Joshi Date: Wed, 6 Mar 2019 22:42:44 -0500 Subject: [PATCH 5/6] Update lib.rs --- src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index f1f031c..0952d32 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -212,7 +212,7 @@ impl Server { /// server.listen("127.0.0.1", "7979"); /// } /// ``` - pub fn listen(&self, host: &str, port: &str) -> ! { + pub fn listen(&self, host: &str, port: &str) { let listener = TcpListener::bind(format!("{}:{}", host, port)).expect("Error starting the server."); From 70b17ea616623a090b9e4b3ce72e92a81ac1b13f Mon Sep 17 00:00:00 2001 From: Rohit Joshi Date: Wed, 6 Mar 2019 23:07:18 -0500 Subject: [PATCH 6/6] running cargo fmt all --- src/lib.rs | 14 +++++++------- src/parsing.rs | 6 ++++-- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 0952d32..334ee41 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -46,9 +46,9 @@ use std::fs::File; use std::io::prelude::*; use std::net::{TcpListener, TcpStream}; use std::path::{Path, PathBuf}; -use std::time::Duration; +use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::Arc; -use std::sync::atomic::{AtomicBool,Ordering}; +use std::time::Duration; use std::borrow::Borrow; @@ -120,7 +120,7 @@ impl Server { handler: Box::new(handler), timeout: None, static_directory: Some(PathBuf::from("public")), - shutdown: Arc::new(AtomicBool::new(false)) + shutdown: Arc::new(AtomicBool::new(false)), } } @@ -161,7 +161,7 @@ impl Server { handler: Box::new(handler), timeout: Some(timeout), static_directory: Some(PathBuf::from("public")), - shutdown: Arc::new(AtomicBool::new(false)) + shutdown: Arc::new(AtomicBool::new(false)), } } @@ -212,7 +212,7 @@ impl Server { /// server.listen("127.0.0.1", "7979"); /// } /// ``` - pub fn listen(&self, host: &str, port: &str) { + pub fn listen(&self, host: &str, port: &str) { let listener = TcpListener::bind(format!("{}:{}", host, port)).expect("Error starting the server."); @@ -251,7 +251,7 @@ impl Server { /// server.listen_on_socket(listener); /// } /// ``` - pub fn listen_on_socket(&self, listener: TcpListener) { + pub fn listen_on_socket(&self, listener: TcpListener) { const READ_TIMEOUT_MS: u64 = 20; let num_threads = self.pool_size(); let mut pool = Pool::new(num_threads); @@ -350,7 +350,7 @@ impl Server { fn handle_connection(&self, mut stream: TcpStream) -> Result<(), Error> { let request = match request::read(&mut stream, self.timeout) { Err(Error::ConnectionClosed) | Err(Error::Timeout) | Err(Error::HttpParse(_)) => { - return Ok(()) + return Ok(()); } Err(Error::RequestTooLarge) => { diff --git a/src/parsing.rs b/src/parsing.rs index 3d5865c..f564a7f 100644 --- a/src/parsing.rs +++ b/src/parsing.rs @@ -95,7 +95,8 @@ pub fn try_parse_request(buffer: Vec) -> Result) -> Result>(); + ) + .collect::>(); (method, proto, headers, n) }) };