diff --git a/src/main.rs b/src/main.rs index f2dc480..dfdb1fc 100644 --- a/src/main.rs +++ b/src/main.rs @@ -47,6 +47,8 @@ struct Comment { struct SiteInfo { comments: Vec, visits: usize, + up: usize, + down: usize, } #[derive(Default)] @@ -137,45 +139,63 @@ impl Context { Vacant(v) => v.insert(SiteInfo::default()), }; - let mut entries = request.body.split('&'); - if let (Some(name_entry), Some(text_entry), None) = - (entries.next(), entries.next(), entries.next()) - { - if let (Some(("name", input_name)), Some(("text", input_text))) = - (name_entry.split_once('='), text_entry.split_once('=')) - { - let name_value = input_name.replace('+', " "); - let decoded_name = percent_decode_str(&name_value).decode_utf8_lossy(); - eprintln!("Received comment by \"{decoded_name}\":"); - let name = decoded_name - .replace('&', "&") - .replace('<', "<") - .replace('>', ">") - .into(); + let mut name = None; + let mut text = None; - let text_value = input_text.replace('+', " "); - let decoded_text = percent_decode_str(&text_value).decode_utf8_lossy(); - for line in decoded_text.lines() { - eprintln!(" {line}"); + for entry in request.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}\":"); + name = Some( + decoded_name + .replace('&', "&") + .replace('<', "<") + .replace('>', ">") + .into(), + ); } - eprintln!(); - let mut text_buf = Vec::new(); - convert(decoded_text.lines(), &mut text_buf); - let text = std::str::from_utf8(text_buf.as_slice()) - .unwrap_or_default() - .into(); - - info.comments.push(Comment { name, text }); + "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); + text = Some( + std::str::from_utf8(text_buf.as_slice()) + .unwrap_or_default() + .into(), + ); + } + "up" => info.up += 1, + "down" => info.down += 1, + _ => (), } } + if let (Some(name), Some(text)) = (name, text) { + info.comments.push(Comment { name, text }); + } + info.visits += 1; let _ = write!(stream, "HTTP/1.1 200 OK\r\n\r\n"); let _ = writeln!(stream, ""); - let _ = writeln!(stream, "

👁️{}

", info.visits); + let _ = writeln!( + stream, + "

👁️{} 💖️{} 💔️{}

", + info.visits, info.up, info.down + ); let title = relative_path .rsplit_once('/') @@ -261,6 +281,10 @@ impl Context { br; input type="submit" value="Send!"; } + form method="POST" { + input type="submit" value="💖️" name="up"; + input type="submit" value="💔️" name="down"; + } }; let _ = stream.write_all(html.into_string().as_bytes());