Cargo.toml
:
[dependencies] cgi2 = "0.7"
Use the cgi::main
macro on your main
function, taking in a Request
and returning a Response
.
#[cgi::main] fn main(request: cgi::Request) -> cgi::Response { cgi::text_response(200, "Hello World") }
If your function returns a Result
, you can use cgi_try_main!
:
This also works if you return a Result
.
If your function returns a Result
the error is printed to stderr
and an HTTP 500 error is returned.
#[cgi::main] fn 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)) }
It will parse & extract the CGI environmental variables, and the HTTP request body to create
Request
, call your function to create a response, and convert your Response
into the
correct format and print to stdout. If this programme is not called as CGI (e.g. missing
required environmental variables), it will panic.
It is also possible to call the cgi::handle
function directly inside your main
function:
fn main() { cgi::handle(|request: cgi::Request| -> cgi::Response { cgi::html_response(200, "<html><body><h1>Hello World!</h1></body></html>") }) }
Several shortcuts create shortcuts easily:
cgi:empty_response(status_code)
-
A HTTP Reponse with no body and that HTTP status code, e.g.
return cgi::empty_response(404);
to return a HTTP 404 Not Found. cgi::html_response(status_code, text)
-
Converts
text
to bytes (UTF8) and sends that as the body with thatstatus_code
and HTMLContent-Type
header. cgi::string_response(status_code, text)
-
Converts
text
to bytes (UTF8), and sends that as the body with thatstatus_code
, e.g. `return cgi::string_response(200, "Hello World!")
-
returns a simple plain text response.
cgi::binary_response(status_code, blob)
-
Sends
blob
with that status code.
http
is re-exported, (as cgi::http
).
cgi::Response
/Request
are http::Response<Vec<u8>>
/Request<Vec<u8>>
.
Python provides a simple CGI webserver you can use to run your scripts. The
binaries must be in a cgi-bin
directory, so you’ll need to create that
directory and copy your binary into it. Given a project named example
, run
this in your project root directory (i.e. where Cargo.toml
is):
mkdir cgi-bin cargo build --example hello_world cp target/debug/examples/hello_world cgi-bin/hello_world python3 -m http.server --cgi
and then open http://localhost:8000/cgi-bin/hello_world.
CGI is old, and easy to deploy. Just drop a binary in the right place, and Apache (or whatever) will serve it up. Rust is fast, so for simple things, there should be less downsides to spinning up a custom HTTP server.
Copyright GNU Affero GPL v3 (or later). See the file LICENCE