// Copyright (c) 2016 The Rouille developers | |
// Licensed under the Apache License, Version 2.0 | |
// <LICENSE-APACHE or | |
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT | |
// license <LICENSE-MIT or http://opensource.org/licenses/MIT>, | |
// at your option. All files in the project carrying such | |
// notice may not be copied, modified, or distributed except | |
// according to those terms. | |
extern crate rouille; | |
use std::io; | |
use std::env; | |
use std::process::Command; | |
use rouille::cgi::CgiRun; | |
fn main() { | |
// This example demonstrates how to serve a git repository with rouille. | |
// After starting this example, you should be able to run `git clone http://localhost:8000/` | |
// in order to clone the repository of the current working directory. | |
println!("Now listening on localhost:8000"); | |
rouille::start_server("localhost:8000", move |request| { | |
rouille::log(&request, io::stdout(), || { | |
// When a request is received, we invoke the `git http-backend` command through CGI. | |
let mut cmd = Command::new("git"); | |
cmd.arg("http-backend"); | |
// We need to set some git-specific environment variables. | |
cmd.env("GIT_PROJECT_ROOT", env::current_dir().unwrap().to_str().unwrap()); | |
cmd.env("GIT_HTTP_EXPORT_ALL", ""); // This one is required to avoid security errors. | |
// Our `cmd` is now ready. We can run it with the `start_cgi` method of the `CgiRun` | |
// trait. | |
// The `start_cgi` will add other CGI-specific environment variables, then feed stdin | |
// and analyze stdout to build a rouille response. | |
// | |
// Note that an error is returned only if `git http-backend` fails to execute, and not | |
// if the client sends bad data for example. In other words, an error can only occur | |
// if the server was misconfigured. Therefore it's okay-ish to call `unwrap()` here. | |
cmd.start_cgi(&request).unwrap() | |
}) | |
}); | |
} |