proxy_server/http/
request.rs1use 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#[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}