1 extern crate multipart;
2 extern crate nickel;
3 
4 use std::io::{self, Write};
5 use nickel::{Action, HttpRouter, MiddlewareResult, Nickel, Request, Response};
6 use nickel::status::StatusCode;
7 
8 use multipart::server::nickel::MultipartBody;
9 use multipart::server::{Entries, SaveResult};
10 use multipart::mock::StdoutTee;
11 
handle_multipart<'mw>(req: &mut Request, mut res: Response<'mw>) -> MiddlewareResult<'mw>12 fn handle_multipart<'mw>(req: &mut Request, mut res: Response<'mw>) -> MiddlewareResult<'mw> {
13     match (*req).multipart_body() {
14         Some(mut multipart) => {
15             match multipart.save().temp() {
16                 SaveResult::Full(entries) => process_entries(res, entries),
17 
18                 SaveResult::Partial(entries, e) => {
19                     println!("Partial errors ... {:?}", e);
20                     return process_entries(res, entries.keep_partial());
21                 },
22 
23                 SaveResult::Error(e) => {
24                     println!("There are errors in multipart POSTing ... {:?}", e);
25                     res.set(StatusCode::InternalServerError);
26                     return res.send(format!("Server could not handle multipart POST! {:?}", e));
27                 },
28             }
29         }
30         None => {
31             res.set(StatusCode::BadRequest);
32             return res.send("Request seems not was a multipart request")
33         }
34     }
35 }
36 
37 /// Processes saved entries from multipart request.
38 /// Returns an OK response or an error.
process_entries<'mw>(res: Response<'mw>, entries: Entries) -> MiddlewareResult<'mw>39 fn process_entries<'mw>(res: Response<'mw>, entries: Entries) -> MiddlewareResult<'mw> {
40     let stdout = io::stdout();
41     let mut res = res.start()?;
42     if let Err(e) = entries.write_debug(StdoutTee::new(&mut res, &stdout)) {
43         writeln!(res, "Error while reading entries: {}", e).expect("writeln");
44     }
45 
46     Ok(Action::Halt(res))
47 }
48 
main()49 fn main() {
50     let mut srv = Nickel::new();
51 
52     srv.post("/multipart_upload/", handle_multipart);
53 
54     // Start this example via:
55     //
56     // `cargo run --example nickel --features nickel`
57     //
58     // And - if you are in the root of this repository - do an example
59     // upload via:
60     //
61     // `curl -F file=@LICENSE 'http://localhost:6868/multipart_upload/'`
62     srv.listen("127.0.0.1:6868").expect("Failed to bind server");
63 }
64