4 个版本

0.7.1 2024年2月3日
0.7.0 2024年1月20日
0.6.2 2024年1月20日
0.6.1 2024年1月20日

#1225 in 网络编程

每月25次下载

AGPL-3.0

25KB
393

rust-cgi

Crate License

基于 http 类型,轻松在 Rust 中创建 CGI(通用网关接口)程序。

该仓库是从未维护的 https://github.com/amandasaurus/rust-cgi 分支出来的,该仓库作为 cgi crate 发布到 crates.io。

安装 & 使用

Cargo.toml:

[dependencies]
rust-cgi = "0.6"

使用 cgi_main! 宏,该宏接受一个 rust_cgi::Request 并返回一个 rust_cgi::Response 的函数。

extern crate rust_cgi as cgi;

cgi::cgi_main! { |request: cgi::Request| -> cgi::Response {
     cgi::text_response(200, "Hello World")
} }

如果您的函数返回一个 Result,则可以使用 cgi_try_main!

extern crate rust_cgi as cgi;

cgi::cgi_try_main! { |request: cgi::Request| -> Result<cgi::Response, String> {
    let greeting = std::fs::read_to_string("greeting.txt").map_err(|_| "Couldn't open file")?;

    Ok(cgi::text_response(200, greeting))
} }

它将解析和提取 CGI 环境变量和 HTTP 请求体以创建 Request<u8>,调用您的函数以创建响应,并将您的 Response 转换为正确的格式并打印到 stdout。如果此程序不是作为 CGI 调用(例如,缺少必需的环境变量),则将优雅地回退到使用合理的值(尽管这些值本身可能会更改)。

也可以在您的 main 函数中直接调用 rust_cgi::handle 函数。

extern crate rust_cgi as cgi;

fn main() { cgi::handle(|request: cgi::Request| -> cgi::Response {
    cgi::html_response(200, "<html><body><h1>Hello World!</h1></body></html>")
})}

响应快捷方式

几个快捷方式可以轻松创建

  • rust_cgi:empty_response(status_code) - 一个没有主体和该 HTTP 状态码的 HTTP 响应,例如 return rust_igi::empty_response(404); 返回一个 HTTP 404 Not Found

  • rust_cgi::html_response(status_code, text) - 将 text 转换为字节(UTF8),并以该 status_code 和 HTML Content-Type 头部发送作为正文。

  • rust_cgi::string_response(status_code, text) - 将 text 转换为字节(UTF8),并以该 status_code 发送作为正文,但不发送 Content-Type 头部。

  • rust_cgi::binary_response(status_code, content_type, blob) - 以该状态码和提供的内容类型头部发送 blob

重新导出

http 被重新导出(作为 rust_cgi::http)。

rust_cgi::Response/Requesthttp::Response<Vec<u8>>/Request<Vec<u8>>

本地运行

Python 提供了一个简单的 CGI 网络服务器,您可以使用它来运行您的脚本。二进制文件必须在 cgi-bin 目录中,因此您需要创建该目录并将您的二进制文件复制到其中。对于一个名为 example 的项目,在项目根目录中运行此命令(即 Cargo.toml 所在的位置)

mkdir cgi-bin
cargo build
cp target/debug/example cgi-bin/example
python3 -m http.server --cgi

然后打开 http://localhost:8000/cgi-bin/example

MSRV 政策

目前支持的最小 Rust 版本(MSRV)是 1.51.0。MSRV 的增加将保持在最低限度,并且将始终伴随着小版本号的增加。

另请参阅

为什么?

CGI 很旧,但易于部署。只需将二进制文件放置在正确的位置,Apache(或任何其他服务器)就会为您提供服务。Rust 很快,因此对于简单的事情,启动自定义 HTTP 服务器的缺点应该更少。

依赖关系

~625KB
~10K SLoC