extern crate multipart; | |
extern crate nickel; | |
use std::io::{self, Write}; | |
use nickel::{Action, HttpRouter, MiddlewareResult, Nickel, Request, Response}; | |
use nickel::status::StatusCode; | |
use multipart::server::nickel::MultipartBody; | |
use multipart::server::{Entries, SaveResult}; | |
use multipart::mock::StdoutTee; | |
fn handle_multipart<'mw>(req: &mut Request, mut res: Response<'mw>) -> MiddlewareResult<'mw> { | |
match (*req).multipart_body() { | |
Some(mut multipart) => { | |
match multipart.save().temp() { | |
SaveResult::Full(entries) => process_entries(res, entries), | |
SaveResult::Partial(entries, e) => { | |
println!("Partial errors ... {:?}", e); | |
return process_entries(res, entries.keep_partial()); | |
}, | |
SaveResult::Error(e) => { | |
println!("There are errors in multipart POSTing ... {:?}", e); | |
res.set(StatusCode::InternalServerError); | |
return res.send(format!("Server could not handle multipart POST! {:?}", e)); | |
}, | |
} | |
} | |
None => { | |
res.set(StatusCode::BadRequest); | |
return res.send("Request seems not was a multipart request") | |
} | |
} | |
} | |
/// Processes saved entries from multipart request. | |
/// Returns an OK response or an error. | |
fn process_entries<'mw>(res: Response<'mw>, entries: Entries) -> MiddlewareResult<'mw> { | |
let stdout = io::stdout(); | |
let mut res = res.start()?; | |
if let Err(e) = entries.write_debug(StdoutTee::new(&mut res, &stdout)) { | |
writeln!(res, "Error while reading entries: {}", e).expect("writeln"); | |
} | |
Ok(Action::Halt(res)) | |
} | |
fn main() { | |
let mut srv = Nickel::new(); | |
srv.post("/multipart_upload/", handle_multipart); | |
// Start this example via: | |
// | |
// `cargo run --example nickel --features nickel` | |
// | |
// And - if you are in the root of this repository - do an example | |
// upload via: | |
// | |
// `curl -F file=@LICENSE 'http://localhost:6868/multipart_upload/'` | |
srv.listen("127.0.0.1:6868").expect("Failed to bind server"); | |
} |