Skip to content

Instantly share code, notes, and snippets.

@vi
Created April 26, 2016 18:09
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save vi/f1071dacfc75c7f99d906aef07e2f129 to your computer and use it in GitHub Desktop.
Save vi/f1071dacfc75c7f99d906aef07e2f129 to your computer and use it in GitHub Desktop.
Simple SCGI service that saves all POSTed or PUT bodies.
// cargo-deps: time="0.1.34" scgi="0.3.3"
extern crate scgi;
extern crate time;
use std::io::Write;
use std::net::TcpListener;
use std::thread::spawn;
use std::io::Read;
use std::fs::File;
fn accept_scgi(port: u16) -> Result<(), scgi::ScgiError> {
let acceptor = try! (TcpListener::bind (("127.0.0.1", port)));
for stream in acceptor.incoming() {
match stream {
Err (err) => println! ("scgi] Accept error: {}", err),
Ok (tcp_stream) => {spawn (move || {
if let Err (error) = (move || -> Result<(), scgi::ScgiError> {
let (raw_headers, mut stream) = try! (scgi::read_headers (tcp_stream));
let headers_map = try! (scgi::str_map (&raw_headers));
//let uri = headers_map["REQUEST_URI"];
let len = headers_map["CONTENT_LENGTH"].parse().expect("expecting good content length");
let ua = headers_map["HTTP_USER_AGENT"];
let ::time::Timespec { sec: s, nsec: ns } = ::time::get_time();
let time = s as f64 + 0.001*0.001*0.001 * (ns as f64);
try!(try!(File::create(format!("{}.log", time))).write_all(format!("{:?}\n", headers_map).into_bytes().as_ref()));
let mut v = Vec::with_capacity(len);
unsafe { v.set_len(len); }
try!(stream.read_exact(&mut v));
try!(try!(File::create(format!("{}.data", time))).write_all(v.as_ref()));
println! ("{} {}", time, ua);
try! (stream.write (
b"Status: 204 No data\r\n\r\n"));
Ok(())
})() {println! ("scgi] Error: {}", error)}
});}
}
}
Ok(()) // NB: This line is never reached.
}
pub fn main() {
if ::std::env::args().count() != 2 || ::std::env::args().nth(1).unwrap().parse::<u16>().is_err() {
println!("Usage: scgi_uploader port_to_listen");
println!(" it will put all incoming bodies to current directory");
::std::process::exit(1);
} else {
if let Err (error) = accept_scgi(::std::env::args().nth(1).unwrap().parse().unwrap()) {
println! ("scgi] Outer error: {}", error)
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment