bim_core/servers/
http.rs

1use std::net::ToSocketAddrs;
2use std::sync::Arc;
3use std::thread;
4
5#[cfg(debug_assertions)]
6use log::debug;
7
8use tiny_http::Method;
9
10use crate::servers::Server;
11
12pub struct HTTPServer {
13    address: String,
14}
15
16impl HTTPServer {
17    pub fn build(address: String) -> Option<Self> {
18        let _ = match address.to_socket_addrs() {
19            Ok(_) => {}
20            Err(_) => return None,
21        };
22
23        return Some(Self { address });
24    }
25}
26
27impl Server for HTTPServer {
28    fn run(&mut self) -> bool {
29        let server = match tiny_http::Server::http(&self.address) {
30            Ok(s) => Arc::new(s),
31            Err(_e) => {
32                #[cfg(debug_assertions)]
33                debug!("Start Failed {_e}");
34
35                return false;
36            }
37        };
38
39        let data = Arc::new(
40            "0123456789AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz-="
41                .repeat(1024)
42                .into_bytes(),
43        );
44
45        let mut guards = Vec::with_capacity(8);
46
47        for _ in 0..8 {
48            let server = server.clone();
49            let data = data.clone();
50
51            let guard = thread::spawn(move || loop {
52                let request = server.recv().unwrap();
53                let method = request.method().clone();
54                let mut writer = request.into_writer();
55                let data = data.as_ref();
56
57                match method {
58                    Method::Get => {
59                        let mut counter = 0;
60                        let head = "HTTP/1.1 200\r\n\r\n".as_bytes();
61                        let _ = writer.write_all(head);
62
63                        while counter < 50 * 1024 * 1024 {
64                            let _ = writer.write_all(data);
65                            counter += 65536;
66                        }
67                    }
68                    Method::Post => {
69                        let head = "HTTP/1.1 200\r\n\r\n".as_bytes();
70                        let _ = writer.write_all(head);
71                    }
72                    _ => {
73                        let head = "HTTP/1.1 500\r\n\r\n".as_bytes();
74                        let _ = writer.write_all(head);
75                    }
76                }
77            });
78
79            guards.push(guard);
80        }
81
82        for p in guards {
83            let _ = p.join();
84        }
85        true
86    }
87}