Execute the whole request in a thread

This commit is contained in:
p11 2023-09-16 17:27:30 +02:00
parent 34b8307426
commit 64e0637349

View File

@ -28,7 +28,7 @@ fn main() {
return; return;
}; };
let mut context = Context::default(); let context: Arc<Mutex<Context>> = Arc::default();
let mut pool = ThreadPool::new(4); let mut pool = ThreadPool::new(4);
let mut args = env::args(); let mut args = env::args();
@ -52,7 +52,9 @@ fn main() {
} }
} }
handle_connection(&mut context, &path, stream, &pool); let context = context.clone();
let path = path.clone();
pool.execute(move || handle_connection(context, path, stream));
} }
} }
@ -133,7 +135,7 @@ struct Context {
infos: HashMap<Box<str>, Arc<Mutex<SiteInfo>>>, infos: HashMap<Box<str>, Arc<Mutex<SiteInfo>>>,
} }
fn handle_connection(context: &mut Context, path: &Path, mut stream: TcpStream, pool: &ThreadPool) { fn handle_connection(context: Arc<Mutex<Context>>, path: PathBuf, mut stream: TcpStream) {
let Some(request) = Request::from(&stream) else { let Some(request) = Request::from(&stream) else {
eprintln!("Invalid request!"); eprintln!("Invalid request!");
return; return;
@ -193,7 +195,7 @@ fn handle_connection(context: &mut Context, path: &Path, mut stream: TcpStream,
if relative_path.split('/').any(|name| name == "Images") { if relative_path.split('/').any(|name| name == "Images") {
let path = path.to_path_buf(); let path = path.to_path_buf();
pool.execute(move || reply_image(stream, &relative_path, path)); reply_image(stream, &relative_path, path);
return; return;
} }
@ -209,34 +211,37 @@ fn handle_connection(context: &mut Context, path: &Path, mut stream: TcpStream,
} }
} }
use Entry::*; let info = if let Ok(mut context) = context.lock() {
let info = match context.infos.entry(relative_path.clone().into_boxed_str()) { use Entry::*;
Occupied(o) => o.get().clone(), match context.infos.entry(relative_path.clone().into_boxed_str()) {
Vacant(v) => v Occupied(o) => o.get().clone(),
.insert(Arc::new(Mutex::new( Vacant(v) => v
File::open(&data_path) .insert(Arc::new(Mutex::new(
.map(|mut file| { File::open(&data_path)
from_stream::<PortableSettings, _, _>(&mut file).unwrap_or_default() .map(|mut file| {
}) from_stream::<PortableSettings, _, _>(&mut file).unwrap_or_default()
.unwrap_or_default(), })
))) .unwrap_or_default(),
.clone(), )))
.clone(),
}
} else {
return;
}; };
let path = path.to_path_buf(); let path = path.to_path_buf();
pool.execute(move || {
handle_relative_connection( handle_relative_connection(
info, info,
stream, stream,
&request.body, &request.body,
&relative_path, &relative_path,
&path, &path,
&pk_path, &pk_path,
pki_path.as_ref().map(|path| path.as_ref()), pki_path.as_ref().map(|path| path.as_ref()),
&data_path, &data_path,
start_level, start_level,
) )
});
} }
fn reply_image(mut stream: TcpStream, relative_path: &str, mut path: PathBuf) { fn reply_image(mut stream: TcpStream, relative_path: &str, mut path: PathBuf) {