#web-server #server #async-http #http #async #light-weight

servt

一个小巧、轻量级且快速的可选异步 HTTP 服务器库,用于 Rust

2 个不稳定版本

0.2.0 2024 年 2 月 15 日
0.1.0 2024 年 2 月 14 日

849HTTP 服务器

每月 48 次下载

MIT 许可证

23KB
417

servt

一个程序化 Web 服务器,依赖项非常少。

为什么

  • 许多大型框架对于小型项目来说过于笨重,或者不适合你的(或我的!)开发风格
  • 因此,这是一个小巧、易于使用,但仍然强大的库

特性

异步

  • 默认启用,将 smol 作为依赖项(增加约 35 个依赖项)
  • 通过创建新任务来执行所有请求
  • 如果未启用,则回退到 std::thread(为每个请求创建新线程)

时间

  • 默认启用,将 chrono 作为依赖项(增加约 2 个依赖项,因为启用的特性非常少,即 allocnow
  • 为所有响应添加一个 Date 标头
  • 这在技术上符合 HTTP/1.1 规范,但大多数客户端不需要它也能工作

lib.rs:

一个简单、易于使用且快速的 Rust Web 服务器库。

设计得既简单又快速,尽管功能足够强大,可以处理大多数用例。

特性

  • 简单且易于使用
  • 多线程(或异步,如果您启用异步功能
  • 重定向
  • 自定义错误页面
  • 自定义路由(带有查询字符串和表单解析)
  • 100-continue 支持
  • 自定义状态码

一些注意事项

  • 服务器默认使用多线程,但您可以通过启用异步功能来使用异步。
  • 日期标头默认包含,但您可以禁用时间功能以排除它(并节省一些依赖项)。如果您不启用它,请记住,这与 HTTP/1.1 规范相冲突,但大多数客户端并不关心,因此将其作为选项包含,以便在配置为这种方式时将库保持尽可能轻量。
  • 目前,服务器不支持持久连接,但计划在将来实现(以及可能的 HTTP/2 支持)。
  • 故意不支持 Last-Modified、If-Modified-Since 等,因为它不是设计用来服务静态文件的,而是用来服务不能以相同方式跟踪的功能。

确保您的回调不会 panic

  • 如果回调函数发生panic,互斥锁会被毒化,因此服务器在后续对路由的任何请求都会返回500内部服务器错误。因此,请确保您的回调函数不要panic(或处理任何错误并返回500错误)。

支持的路由格式

  • /path

  • /path/

  • /path?query=string

  • /path/?query=string

  • site.com/path

  • site.com/path/

  • site.com/path?query=string

  • site.com/path/?query=string

  • 请注意,HTTP/1.1规范要求使用Host头,但如果以HTTP 1.0发送请求,服务器将不会强制执行它(否则会返回400错误)。

示例

基本的 'Hello, World!' 服务器

use servt::{Server, ParsedRequest};

let mut server = Server::new(8080, "localhost".to_string());
server.route("/", |req| ("Hello, World!".to_string(), 200));

server.run();

示例良好的表单处理实践

use servt::{Server, ParsedRequest};

let mut server = Server::new(8080, "localhost".to_string());
server.route("/", |req| match req.form {
   Some(form) => (format!("Hello, {}!", form.get("name").unwrap_or(&"World".to_string())), 200),
   None => ("Hello, World!".to_string(), 200),
});

server.run();

自定义错误页面

use servt::{Server, ParsedRequest};

let mut server = Server::new(8080, "localhost".to_string());
server.error(404, |_| ("Custom 404 page".to_string(), 404));

server.run();

依赖关系

~0.1–8.5MB
~78K SLoC