2个版本
0.1.0-alpha.1 | 2021年2月20日 |
---|---|
0.1.0-alpha.0 | 2021年2月10日 |
#1379 in HTTP服务器
15KB
266 行
Marla - Rust的异步Web服务器框架
Marla是一个基于处理器和中间件的Rust Web服务器框架。
处理器可以根据静态路径映射、基于正则表达式的路径和完全自定义的路由函数进行调用。
中间件可以配置为默认运行所有请求,并可以针对特定路由进行覆盖。
示例
您可以在 examples/hello 中运行此示例,并浏览到 https://127.0.0.1:3000/hello/world,或使用 curl
curl -sS https://127.0.0.1:3000/hello/world -D-
Cargo.toml
:
[dependencies]
hyper = { version = "0.14", features = ["full"] }
macro_rules_attribute = "0.0"
marla = "0.1.0-alpha.1"
regex = "1.4"
tokio = { version = "1.0", features = ["full"] }
main.rs
:
use std::net::SocketAddr;
use hyper::{Body, Method, Response};
use macro_rules_attribute::macro_rules_attribute;
use marla::{Request, serve, async_handler};
use marla::config::{MarlaConfig, RegexPath, Route};
use regex::Regex;
#[tokio::main]
async fn main() {
let marla_config = MarlaConfig {
routers: vec![Box::new(vec![
RegexPath{ regex: Regex::new("^/hello/([a-zA-Z]{1,30})$").unwrap(), routes: vec![
(Method::GET, Route { handler: hello, middleware: None }),
].into_iter().collect()},
])],
middleware: vec![],
listen_addr: SocketAddr::from(([127, 0, 0, 1], 3000)),
};
serve(marla_config, ()).await;
}
#[macro_rules_attribute(async_handler!)]
pub async fn hello(
request: Request,
_body: Option<Body>,
_bundle: (),
) -> Response<Body> {
Response::new(Body::from(format!("Hello, {}\n", request.path_params[0])))
}
特性
- 三种将请求路由到处理器的方式
- 静态路径
- 正则表达式路径 - 捕获的模式传递给处理器
- 自定义路由函数 - 例如,检查数据库中的动态路径
- 当路径未找到时自动返回HTTP 404响应,当方法不受支持时返回HTTP 405响应
- 处理器或中间件中的panic(展开)将返回HTTP 500响应
- 路由后/处理器前中间件
- 您提供默认中间件列表,以供所有请求运行
- 覆盖默认中间件以针对单个路由
- 中间件可以发送自定义响应,防止调用处理器
- 应用程序定义的“捆绑”可以由中间件修改,并传递给所有请求。例如属性
- 数据库连接池
- 验证过的身份验证/授权详情
- 解析请求正文
- 处理器和中间件可以启动优雅的服务器关闭
未来增强
- 文档、示例、文档……文档
- 更多测试
- 可配置的日志记录
- 更多中间件类型
- 连接后/请求接收前
- 请求接收后/路由前
- 处理器后/响应发送前
- 使内置错误响应可定制
- 替换或重新导出http/hyper类型等
- 宏以简化处理器配置的阅读
依赖项
~7–16MB
~181K SLoC