add RunningHttpServer
This commit is contained in:
parent
0ef43dcb47
commit
7c5e6dc9c7
@ -70,6 +70,6 @@ fn main() {
|
|||||||
HttpServerStarter::new(site, host)
|
HttpServerStarter::new(site, host)
|
||||||
.timeout(Some(Duration::from_secs(5)))
|
.timeout(Some(Duration::from_secs(5)))
|
||||||
.threads(5)
|
.threads(5)
|
||||||
.start()
|
.start_forever()
|
||||||
.expect("http server error");
|
.expect("http server error");
|
||||||
}
|
}
|
||||||
|
90
src/lib.rs
90
src/lib.rs
@ -1,6 +1,7 @@
|
|||||||
use futures::executor::block_on;
|
use futures::executor::block_on;
|
||||||
use serde_json::Value;
|
use serde_json::Value;
|
||||||
use std::io::{Read, Write};
|
use std::io::{Read, Write};
|
||||||
|
use std::sync::atomic::{AtomicBool, Ordering};
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
use std::{
|
use std::{
|
||||||
boxed::Box,
|
boxed::Box,
|
||||||
@ -645,6 +646,22 @@ pub struct HttpServerStarter<T: HttpServer + Send + 'static> {
|
|||||||
threads: usize,
|
threads: usize,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub struct RunningHttpServer {
|
||||||
|
thread: thread::JoinHandle<()>,
|
||||||
|
running: Arc<AtomicBool>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl RunningHttpServer {
|
||||||
|
fn new(thread: thread::JoinHandle<()>, running: Arc<AtomicBool>) -> Self {
|
||||||
|
RunningHttpServer { thread, running }
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn close(self) {
|
||||||
|
self.running.store(false, Ordering::Release);
|
||||||
|
self.thread.join().unwrap();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl<T: HttpServer + Send + 'static> HttpServerStarter<T> {
|
impl<T: HttpServer + Send + 'static> HttpServerStarter<T> {
|
||||||
pub fn new(http_server: T, host: &str) -> Self {
|
pub fn new(http_server: T, host: &str) -> Self {
|
||||||
HttpServerStarter {
|
HttpServerStarter {
|
||||||
@ -681,7 +698,7 @@ impl<T: HttpServer + Send + 'static> HttpServerStarter<T> {
|
|||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn start(self) -> Result<(), Box<dyn Error>> {
|
pub fn start_forever(self) -> Result<(), Box<dyn Error>> {
|
||||||
let handler = if self.support_http_rrs {
|
let handler = if self.support_http_rrs {
|
||||||
move |server, sock| {
|
move |server, sock| {
|
||||||
handle_connection_rrs(server, sock);
|
handle_connection_rrs(server, sock);
|
||||||
@ -692,10 +709,12 @@ impl<T: HttpServer + Send + 'static> HttpServerStarter<T> {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let running = Arc::new(AtomicBool::new(true));
|
||||||
|
|
||||||
if self.threads == 0 {
|
if self.threads == 0 {
|
||||||
start_server(self.http_server, &self.host, self.timeout, handler)
|
start_server(self.http_server, &self.host, self.timeout, handler, running)
|
||||||
} else if self.threads == 1 {
|
} else if self.threads == 1 {
|
||||||
start_server_sync(self.http_server, &self.host, self.timeout, handler)
|
start_server_sync(self.http_server, &self.host, self.timeout, handler, running)
|
||||||
} else {
|
} else {
|
||||||
start_server_with_threadpool(
|
start_server_with_threadpool(
|
||||||
self.http_server,
|
self.http_server,
|
||||||
@ -703,9 +722,63 @@ impl<T: HttpServer + Send + 'static> HttpServerStarter<T> {
|
|||||||
self.timeout,
|
self.timeout,
|
||||||
self.threads,
|
self.threads,
|
||||||
handler,
|
handler,
|
||||||
|
running,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn start(self) -> RunningHttpServer {
|
||||||
|
let handler = if self.support_http_rrs {
|
||||||
|
move |server, sock| {
|
||||||
|
handle_connection_rrs(server, sock);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
move |server, sock| {
|
||||||
|
handle_connection(server, sock);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
let running = Arc::new(AtomicBool::new(true));
|
||||||
|
let running_clone = running.clone();
|
||||||
|
|
||||||
|
let thread = if self.threads == 0 {
|
||||||
|
thread::spawn(move || {
|
||||||
|
start_server(
|
||||||
|
self.http_server,
|
||||||
|
&self.host,
|
||||||
|
self.timeout,
|
||||||
|
handler,
|
||||||
|
running_clone,
|
||||||
|
)
|
||||||
|
.expect("http server error");
|
||||||
|
})
|
||||||
|
} else if self.threads == 1 {
|
||||||
|
thread::spawn(move || {
|
||||||
|
start_server_sync(
|
||||||
|
self.http_server,
|
||||||
|
&self.host,
|
||||||
|
self.timeout,
|
||||||
|
handler,
|
||||||
|
running_clone,
|
||||||
|
)
|
||||||
|
.expect("http server error");
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
thread::spawn(move || {
|
||||||
|
start_server_with_threadpool(
|
||||||
|
self.http_server,
|
||||||
|
&self.host,
|
||||||
|
self.timeout,
|
||||||
|
self.threads,
|
||||||
|
handler,
|
||||||
|
running_clone,
|
||||||
|
)
|
||||||
|
.expect("http server error")
|
||||||
|
})
|
||||||
|
};
|
||||||
|
|
||||||
|
RunningHttpServer::new(thread, running.clone())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn start_server_with_threadpool<F, S>(
|
fn start_server_with_threadpool<F, S>(
|
||||||
@ -714,6 +787,7 @@ fn start_server_with_threadpool<F, S>(
|
|||||||
timeout: Option<Duration>,
|
timeout: Option<Duration>,
|
||||||
threads: usize,
|
threads: usize,
|
||||||
handler: F,
|
handler: F,
|
||||||
|
running: Arc<AtomicBool>,
|
||||||
) -> Result<(), Box<dyn Error>>
|
) -> Result<(), Box<dyn Error>>
|
||||||
where
|
where
|
||||||
F: (Fn(Arc<Mutex<S>>, TcpStream) -> ()) + Send + 'static + Copy,
|
F: (Fn(Arc<Mutex<S>>, TcpStream) -> ()) + Send + 'static + Copy,
|
||||||
@ -727,7 +801,7 @@ where
|
|||||||
let server_clone = server.clone();
|
let server_clone = server.clone();
|
||||||
block_on(server_clone.lock().unwrap().on_start(&host_clone));
|
block_on(server_clone.lock().unwrap().on_start(&host_clone));
|
||||||
|
|
||||||
loop {
|
while running.load(Ordering::Acquire) {
|
||||||
let (sock, _) = match listener.accept() {
|
let (sock, _) = match listener.accept() {
|
||||||
Ok(i) => i,
|
Ok(i) => i,
|
||||||
Err(_) => {
|
Err(_) => {
|
||||||
@ -744,6 +818,8 @@ where
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
threadpool.join();
|
||||||
|
|
||||||
block_on(server.lock().unwrap().on_close());
|
block_on(server.lock().unwrap().on_close());
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
@ -754,6 +830,7 @@ fn start_server<F, S>(
|
|||||||
host: &str,
|
host: &str,
|
||||||
timeout: Option<Duration>,
|
timeout: Option<Duration>,
|
||||||
handler: F,
|
handler: F,
|
||||||
|
running: Arc<AtomicBool>,
|
||||||
) -> Result<(), Box<dyn Error>>
|
) -> Result<(), Box<dyn Error>>
|
||||||
where
|
where
|
||||||
F: (Fn(Arc<Mutex<S>>, TcpStream) -> ()) + Send + 'static + Copy,
|
F: (Fn(Arc<Mutex<S>>, TcpStream) -> ()) + Send + 'static + Copy,
|
||||||
@ -766,7 +843,7 @@ where
|
|||||||
let server_clone = server.clone();
|
let server_clone = server.clone();
|
||||||
block_on(server_clone.lock().unwrap().on_start(&host_clone));
|
block_on(server_clone.lock().unwrap().on_start(&host_clone));
|
||||||
|
|
||||||
loop {
|
while running.load(Ordering::Acquire) {
|
||||||
let (sock, _) = match listener.accept() {
|
let (sock, _) = match listener.accept() {
|
||||||
Ok(i) => i,
|
Ok(i) => i,
|
||||||
Err(_) => {
|
Err(_) => {
|
||||||
@ -793,6 +870,7 @@ fn start_server_sync<F, S>(
|
|||||||
host: &str,
|
host: &str,
|
||||||
timeout: Option<Duration>,
|
timeout: Option<Duration>,
|
||||||
handler: F,
|
handler: F,
|
||||||
|
running: Arc<AtomicBool>,
|
||||||
) -> Result<(), Box<dyn Error>>
|
) -> Result<(), Box<dyn Error>>
|
||||||
where
|
where
|
||||||
F: (Fn(Arc<Mutex<S>>, TcpStream) -> ()) + Send + 'static + Copy,
|
F: (Fn(Arc<Mutex<S>>, TcpStream) -> ()) + Send + 'static + Copy,
|
||||||
@ -805,7 +883,7 @@ where
|
|||||||
let server_clone = server.clone();
|
let server_clone = server.clone();
|
||||||
block_on(server_clone.lock().unwrap().on_start(&host_clone));
|
block_on(server_clone.lock().unwrap().on_start(&host_clone));
|
||||||
|
|
||||||
loop {
|
while running.load(Ordering::Acquire) {
|
||||||
let (sock, _) = match listener.accept() {
|
let (sock, _) = match listener.accept() {
|
||||||
Ok(i) => i,
|
Ok(i) => i,
|
||||||
Err(_) => {
|
Err(_) => {
|
||||||
|
@ -44,6 +44,6 @@ fn main() {
|
|||||||
HttpServerStarter::new(site, host)
|
HttpServerStarter::new(site, host)
|
||||||
.timeout(Some(Duration::from_secs(5))) // read & write timeout
|
.timeout(Some(Duration::from_secs(5))) // read & write timeout
|
||||||
.threads(5) // threadpool size
|
.threads(5) // threadpool size
|
||||||
.start()
|
.start_forever()
|
||||||
.expect("http server error");
|
.expect("http server error");
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user