8个版本

0.3.1 2023年10月20日
0.3.0 2023年7月19日
0.2.5 2023年7月12日
0.2.3 2021年3月30日
0.2.0 2019年6月3日

#278 in HTTP服务器

Zlib 许可证

66KB
1.5K SLoC

此crate是一个Rust程序的薄CGI/FCGI包装器。它不是一个完整的Web框架。您编写Rust程序就像它是CGI一样,使用提供的 stdinstdoutenv 替换。此crate执行使它既作为CGI也作为FCGI运行的工作,并行性多少由需求而定。

有关更多信息,请参阅 crate文档

明确支持Unix系统,但我在Linux上进行了测试。Windows支持存在,但完全未测试。

许可证

outer_cgi在zlib许可证下分发。许可证的(非常简短)文本可以在 LICENSE.md 中找到。


lib.rs:

此crate是一个薄CGI/FCGI包装器。它将您的程序转换为自适应CGI脚本;能够在各种配置中作为CGI或FCGI调用。

这不是一个完整的Web框架。它执行最小验证,并且不解析超出将一个或多个CGI风格请求传递给您的处理器的最低限度的必需内容。以下是一些 outer_cgi 不执行 的示例

  • 验证环境变量,除检查在作为CGI调用时 GATEWAY_INTERFACE"CGI/" 开头外。
  • 解析查询字符串或cookie。
  • 提供模板引擎。
  • 提供任何数据库接口。

以下是它 执行 的内容

  • 无缝支持作为CGI或FCGI的操作。
  • FCGI可以通过“标准”方式启动(其中stdin是监听套接字)或通过显式绑定到TCP端口或UNIX套接字。
  • UNIX版本支持以下附加功能
    • setuidsetgidchroot 以降低权限。
    • 记录到 syslog,无论是由于必要性(由其他进程作为FCGI启动)还是用户请求。
    • 进程化。

您将代码编写为简单的CGI脚本,使用outer_cgi替换stdinstdoutenv。然后outer_cgi允许网站管理员以最适合的配置部署您的脚本。

extern crate outer_cgi;
use std::collections::HashMap;
use outer_cgi::IO;

fn handler(io: &mut IO, env: HashMap<String, String>) -> anyhow::Result<i32> {
    io.write_all(format!(r#"Content-type: text/plain; charset=utf-8

Hello World! Your request method was "{}"!
"#, env.get("REQUEST_METHOD").unwrap()).as_bytes())?;
    Ok(0)
}

pub fn main() {
    outer_cgi::main(|_|{}, handler)
}

有关更多信息,请参阅通用网关接口规范。

根据RFC,当前工作目录应当是包含脚本的目录。当以FCGI方式运行时,确保这一点由网站管理员负责。

依赖项

~2–10MB
~83K SLoC