当问chat-gpt:
写一个rust web框架,实现了正则路由的
它给出了以下的代码,是不是能运行,可以自己试一下。
把代码帖出来
main.rs
#[macro_use]
extern crate lazy_static;
extern crate regex;
use regex::Regex;
use std::collections::HashMap;
use std::convert::From;
use std::io::{Error, ErrorKind};
use std::net::{Ipv4Addr, SocketAddrV4};
use std::sync::{Arc, Mutex};
use std::thread;
use std::time::Duration;
// 定义简单的Request和Response结构体
#[derive(Debug)]
struct Request {
method: String,
path: String,
}
impl From<&str> for Request {
fn from(s: &str) -> Self {
let parts: Vec<&str> = s.split_whitespace().collect();
Request {
method: parts[0].to_string(),
path: parts[1].to_string(),
}
}
}
#[derive(Debug)]
struct Response {
status: u16,
headers: HashMap<String, String>,
body: String,
}
impl Response {
fn new() -> Self {
Response {
status: 200,
headers: HashMap::new(),
body: String::new(),
}
}
fn set_status(&mut self, status: u16) {
self.status = status;
}
fn set_header(&mut self, key: &str, value: &str) {
self.headers.insert(key.to_string(), value.to_string());
}
fn set_body(&mut self, body: &str) {
self.body = body.to_string();
}
fn to_string(&self) -> String {
let mut s = format!("HTTP/1.1 {}\r\n", self.status);
for (key, value) in &self.headers {
s += &format!("{}: {}\r\n", key, value);
}
s += "\r\n";
s += &self.body;
s
}
}
// 定义路由结构体
struct Router<'a> {
routes: Vec<Route<'a>>,
}
impl<'a> Router<'a> {
fn new() -> Self {
Router { routes: vec![] }
}
fn add_route(&mut self, method: &str, path: &str, handler: Handler<'a>) {
self.routes.push(Route {
method: method.to_string(),
path_regex: Regex::new(path).unwrap(),
handler: handler,
});
}
fn handle_request(&self, request: &Request) -> Result<Response, Error> {
for route in &self.routes {
if route.method == request.method {
if let Some(captures) = route.path_regex.captures(&request.path) {
let mut params = HashMap::new();
for (i, name) in route.path_regex.capture_names().enumerate() {
if let Some(name) = name {
params.insert(name.to_string(), captures[i].to_string());
}
}
return (route.handler)(request, ¶ms);
}
}
}
Err(Error::new(ErrorKind::NotFound, "Not Found"))
}
}
type Handler<'a> = Box<dyn Fn(&Request, &HashMap<String, String>) -> Result<Response, Error> + 'a>;
struct Route<'a> {
method: String,
path_regex: Regex,
handler: Handler<'a>,
}
fn main() {
let router = Arc::new(Mutex::new(Router::new()));
// 添加路由规则
let mut router_lock = router.lock().unwrap();
router_lock.add_route(
"GET",
r"^/$",
Box::new(|_, _| {
let mut response = Response::new();
response.set_header("Content-Type", "text/plain");
response.set_body("Hello, Rust Web Framework!");
Ok(response)
}),
);
router_lock.add_route(
"GET",
r"^/users/(?P<user_id>\d+)$",
Box::new(|_, params| {
let mut response = Response::new();
response.set_header("Content-Type", "text/plain");
response.set_body(&format!("User ID: {}", params.get("user_id").unwrap()));
Ok(response)
}),
);
drop(router_lock);
let server_addr = SocketAddrV4::new(Ipv4Addr::new(127, 0, 0, 1), 8080);
let listener = std::net::TcpListener::bind(server_addr).unwrap();
for stream in listener.incoming() {
let router = router.clone();
thread::spawn(move || {
let mut stream = stream.unwrap();
let mut buf = [0; 1024];
stream.read(&mut buf).unwrap();
let request = Request::from(std::str::from_utf8(&buf).unwrap());
let response = router.lock().unwrap().handle_request(&request).unwrap_or_else(|err| {
let mut response = Response::new();
response.set_status(404);
response.set_body(&err.to_string());
response
});
thread::sleep(Duration::from_secs(1));
stream.write(response.to_string().as_bytes()).unwrap();
stream.flush().unwrap();
});
}
}