8 releases

0.3.1 Oct 20, 2023
0.3.0 Jul 19, 2023
0.2.5 Jul 12, 2023
0.2.3 Mar 30, 2021
0.2.0 Jun 3, 2019

#281 in HTTP server

Download history 16/week @ 2024-02-19 55/week @ 2024-02-26 4/week @ 2024-03-04 2/week @ 2024-03-11 133/week @ 2024-04-01

136 downloads per month

Zlib license

66KB
1.5K SLoC

This crate is a thin CGI/FCGI wrapper for Rust programs. It is not a full web framework. You write a Rust program as if it were a CGI, using the provided stdin, stdout, and env replacements. This crate does the work of making it function both as a CGI or as an FCGI, with as much or as little parallelism as called for.

See the crate documentation for more information.

Unices are explicitly supported, but I have only tested it on Linux. Windows support is present but is entirely untested.

License

outer_cgi is distributed under the zlib license. The (very brief) text of the license can be found in LICENSE.md.


lib.rs:

This crate is a thin CGI/FCGI wrapper. It turns your program into an adaptive CGI script; capable of being invoked as CGI or FCGI in a variety of configurations.

This is not a full web framework. It performs minimal validation, and no parsing beyond the bare minimum required to pass one or more CGI-style requests to your handler. Examples of things that outer_cgi does not do:

  • Validate environment variables, beyond checking that GATEWAY_INTERFACE begins with "CGI/", when invoked as a CGI.
  • Parse query strings or cookies.
  • Provide a template engine.
  • Provide any database interfaces.

Here is what it does do:

  • Seamlessly supports operation as either CGI or FCGI.
  • FCGI may either be spawned in the "standard" way (where stdin is a listen socket) or by explicitly binding to either a TCP port or UNIX socket.
  • The UNIX version supports the following additional features:
    • setuid, setgid, and chroot for privilege reduction.
    • Logging to syslog, either out of necessity (from being spawned as FCGI by another process) or by user request.
    • Daemonization.

You write your code as a simple CGI script, using outer_cgi's replacements for stdin, stdout, and env. outer_cgi then allows the webmaster to deploy your script in whatever configuration is most suitable.

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)
}

See the Common Gateway Interface specification for more information.

According to the RFC, the current working directory SHOULD be the directory containing the script. It's up to the webmaster to ensure this is the case when running as an FCGI.

Dependencies

~2–10MB
~87K SLoC