From 8e6efef5bbbc56d0d43c6f08041e2c9ca1ba31c4 Mon Sep 17 00:00:00 2001 From: p11 Date: Sat, 31 May 2025 13:57:13 +0200 Subject: [PATCH] Put request data parsing into separate method --- src/main.rs | 108 +++++++++++++++++++++++++++------------------------- 1 file changed, 57 insertions(+), 51 deletions(-) diff --git a/src/main.rs b/src/main.rs index 31c1969..ddb43a6 100644 --- a/src/main.rs +++ b/src/main.rs @@ -481,6 +481,62 @@ struct RequestData<'a> { progress: &'a str, } +impl<'a> RequestData<'a> { + fn parse(body: &'a str) -> Self { + let mut data = RequestData { + name: None, + text: None, + up: false, + down: false, + choice: 0, + progress: "", + }; + + for entry in body.split('&') { + let Some((key, input)) = entry.split_once('=') else { + continue; + }; + + match key { + "name" => { + let name_value = input.replace('+', " "); + let decoded_name = percent_decode_str(&name_value).decode_utf8_lossy(); + eprintln!("Received comment by \"{decoded_name}\":"); + data.name = Some( + decoded_name + .replace('&', "&") + .replace('<', "<") + .replace('>', ">") + .into(), + ); + } + "text" => { + let text_value = input.replace('+', " "); + let decoded_text = percent_decode_str(&text_value).decode_utf8_lossy(); + for line in decoded_text.lines() { + eprintln!(" {line}"); + } + eprintln!(); + let mut text_buf = Vec::new(); + convert(decoded_text.lines(), &mut text_buf); + data.text = Some( + std::str::from_utf8(text_buf.as_slice()) + .unwrap_or_default() + .into(), + ); + } + "up" => data.up = true, + "down" => data.down = true, + "choice" => data.choice = input.parse().unwrap_or_default(), + "progress" => data.progress = input, + _ => (), + } + } + + data + } +} + fn handle_relative_connection( info: Arc, mut stream: TcpStream, @@ -491,56 +547,6 @@ fn handle_relative_connection( cookie: Option<&str>, censored: bool, ) { - let mut data = RequestData { - name: None, - text: None, - up: false, - down: false, - choice: 0, - progress: "", - }; - - for entry in body.split('&') { - let Some((key, input)) = entry.split_once('=') else { - continue; - }; - - match key { - "name" => { - let name_value = input.replace('+', " "); - let decoded_name = percent_decode_str(&name_value).decode_utf8_lossy(); - eprintln!("Received comment by \"{decoded_name}\":"); - data.name = Some( - decoded_name - .replace('&', "&") - .replace('<', "<") - .replace('>', ">") - .into(), - ); - } - "text" => { - let text_value = input.replace('+', " "); - let decoded_text = percent_decode_str(&text_value).decode_utf8_lossy(); - for line in decoded_text.lines() { - eprintln!(" {line}"); - } - eprintln!(); - let mut text_buf = Vec::new(); - convert(decoded_text.lines(), &mut text_buf); - data.text = Some( - std::str::from_utf8(text_buf.as_slice()) - .unwrap_or_default() - .into(), - ); - } - "up" => data.up = true, - "down" => data.down = true, - "choice" => data.choice = input.parse().unwrap_or_default(), - "progress" => data.progress = input, - _ => (), - } - } - let RequestData { name, text, @@ -548,7 +554,7 @@ fn handle_relative_connection( down, choice, progress, - } = data; + } = RequestData::parse(body); let comments = { let Ok(mut comments) = info.comments.lock() else {