2个版本

0.1.0-alpha.12021年2月20日
0.1.0-alpha.02021年2月10日

#1379 in HTTP服务器

MIT许可证

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