Created
April 26, 2016 18:09
-
-
Save vi/f1071dacfc75c7f99d906aef07e2f129 to your computer and use it in GitHub Desktop.
Simple SCGI service that saves all POSTed or PUT bodies.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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