Put request data parsing into separate method

This commit is contained in:
p11 2025-05-31 13:57:13 +02:00
parent 70b29be14d
commit 8e6efef5bb

View File

@ -481,6 +481,62 @@ struct RequestData<'a> {
progress: &'a str, 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('&', "&amp;")
.replace('<', "&lt;")
.replace('>', "&gt;")
.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( fn handle_relative_connection(
info: Arc<SiteInfo>, info: Arc<SiteInfo>,
mut stream: TcpStream, mut stream: TcpStream,
@ -491,56 +547,6 @@ fn handle_relative_connection(
cookie: Option<&str>, cookie: Option<&str>,
censored: bool, 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('&', "&amp;")
.replace('<', "&lt;")
.replace('>', "&gt;")
.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 { let RequestData {
name, name,
text, text,
@ -548,7 +554,7 @@ fn handle_relative_connection(
down, down,
choice, choice,
progress, progress,
} = data; } = RequestData::parse(body);
let comments = { let comments = {
let Ok(mut comments) = info.comments.lock() else { let Ok(mut comments) = info.comments.lock() else {