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}