use std::collections::HashMap;
use std::io::prelude::*;
use std::net::TcpStream;
use std::net::TcpListener;
use std::time::Duration;
use std::sync::mpsc::{self, Receiver, Sender};
use chrono::{DateTime, Local};
use crate::server::request_parser::request_parser::{Request, request_parser};
use crate::server::response_parser::response_parser::{Response, response_parser};
use crate::log::{log_more_text_writer, log_text_writer, LogTypeTag};
pub mod request_parser;
pub mod response_parser;
pub mod page_manager;
fn get_this_name() -> String{
return String::from("main/server");
}
enum TaskSuccess {
Success,
Error
}
pub type RequestHandler = Box<dyn Send + (Fn(&Request)) + 'static>;
pub type ResponseHandler = Box<dyn Send + (Fn(&Request) -> Response) + 'static>;
pub struct ClientEvent {
pub event_request : Option<RequestHandler>,
pub event_response : Option<ResponseHandler>
}
pub static mut EVENT: ClientEvent = ClientEvent {
event_request: None,
event_response: None
};
pub struct ThreadTaskArgs {
pub tcp_stream : TcpStream
}
pub fn start_server(server_ip : String, server_port : u16) {
let listener = TcpListener::bind(format!("{}:{}", server_ip, server_port)).unwrap();
for stream in listener.incoming() {
match stream {
Ok(stream) => { match &stream.set_read_timeout(Some(Duration::from_secs(15))) {
Ok(_) => {}
Err(error) => {
println!("{}", log_text_writer(error.to_string(), get_this_name(), LogTypeTag::WARNING));
}
};
match &stream.set_write_timeout(Some(Duration::from_secs(15))) {
Ok(_) => {}
Err(error) => {
println!("{}", log_text_writer(error.to_string(), get_this_name(), LogTypeTag::WARNING));
}
};
let arg : ThreadTaskArgs = ThreadTaskArgs {
tcp_stream: stream
};
std::thread::spawn(move || {
handle_connection(arg);
});
},
Err(error) => { println!("{}", log_text_writer(error.to_string(), get_this_name(), LogTypeTag::WARNING));
}
};
}
}
fn handle_connection(mut threadPoolArgs: ThreadTaskArgs) {
let mut task_success = TaskSuccess::Success;
let mut buffer = [0; 1024];
match &threadPoolArgs.tcp_stream.read(&mut buffer) {
Ok(_) => {},
Err(error) => {
task_success = TaskSuccess::Error;
println!("{}", log_text_writer(error.to_string(), get_this_name(), LogTypeTag::WARNING));
}
}
let binding = String::from_utf8_lossy(&buffer);
let mut http_request : Vec<&str> = binding.split("\r\n").collect();
let client_ip : String = match threadPoolArgs.tcp_stream.peer_addr() {
Ok(value) => value.ip().to_string(),
Err(_) => String::from("(NoIPAddress)")
};
match task_success {
_Success => { let request = request_parser(&http_request);
unsafe {
match &EVENT.event_request {
Some(Box) => {
println!("{}", log_more_text_writer(String::from("Run request EVENT handler."), get_this_name(), LogTypeTag::INFO, format!("IP:{}", client_ip)));
Box(&request);
},
None => {
println!("{}", log_more_text_writer(String::from("Request EVENT handler failed, no registered EVENT."), get_this_name(), LogTypeTag::INFO, format!("IP: {}", client_ip)));
}
}
}
unsafe {
match &EVENT.event_response {
Some(Box) => {
println!("{}", log_more_text_writer(String::from("Run response EVENT handler."), get_this_name(), LogTypeTag::INFO, format!("IP:{}", client_ip)));
let result : Response = Box(&request);
let mut response = response_parser(result);
match threadPoolArgs.tcp_stream.write_all(response.as_bytes()) {
Ok(_) => {}
Err(error) => {
println!("{}", log_text_writer(error.to_string(), get_this_name(), LogTypeTag::WARNING));
}
}
match threadPoolArgs.tcp_stream.flush() {
Ok(_) => {}
Err(error) => {
println!("{}", log_text_writer(error.to_string(), get_this_name(), LogTypeTag::WARNING));
}
}
},
None => {
println!("{}", log_more_text_writer(String::from("Response EVENT handler failed, no registered EVENT."), get_this_name(), LogTypeTag::INFO, format!("IP:{}", client_ip)));
}
}
}
}
_Error => { return;
}
}
return;
}