summaryrefslogtreecommitdiff
path: root/src/server
diff options
context:
space:
mode:
authorJan Wolff <janw@mailbox.org>2020-05-20 08:03:27 +0200
committerJan Wolff <janw@mailbox.org>2020-05-20 08:03:27 +0200
commit458b25247dd9942f71b189d3fe829096f0ba4ec6 (patch)
tree553222effb22abad9a0d92a9be98222f928c4480 /src/server
parentb6e428eba2397ab063f6580098fe100906c44fb1 (diff)
correctly use CR/LF line endings for textfiles
Diffstat (limited to 'src/server')
-rw-r--r--src/server/handler.rs32
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;
+ }
+ }
}
}