| extern crate hyper; | |
| extern crate multipart; | |
| use std::io; | |
| use hyper::server::{Handler, Server, Request, Response}; | |
| use hyper::status::StatusCode; | |
| use hyper::server::response::Response as HyperResponse; | |
| use multipart::server::hyper::{Switch, MultipartHandler, HyperRequest}; | |
| use multipart::server::{Multipart, Entries, SaveResult}; | |
| use multipart::mock::StdoutTee; | |
| struct NonMultipart; | |
| impl Handler for NonMultipart { | |
| fn handle(&self, _: Request, mut res: Response) { | |
| *res.status_mut() = StatusCode::ImATeapot; | |
| res.send(b"Please send a multipart req :(\n").unwrap(); | |
| } | |
| } | |
| struct EchoMultipart; | |
| impl MultipartHandler for EchoMultipart { | |
| fn handle_multipart(&self, mut multipart: Multipart<HyperRequest>, res: HyperResponse) { | |
| match multipart.save().temp() { | |
| SaveResult::Full(entries) => process_entries(res, entries).unwrap(), | |
| SaveResult::Partial(entries, error) => { | |
| println!("Errors saving multipart:\n{:?}", error); | |
| process_entries(res, entries.into()).unwrap(); | |
| } | |
| SaveResult::Error(error) => { | |
| println!("Errors saving multipart:\n{:?}", error); | |
| res.send(format!("An error occurred {}", error).as_bytes()).unwrap(); | |
| } | |
| }; | |
| } | |
| } | |
| fn process_entries(res: HyperResponse, entries: Entries) -> io::Result<()> { | |
| let mut res = res.start()?; | |
| let stdout = io::stdout(); | |
| let out = StdoutTee::new(&mut res, &stdout); | |
| entries.write_debug(out) | |
| } | |
| fn main() { | |
| println!("Listening on 0.0.0.0:3333"); | |
| Server::http("0.0.0.0:3333").unwrap().handle( | |
| Switch::new( | |
| NonMultipart, | |
| EchoMultipart | |
| )).unwrap(); | |
| } |