diff options
Diffstat (limited to 'src/server/handler.rs')
| -rw-r--r-- | src/server/handler.rs | 32 |
1 files changed, 28 insertions, 4 deletions
diff --git a/src/server/handler.rs b/src/server/handler.rs index e122e96..c15d600 100644 --- a/src/server/handler.rs +++ b/src/server/handler.rs @@ -3,7 +3,7 @@ use crate::server::response; use crate::server::ServerConfig; use openssl::ssl::SslStream; use std::fs::File; -use std::io::{copy, BufReader, BufWriter}; +use std::io::{copy, BufRead, BufReader, BufWriter, Error, Write}; use std::net::TcpStream; use std::path::{Path, PathBuf}; use url::Url; @@ -57,6 +57,12 @@ fn gen_path_index(path: &Path) -> PathBuf { } } +fn write_line<T: Write>(line: &[u8], stream: &mut BufWriter<T>) -> Result<(), Error> { + stream.write(line)?; + stream.write(b"\r\n")?; + Ok(()) +} + fn handle_response(config: &ServerConfig, url: Url, mut stream: &mut SslStream<TcpStream>) { println!("responding for: {}", url); @@ -99,8 +105,26 @@ fn handle_response(config: &ServerConfig, url: Url, mut stream: &mut SslStream<T let mut buf_file = BufReader::new(file); let mut buf_stream = BufWriter::new(stream); - match copy(&mut buf_file, &mut buf_stream) { - Ok(_s) => {} - Err(_e) => {} + + if mime_type.starts_with("text/") { + // We make sure to send all text/* files with correct CL/RF line endings + for line in buf_file.lines() { + match write_line(line.unwrap().as_bytes(), &mut buf_stream) { + Ok(_) => {} + Err(e) => { + println!("error while sending text file: {:?}\n {}", path, e); + return; + } + } + } + } else { + // Any other MIME type can just be copied as-is + match copy(&mut buf_file, &mut buf_stream) { + Ok(_) => {} + Err(e) => { + println!("error while sending file: {:?}\n {}", path, e); + return; + } + } } } |
