nutt_web/modules/stream_reader/
mod.rs

1use 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}