1pub mod stream;
2pub mod config;
3mod encoding;
4pub mod request;
5pub mod response;
6pub mod websocket;
7use crate::stream::{Protocol, Scheme};
8use crate::config::{Config};
9use crate::request::{Method, Request, Upgrade};
10use crate::response::Response;
11use crate::websocket::{CloseCode, ErrorCode, Message, Websocket, USERS};
12use log::{error, info, warn};
13use openssl::ssl::{SslAcceptor, SslFiletype, SslMethod};
14use std::io::{Error};
15use std::net::{IpAddr, SocketAddr, TcpListener};
16use std::sync::{Arc, Mutex};
17use std::time::{Duration};
18use std::{io, thread};
19use std::fmt::Debug;
20
21#[derive(Clone, Debug)]
23pub struct WebServer;
24
25impl WebServer {
26 pub fn new_service(config: &Config, factory: fn(out: Websocket) -> Box<dyn Handler>) {
28 loop {
29 match WebServer::service(&config.clone(), factory) {
30 Ok(()) => {}
31 Err(e) => error!("服务器错误: {}[{}]: {}", file!(), line!(), e),
32 }
33 warn!("服务器 1秒后重启");
34 thread::sleep(Duration::from_secs(1));
35 }
36 }
37 fn service(config: &Config, factory: fn(out: Websocket) -> Box<dyn Handler>) -> io::Result<()> {
38 info!("==================== 网络服务 服务信息 ====================");
39 info!("日志记录: {}",if config.log {"开启"} else {"关闭"});
40 info!("调试模式: {}",if config.debug { "开启" } else { "关闭" });
41 info!("地 址: {}", config.host);
42 info!("端 口 号: {}", config.port);
43 info!("服务地址: {}://{}{}",if config.https { "https" } else { "http" },config.host,if config.port > 0 {format!(":{}", config.port)} else {String::new()});
44 info!("根 目 录: {}", config.root_path.to_str().unwrap());
45 info!("访问目录: {}", config.public);
46 info!("运行目录: {}", config.runtime);
47 info!("SSL/TLS: {}",if config.https { "开启" } else { "关闭" });
48
49 if config.https {
50 info!("证书目录KEY: {:?}", config.tls.key);
51 info!("证书目录PEM: {:?}", config.tls.certs);
52 }
53
54 let addrs = [SocketAddr::from((
55 IpAddr::V4(config.host.parse().unwrap()),
56 config.port,
57 ))];
58 let listener = TcpListener::bind(&addrs[..])?;
59 info!("==================== 网络服务 启动成功 ====================");
60
61 let acceptor = Self::ssl(&config.clone())?;
62 for stream in listener.incoming() {
63 match stream {
64 Ok(stream) => {
65 let config_new = config.clone();
66 let acceptor_new = acceptor.clone();
67
68 thread::spawn(move || -> io::Result<()> {
69 if config_new.write_timeout > 0 {
71 stream.set_write_timeout(Some(Duration::from_secs(config_new.write_timeout))).unwrap_or_default();
72 }
73 if config_new.read_timeout > 0 {
74 stream.set_read_timeout(Some(Duration::from_secs(config_new.read_timeout))).unwrap_or_default();
75 }
76
77 let mut scheme = if config_new.https {
78 match acceptor_new.accept(stream.try_clone().unwrap()) {
79 Ok(e) => Scheme::Https(Arc::new(Mutex::new(e))),
80 Err(_) => return Err(Error::other("加载加密请求失败")),
81 }
82 } else {
83 Scheme::Http(Arc::new(Mutex::new(stream.try_clone().unwrap())))
84 };
85
86 let mut request = Request::default(config_new.clone(), Arc::new(Mutex::new(scheme.clone())));
87 let mut response = Response::default(config_new.clone(), Arc::new(Mutex::new(scheme.clone())));
88 request.handle()?;
89
90 match request.protocol {
91 Protocol::HTTP1_0 | Protocol::HTTP1_1 => {
92 response.set_request(&mut request);
93
94 match request.upgrade {
95 Upgrade::Websocket => {
96 let mut websocket = Websocket::new(request.clone(), response.clone());
97 if let Ok(()) = websocket.handle(factory) {}
98 if USERS.get(&websocket.key.to_string()).is_some() {
99 USERS.remove(&websocket.key);
100 }
101 if response.config.debug {
102 let len = USERS.len();
103 info!("退出: {len}");
104 }
105 }
106 Upgrade::Http => {
107 match request.method {
108 Method::OPTIONS => {
109 let websocket = Websocket::new(request.clone(), response.clone());
110 factory(websocket).on_options(&mut response);
111 response.send()?;
112 }
113 _ => {
114 if let Ok(e) = request.read_resource() { response.status(200).file(&e).send()? } else {
115 let websocket = Websocket::new(request.clone(), response.clone());
116 let mut factory_new = factory(websocket);
117 factory_new.on_request(request.clone(), &mut response);
118 factory_new.on_response(request.clone(), &mut response);
119 response.send()?;
120 }
121 }
122 }
123 }
124 Upgrade::None => {
125 response.status(404).send()?;
126 }
127 }
128 }
129 Protocol::HTTP2 => {
130 let mut bytes = vec![];
131
132 let websocket = Websocket::new(request.clone(), response.clone());
133 scheme.http2_handle(&mut bytes, &mut request, &mut response)?;
134 let mut factory_new = factory(websocket);
135 factory_new.on_request(request.clone(), &mut response);
136 factory_new.on_response(request.clone(), &mut response);
137 scheme.send_http2(&mut response)?;
138 }
147 Protocol::None => {
148 return Err(Error::other("未知请求"));
149 }
150 }
151
152 match request.save_log() {
154 Ok(()) => {}
155 Err(_) => {
156 error!("日志记录错误");
157 }
158 }
159 Ok(())
160 });
161 }
162 Err(e) => return Err(e),
163 }
164 }
165 Ok(())
166 }
167
168 fn ssl(config: &Config) -> io::Result<Arc<SslAcceptor>> {
169 if config.https {
170 let mut acceptor = SslAcceptor::mozilla_intermediate(SslMethod::tls())?;
171 if !config.tls.key.is_file() {
172 return Err(Error::other(
173 format!("private.key 不存在: {:?}", config.tls.key).as_str(),
174 ));
175 }
176 if !config.tls.certs.is_file() {
177 return Err(Error::other(
178 format!("certificate.pem 不存在: {:?}", config.tls.certs).as_str(),
179 ));
180 }
181 acceptor.set_private_key_file(config.tls.key.clone(), SslFiletype::PEM)?;
182 acceptor.set_certificate_file(config.tls.certs.clone(), SslFiletype::PEM)?;
183 Ok(Arc::new(acceptor.build()))
184 } else {
185 Ok(Arc::new(SslAcceptor::mozilla_intermediate(SslMethod::tls())?.build()))
186 }
187 }
188}
189
190pub trait HandlerClone {
191 fn clone_box(&self) -> Box<dyn Handler>;
192}
193
194impl<T> HandlerClone for T
196where
197 T: 'static + Handler + Clone,
198{
199 fn clone_box(&self) -> Box<dyn Handler> {
200 Box::new(self.clone())
201 }
202}
203
204impl Clone for Box<dyn Handler> {
206 fn clone(&self) -> Box<dyn Handler> {
207 self.clone_box()
208 }
209}
210pub trait Handler: Send + Sync + HandlerClone + Debug {
211 fn on_request(&mut self, _request: Request, _response: &mut Response) {}
213 fn on_options(&mut self, response: &mut Response) {
215 if !response.headers.has_key("Access-Control-Allow-Origin") {
216 response.header("Access-Control-Allow-Origin", "*");
217 }
218 if !response.headers.has_key("Access-Control-Allow-Methods") {
220 response.header("Access-Control-Allow-Methods", "*");
221 }
222 if response.headers.has_key("Access-Control-Allow-Headers") {
224 let headers = response.headers["Access-Control-Allow-Headers"].to_string();
225 response.header("Access-Control-Allow-Headers", format!("Content-Type,Authorization,X-Real-IP,X-Forwarded-For,{headers}").as_str());
226 } else {
227 response.header("Access-Control-Allow-Headers", "Content-Type,Authorization,X-Real-IP,X-Forwarded-For");
228 }
229 if !response.headers.has_key("Access-Control-Expose-Headers") {
231 response.header("Access-Control-Expose-Headers", "true");
232 }
233 if !response.headers.has_key("Access-Control-Expose-Headers") {
235 response.header("Access-Control-Expose-Headers", "Content-Disposition");
236 }
237 if !response.headers.has_key("Access-Control-Max-Age") {
238 response.header("Access-Control-Max-Age", "0");
239 }
240 }
241 fn on_response(&mut self, request: Request, response: &mut Response) {
243 if response.config.origin.is_empty() {
244 response.header("Access-Control-Allow-Origin", "*");
245 } else {
246 let origin = request.header["origin"].as_str().unwrap_or("");
247 for item in response.config.origin.clone() {
248 if origin.contains(item.as_str()) {
249 response.header("Access-Control-Allow-Origin", origin);
250 }
251 }
252 }
253 if response.headers.has_key("Content-Disposition") {
254 response.header("Access-Control-Expose-Headers", "Content-Disposition");
255 }
256 }
257
258 fn on_frame(&mut self) -> io::Result<()> {
259 Ok(())
260 }
261 fn on_open(&mut self) -> io::Result<()> {
263 Ok(())
264 }
265 fn on_message(&mut self, _msg: Message) -> io::Result<()> {
267 Ok(())
268 }
269 fn on_close(&mut self, _code: CloseCode, _reason: &str) {}
271 fn on_error(&mut self, _err: ErrorCode) {}
273 fn on_shutdown(&mut self) {}
275}
276