proxy_server/http/
request.rs

1///! Module [`Request`]
2use crate::http::headers::Headers;
3#[cfg(feature = "napi")]
4use napi_derive::napi;
5use regex::Regex;
6use serde::{Deserialize, Serialize};
7use std::{io::Result, str};
8
9/// HTTP request
10#[cfg_attr(feature = "napi", napi(object))]
11#[derive(Debug, Serialize, Clone, Deserialize)]
12#[serde(rename_all = "camelCase")]
13pub struct Request {
14    pub url: String,
15    pub host: String,
16    pub peer_addr: String,
17    pub protocol: String,
18    pub method: String,
19    pub content_length: u32,
20    pub ttl: u32,
21    pub headers: Headers,
22    pub body: String,
23    pub query: String,
24    pub error: String,
25    pub chunked: bool,
26}
27
28pub struct Socket {
29    pub host: String,
30    pub peer_addr: String,
31    pub ttl: u32,
32    pub error: String,
33}
34
35impl Request {
36    pub fn new(socket: Socket, buffer: Vec<u8>) -> Result<Self> {
37        let headers = Headers::from_bytes(&buffer)?;
38        Ok(Request::create(socket, headers))
39    }
40
41    pub fn create(
42        Socket {
43            host,
44            peer_addr,
45            ttl,
46            error,
47        }: Socket,
48        headers: Headers,
49    ) -> Self {
50        let mut content_length: u32 = 0;
51        let content_length_op = Headers::get_content_length(&headers.raw);
52        if let Some(val) = content_length_op {
53            content_length = val;
54        }
55        Request {
56            host,
57            peer_addr,
58            url: Headers::get_url(&headers.raw),
59            protocol: Headers::get_protocol(&headers.raw),
60            method: Headers::get_method(&headers.raw),
61            content_length,
62            ttl,
63            body: "".to_string(),
64            query: Headers::get_query(&headers.raw),
65            error,
66            chunked: Headers::get_chunked(&headers.raw),
67            headers,
68        }
69    }
70
71    pub fn change_host(&mut self, target: &str) -> Result<()> {
72        let heads = self.headers.set_header("host", target)?;
73
74        self.headers = heads;
75        self.host = target.to_string();
76
77        Ok(())
78    }
79
80    pub fn set_body(&mut self, body: String) {
81        self.body = body;
82    }
83}
84
85#[allow(dead_code)]
86fn get_status(raw: &String) -> u16 {
87    let reg = Regex::new(r"\d{3}").unwrap();
88    let capts = reg.captures(raw.as_str());
89    let mut status: u16 = 500;
90    if let None = capts {
91        return status;
92    }
93    let capts = capts.unwrap();
94    let status_r = capts.get(0).unwrap().as_str().parse::<u16>();
95    if let Ok(val) = status_r {
96        status = val;
97    }
98    status
99}
100
101#[allow(dead_code)]
102fn get_status_text(raw: &String) -> String {
103    let reg = Regex::new(r"\d{3}[ \w\-]+").unwrap();
104    let capts = reg.captures(raw.as_str());
105    let mut status_text: String = "Internal Server Error".to_string();
106    if let None = capts {
107        return status_text;
108    }
109    let capts = capts.unwrap();
110    status_text = capts.get(0).unwrap().as_str().to_string();
111    status_text = Regex::new(r"^\d{3}\s+")
112        .unwrap()
113        .replace_all(&status_text, "")
114        .to_string();
115    status_text = Regex::new(r"^\s+")
116        .unwrap()
117        .replace_all(&status_text, "")
118        .to_string();
119    Regex::new(r"\s+$")
120        .unwrap()
121        .replace_all(&status_text, "")
122        .to_string()
123}