some refactor
This commit is contained in:
parent
235284094c
commit
60e53910c2
@ -30,7 +30,7 @@ impl HttpServer for EzSite {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn on_start(&mut self, host: &str, listener: &TcpListener) {
|
async fn on_start(&mut self, host: &str, _listener: &TcpListener) {
|
||||||
println!("Http server started on {}", host);
|
println!("Http server started on {}", host);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
90
src/lib.rs
90
src/lib.rs
@ -1,6 +1,10 @@
|
|||||||
use serde_json::Value;
|
use serde_json::Value;
|
||||||
use std::{
|
use std::{
|
||||||
boxed::Box, error::Error, net::{IpAddr, SocketAddr, ToSocketAddrs}, ptr::read, sync::Arc
|
future::Future,
|
||||||
|
boxed::Box,
|
||||||
|
error::Error,
|
||||||
|
net::{IpAddr, SocketAddr, ToSocketAddrs},
|
||||||
|
sync::Arc
|
||||||
};
|
};
|
||||||
use tokio::io::{AsyncReadExt, AsyncWriteExt, BufReader};
|
use tokio::io::{AsyncReadExt, AsyncWriteExt, BufReader};
|
||||||
use tokio::{
|
use tokio::{
|
||||||
@ -8,7 +12,6 @@ use tokio::{
|
|||||||
net::{TcpListener, TcpStream},
|
net::{TcpListener, TcpStream},
|
||||||
sync::Mutex,
|
sync::Mutex,
|
||||||
};
|
};
|
||||||
use urlencoding::{decode, encode};
|
|
||||||
|
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
pub struct Headers {
|
pub struct Headers {
|
||||||
@ -36,7 +39,7 @@ impl Headers {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn contains_value(self, value: String) -> bool {
|
pub fn contains_value(self, value: String) -> bool {
|
||||||
for (k, v) in self.entries {
|
for (_, v) in self.entries {
|
||||||
if v == value {
|
if v == value {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -45,7 +48,7 @@ impl Headers {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn contains_key(self, key: String) -> bool {
|
pub fn contains_key(self, key: String) -> bool {
|
||||||
for (k, v) in self.entries {
|
for (k, _) in self.entries {
|
||||||
if k == key.to_lowercase() {
|
if k == key.to_lowercase() {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -83,7 +86,7 @@ impl Headers {
|
|||||||
|
|
||||||
pub fn keys(self) -> Vec<String> {
|
pub fn keys(self) -> Vec<String> {
|
||||||
let mut keys = Vec::new();
|
let mut keys = Vec::new();
|
||||||
for (k, v) in self.entries {
|
for (k, _) in self.entries {
|
||||||
keys.push(k.to_lowercase());
|
keys.push(k.to_lowercase());
|
||||||
}
|
}
|
||||||
keys
|
keys
|
||||||
@ -91,7 +94,7 @@ impl Headers {
|
|||||||
|
|
||||||
pub fn values(self) -> Vec<String> {
|
pub fn values(self) -> Vec<String> {
|
||||||
let mut values = Vec::new();
|
let mut values = Vec::new();
|
||||||
for (k, v) in self.entries {
|
for (_, v) in self.entries {
|
||||||
values.push(v);
|
values.push(v);
|
||||||
}
|
}
|
||||||
values
|
values
|
||||||
@ -169,16 +172,16 @@ impl Error for HttpError {}
|
|||||||
|
|
||||||
async fn read_line(data: &mut BufReader<&mut TcpStream>) -> Result<String, HttpError> {
|
async fn read_line(data: &mut BufReader<&mut TcpStream>) -> Result<String, HttpError> {
|
||||||
let mut buf = String::new();
|
let mut buf = String::new();
|
||||||
let mut buf = match data.read_line(&mut buf).await {
|
match data.read_line(&mut buf).await {
|
||||||
Ok(i) => {
|
Ok(i) => {
|
||||||
if i == 0 {
|
if i == 0 {
|
||||||
return Err(HttpError::ReadLineEof);
|
Err(HttpError::ReadLineEof)
|
||||||
|
} else {
|
||||||
|
Ok(buf)
|
||||||
}
|
}
|
||||||
buf
|
|
||||||
}
|
}
|
||||||
Err(_) => return Err(HttpError::ReadLineUnknown),
|
Err(_) => Err(HttpError::ReadLineUnknown),
|
||||||
};
|
}
|
||||||
Ok(buf.to_string())
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn read_line_crlf(data: &mut BufReader<&mut TcpStream>) -> Result<String, HttpError> {
|
async fn read_line_crlf(data: &mut BufReader<&mut TcpStream>) -> Result<String, HttpError> {
|
||||||
@ -242,15 +245,12 @@ impl HttpRequest {
|
|||||||
_ => [127, 0, 0, 1],
|
_ => [127, 0, 0, 1],
|
||||||
};
|
};
|
||||||
|
|
||||||
let ip_str = octets[0].to_string().as_str().to_owned()
|
let ip_str = octets[0].to_string()
|
||||||
+ "."
|
+ "." + &octets[1].to_string()
|
||||||
+ octets[1].to_string().as_str()
|
+ "." + &octets[2].to_string()
|
||||||
+ "."
|
+ "." + &octets[3].to_string();
|
||||||
+ octets[2].to_string().as_str()
|
|
||||||
+ "."
|
|
||||||
+ octets[3].to_string().as_str();
|
|
||||||
|
|
||||||
let mut status = split(
|
let status = split(
|
||||||
match read_line_crlf(&mut data).await {
|
match read_line_crlf(&mut data).await {
|
||||||
Ok(i) => i,
|
Ok(i) => i,
|
||||||
Err(e) => return Err(e),
|
Err(e) => return Err(e),
|
||||||
@ -295,11 +295,11 @@ impl HttpRequest {
|
|||||||
};
|
};
|
||||||
|
|
||||||
params.insert(
|
params.insert(
|
||||||
match decode(k) {
|
match urlencoding::decode(k) {
|
||||||
Ok(i) => i.to_string(),
|
Ok(i) => i.to_string(),
|
||||||
Err(_) => return Err(HttpError::InvalidQuery),
|
Err(_) => return Err(HttpError::InvalidQuery),
|
||||||
},
|
},
|
||||||
match decode(v) {
|
match urlencoding::decode(v) {
|
||||||
Ok(i) => Value::String(i.to_string()),
|
Ok(i) => Value::String(i.to_string()),
|
||||||
Err(_) => return Err(HttpError::InvalidQuery),
|
Err(_) => return Err(HttpError::InvalidQuery),
|
||||||
},
|
},
|
||||||
@ -374,11 +374,11 @@ impl HttpRequest {
|
|||||||
};
|
};
|
||||||
|
|
||||||
params.insert(
|
params.insert(
|
||||||
match decode(k) {
|
match urlencoding::decode(k) {
|
||||||
Ok(i) => i.to_string(),
|
Ok(i) => i.to_string(),
|
||||||
Err(_) => return Err(HttpError::InvalidQuery),
|
Err(_) => return Err(HttpError::InvalidQuery),
|
||||||
},
|
},
|
||||||
match decode(v) {
|
match urlencoding::decode(v) {
|
||||||
Ok(i) => Value::String(i.to_string()),
|
Ok(i) => Value::String(i.to_string()),
|
||||||
Err(_) => return Err(HttpError::InvalidQuery),
|
Err(_) => return Err(HttpError::InvalidQuery),
|
||||||
},
|
},
|
||||||
@ -399,7 +399,7 @@ impl HttpRequest {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn read_with_rrs(mut data: BufReader<&mut TcpStream>, addr: &SocketAddr) -> Result<HttpRequest, HttpError> {
|
pub async fn read_with_rrs(mut data: BufReader<&mut TcpStream>) -> Result<HttpRequest, HttpError> {
|
||||||
let addr = match read_line_lf(&mut data).await {
|
let addr = match read_line_lf(&mut data).await {
|
||||||
Ok(i) => i,
|
Ok(i) => i,
|
||||||
Err(e) => { return Err(e); }
|
Err(e) => { return Err(e); }
|
||||||
@ -415,9 +415,9 @@ impl HttpRequest {
|
|||||||
if let Value::Object(obj) = self.params.clone() {
|
if let Value::Object(obj) = self.params.clone() {
|
||||||
for (k, v) in obj {
|
for (k, v) in obj {
|
||||||
query.push_str(if i { "?" } else { "&" });
|
query.push_str(if i { "?" } else { "&" });
|
||||||
query.push_str(encode(k.as_str()).to_string().as_str());
|
query.push_str(urlencoding::encode(k.as_str()).to_string().as_str());
|
||||||
query.push_str("=");
|
query.push_str("=");
|
||||||
query.push_str(encode(v.as_str().unwrap()).to_string().as_str());
|
query.push_str(urlencoding::encode(v.as_str().unwrap()).to_string().as_str());
|
||||||
i = false;
|
i = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -547,9 +547,9 @@ impl HttpResponse {
|
|||||||
loop {
|
loop {
|
||||||
let mut buf: Vec<u8> = vec![0; 1024 * 32];
|
let mut buf: Vec<u8> = vec![0; 1024 * 32];
|
||||||
|
|
||||||
let mut buf_len: usize = match data.read(&mut buf).await {
|
let buf_len = match data.read(&mut buf).await {
|
||||||
Ok(i) => i,
|
Ok(i) => i,
|
||||||
Err(e) => {
|
Err(_) => {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -601,18 +601,15 @@ impl HttpResponse {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub trait HttpServer: Sync {
|
pub trait HttpServer: Sync {
|
||||||
async fn on_start(&mut self, host: &str, listener: &TcpListener);
|
fn on_start(&mut self, host: &str, listener: &TcpListener) -> impl Future<Output = ()> + Send;
|
||||||
async fn on_close(&mut self);
|
fn on_close(&mut self) -> impl Future<Output = ()> + Send;
|
||||||
fn on_request(&mut self, req: &HttpRequest) -> impl std::future::Future<Output = Option<HttpResponse>> + std::marker::Send;
|
fn on_request(&mut self, req: &HttpRequest) -> impl Future<Output = Option<HttpResponse>> + Send;
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn handle_connection<S: HttpServer + Send + 'static>(
|
async fn handle_connection<S: HttpServer + Send + 'static>(
|
||||||
server: Arc<Mutex<S>>,
|
server: Arc<Mutex<S>>,
|
||||||
mut sock: TcpStream,
|
mut sock: TcpStream
|
||||||
addr: std::net::SocketAddr,
|
) {
|
||||||
) where
|
|
||||||
S: HttpServer,
|
|
||||||
{
|
|
||||||
let addr = sock.peer_addr().unwrap();
|
let addr = sock.peer_addr().unwrap();
|
||||||
|
|
||||||
let req = match HttpRequest::read(BufReader::new(&mut sock), &addr).await {
|
let req = match HttpRequest::read(BufReader::new(&mut sock), &addr).await {
|
||||||
@ -630,20 +627,20 @@ pub async fn handle_connection<S: HttpServer + Send + 'static>(
|
|||||||
resp.write(&mut sock).await.unwrap();
|
resp.write(&mut sock).await.unwrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn start_server(mut server: impl HttpServer + Send + 'static, host: &str) -> Result<(), Box<dyn Error>> {
|
pub async fn start_server(server: impl HttpServer + Send + 'static, host: &str) -> Result<(), Box<dyn Error>> {
|
||||||
let server = Arc::new(Mutex::new(server));
|
let server = Arc::new(Mutex::new(server));
|
||||||
let listener = TcpListener::bind(host).await?;
|
let listener = TcpListener::bind(host).await?;
|
||||||
|
|
||||||
server.lock().await.on_start(host, &listener).await;
|
server.lock().await.on_start(host, &listener).await;
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
let (sock, addr) = match listener.accept().await {
|
let (sock, _) = match listener.accept().await {
|
||||||
Ok(i) => i,
|
Ok(i) => i,
|
||||||
Err(_) => { break; }
|
Err(_) => { break; }
|
||||||
};
|
};
|
||||||
|
|
||||||
let now_server = Arc::clone(&server);
|
let now_server = Arc::clone(&server);
|
||||||
tokio::spawn(handle_connection(now_server, sock, addr));
|
tokio::spawn(handle_connection(now_server, sock));
|
||||||
}
|
}
|
||||||
|
|
||||||
server.lock().await.on_close().await;
|
server.lock().await.on_close().await;
|
||||||
@ -653,20 +650,20 @@ pub async fn start_server(mut server: impl HttpServer + Send + 'static, host: &s
|
|||||||
|
|
||||||
|
|
||||||
// http rrs
|
// http rrs
|
||||||
pub async fn start_server_rrs(mut server: impl HttpServer + Send + 'static, host: &str) -> Result<(), Box<dyn Error>> {
|
pub async fn start_server_rrs(server: impl HttpServer + Send + 'static, host: &str) -> Result<(), Box<dyn Error>> {
|
||||||
let server = Arc::new(Mutex::new(server));
|
let server = Arc::new(Mutex::new(server));
|
||||||
let listener = TcpListener::bind(host).await?;
|
let listener = TcpListener::bind(host).await?;
|
||||||
|
|
||||||
server.lock().await.on_start(host, &listener).await;
|
server.lock().await.on_start(host, &listener).await;
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
let (sock, addr) = match listener.accept().await {
|
let (sock, _) = match listener.accept().await {
|
||||||
Ok(i) => i,
|
Ok(i) => i,
|
||||||
Err(_) => { break; }
|
Err(_) => { break; }
|
||||||
};
|
};
|
||||||
|
|
||||||
let now_server = Arc::clone(&server);
|
let now_server = Arc::clone(&server);
|
||||||
tokio::spawn(handle_connection_rrs(now_server, sock, addr));
|
tokio::spawn(handle_connection_rrs(now_server, sock));
|
||||||
}
|
}
|
||||||
|
|
||||||
server.lock().await.on_close().await;
|
server.lock().await.on_close().await;
|
||||||
@ -678,10 +675,9 @@ pub async fn start_server_rrs(mut server: impl HttpServer + Send + 'static, host
|
|||||||
// http rrs
|
// http rrs
|
||||||
async fn handle_connection_rrs<S: HttpServer + Send + 'static>(
|
async fn handle_connection_rrs<S: HttpServer + Send + 'static>(
|
||||||
server: Arc<Mutex<S>>,
|
server: Arc<Mutex<S>>,
|
||||||
mut sock: TcpStream,
|
mut sock: TcpStream
|
||||||
addr: std::net::SocketAddr,
|
|
||||||
) {
|
) {
|
||||||
let req = match HttpRequest::read_with_rrs(BufReader::new(&mut sock), &addr).await {
|
let req = match HttpRequest::read_with_rrs(BufReader::new(&mut sock)).await {
|
||||||
Ok(i) => i,
|
Ok(i) => i,
|
||||||
Err(_) => {
|
Err(_) => {
|
||||||
return;
|
return;
|
||||||
|
@ -24,7 +24,7 @@ impl HttpServer for EzSite {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn on_start(&mut self, host: &str, listener: &TcpListener) {
|
async fn on_start(&mut self, host: &str, _listener: &TcpListener) {
|
||||||
println!("Http server started on {}", host);
|
println!("Http server started on {}", host);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user