extern crate multipart; | |
extern crate iron; | |
extern crate env_logger; | |
use std::io::{self, Write}; | |
use multipart::mock::StdoutTee; | |
use multipart::server::{Multipart, Entries, SaveResult}; | |
use iron::prelude::*; | |
use iron::status; | |
fn main() { | |
env_logger::init(); | |
Iron::new(process_request).http("localhost:80").expect("Could not bind localhost:80"); | |
} | |
/// Processes a request and returns response or an occured error. | |
fn process_request(request: &mut Request) -> IronResult<Response> { | |
// Getting a multipart reader wrapper | |
match Multipart::from_request(request) { | |
Ok(mut multipart) => { | |
// Fetching all data and processing it. | |
// save().temp() reads the request fully, parsing all fields and saving all files | |
// in a new temporary directory under the OS temporary directory. | |
match multipart.save().temp() { | |
SaveResult::Full(entries) => process_entries(entries), | |
SaveResult::Partial(entries, reason) => { | |
process_entries(entries.keep_partial())?; | |
Ok(Response::with(( | |
status::BadRequest, | |
format!("error reading request: {}", reason.unwrap_err()) | |
))) | |
} | |
SaveResult::Error(error) => Ok(Response::with(( | |
status::BadRequest, | |
format!("error reading request: {}", error) | |
))), | |
} | |
} | |
Err(_) => { | |
Ok(Response::with((status::BadRequest, "The request is not multipart"))) | |
} | |
} | |
} | |
/// Processes saved entries from multipart request. | |
/// Returns an OK response or an error. | |
fn process_entries(entries: Entries) -> IronResult<Response> { | |
let mut data = Vec::new(); | |
{ | |
let stdout = io::stdout(); | |
let tee = StdoutTee::new(&mut data, &stdout); | |
entries.write_debug(tee).map_err(|e| { | |
IronError::new( | |
e, | |
(status::InternalServerError, "Error printing request fields") | |
) | |
})?; | |
} | |
let _ = writeln!(data, "Entries processed"); | |
Ok(Response::with((status::Ok, data))) | |
} |