nutt_web/modules/stream_reader/
mod.rs1use std::ops::DerefMut;
2use tokio::io::{AsyncBufReadExt, AsyncReadExt, BufReader};
3use tokio::net::TcpStream;
4
5pub struct StreamReader<'a> {
6 stream: &'a mut TcpStream,
7}
8
9impl<'a> StreamReader<'a> {
10 pub fn new(stream: &'a mut TcpStream) -> StreamReader {
11 Self { stream }
12 }
13 pub async fn read_req(&mut self) -> String {
14 let mut buf_reader = BufReader::new(self.stream.deref_mut());
15 let mut content_length = 0;
16 let mut req = String::new();
17 while let Ok(bytes) = buf_reader.read_line(&mut req).await {
18 if bytes == 0 {
19 break;
20 }
21 if req.ends_with("\r\n\r\n") {
22 break;
23 }
24 if let Some(line) = req.find("Content-Length: ") {
25 let len_str = &req[line + 15..];
26 if let Some(end) = len_str.find("\r\n") {
27 content_length = len_str[..end].trim().parse::<usize>().unwrap();
28 }
29 } else if let Some(line) = req.find("content-length: ") {
30 let len_str = &req[line + 15..];
31 if let Some(end) = len_str.find("\r\n") {
32 content_length = len_str[..end].trim().parse::<usize>().unwrap();
33 }
34 }
35 }
36 if content_length > 0 {
37 let mut body = vec![0; content_length];
38 buf_reader.read_exact(&mut body).await.unwrap();
39 req.push_str(String::from_utf8_lossy(&body).as_ref());
40 }
41
42 req
43 }
44}