| use std::path::Path; |
| use std::fs; |
| use ascii::AsciiString; |
| |
| extern crate ascii; |
| extern crate tiny_http; |
| |
| fn get_content_type(path: &Path) -> &'static str { |
| let extension = match path.extension() { |
| None => return "text/plain", |
| Some(e) => e |
| }; |
| |
| match extension.to_str().unwrap() { |
| "gif" => "image/gif", |
| "jpg" => "image/jpeg", |
| "jpeg" => "image/jpeg", |
| "png" => "image/png", |
| "pdf" => "application/pdf", |
| "htm" => "text/html; charset=utf8", |
| "html" => "text/html; charset=utf8", |
| "txt" => "text/plain; charset=utf8", |
| _ => "text/plain; charset=utf8" |
| } |
| } |
| |
| fn main() { |
| let server = tiny_http::Server::http("0.0.0.0:8000").unwrap(); |
| let port = server.server_addr().port(); |
| println!("Now listening on port {}", port); |
| |
| loop { |
| let rq = match server.recv() { |
| Ok(rq) => rq, |
| Err(_) => break |
| }; |
| |
| println!("{:?}", rq); |
| |
| let url = rq.url().to_string(); |
| let path = Path::new(&url); |
| let file = fs::File::open(&path); |
| |
| if file.is_ok() { |
| let response = tiny_http::Response::from_file(file.unwrap()); |
| |
| let response = response.with_header( |
| tiny_http::Header { |
| field: "Content-Type".parse().unwrap(), |
| value: AsciiString::from_ascii(get_content_type(&path)).unwrap(), |
| } |
| ); |
| |
| let _ = rq.respond(response); |
| |
| } else { |
| let rep = tiny_http::Response::new_empty(tiny_http::StatusCode(404)); |
| let _ = rq.respond(rep); |
| } |
| } |
| } |