diff --git a/crates/ptth_file_server_bin/Cargo.toml b/crates/ptth_file_server_bin/Cargo.toml index 6fe3d86..397bd73 100644 --- a/crates/ptth_file_server_bin/Cargo.toml +++ b/crates/ptth_file_server_bin/Cargo.toml @@ -12,7 +12,7 @@ anyhow = "1.0.38" arc-swap = "1.2.0" handlebars = "3.5.3" http = "0.2.1" -hyper = "0.14.4" +hyper = { version = "0.14.4", features = ["http1", "server", "stream"] } serde = {version = "1.0.124", features = ["derive"]} structopt = "0.3.21" tokio = { version = "1.2.0", features = [] } @@ -23,3 +23,7 @@ uom = "0.30.0" ptth_core = { path = "../ptth_core" } ptth_server = { path = "../ptth_server" } + +[features] + +markdown = ["ptth_server/markdown"] diff --git a/crates/ptth_server/Cargo.toml b/crates/ptth_server/Cargo.toml index 743f45c..29ce534 100644 --- a/crates/ptth_server/Cargo.toml +++ b/crates/ptth_server/Cargo.toml @@ -24,7 +24,7 @@ heim = { version = "0.1.0-rc.1", features = ["process"] } http = "0.2.1" lazy_static = "1.4.0" percent-encoding = "2.1.0" -pulldown-cmark = "0.8.0" +pulldown-cmark = { version = "0.8.0", optional = true } rand = "0.8.3" regex = "1.4.1" reqwest = { version = "0.11.1", features = ["stream"] } @@ -48,3 +48,7 @@ ptth_core = { path = "../ptth_core", version = "1.2.0" } [dev-dependencies] maplit = "1.0.2" + +[features] + +markdown = ["pulldown-cmark"] diff --git a/crates/ptth_server/src/file_server/internal.rs b/crates/ptth_server/src/file_server/internal.rs index d96aa23..c60c483 100644 --- a/crates/ptth_server/src/file_server/internal.rs +++ b/crates/ptth_server/src/file_server/internal.rs @@ -37,11 +37,15 @@ use crate::{ use super::{ errors::FileServerError, - markdown, - markdown::render_styled, range, }; +#[cfg (feature = "markdown")] +use super::markdown::{ + self, + render_styled, +}; + #[derive (Debug, PartialEq)] pub enum OutputFormat { Json, @@ -76,10 +80,27 @@ pub enum Response { ServeDir (ServeDirParams), ServeFile (ServeFileParams), - MarkdownErr (markdown::Error), + MarkdownErr (MarkdownErrWrapper), MarkdownPreview (String), } +#[cfg (feature = "markdown")] +#[derive (Debug, PartialEq)] +pub struct MarkdownErrWrapper { + pub inner: markdown::Error, +} + +#[cfg (feature = "markdown")] +impl MarkdownErrWrapper { + fn new (inner: markdown::Error) -> Self { + Self { inner } + } +} + +#[cfg (not (feature = "markdown"))] +#[derive (Debug, PartialEq)] +pub struct MarkdownErrWrapper {} + fn serve_dir ( path_s: &str, path: &Path, @@ -141,25 +162,28 @@ async fn serve_file ( Valid (range) => range, }; - if uri.query () == Some ("as_markdown") { - const MAX_BUF_SIZE: u32 = 1_000_000; - - if range.range_requested { - return Ok (Response::InvalidQuery); - } - - if file_len > MAX_BUF_SIZE.into () { - return Ok (Response::MarkdownErr (markdown::Error::TooBig)); - } - else { - let mut buffer = vec! [0_u8; MAX_BUF_SIZE.try_into ().expect ("Couldn't fit u32 into usize")]; - let bytes_read = file.read (&mut buffer).await?; - buffer.truncate (bytes_read); + #[cfg (feature = "markdown")] + { + if uri.query () == Some ("as_markdown") { + const MAX_BUF_SIZE: u32 = 1_000_000; - return Ok (match render_styled (&buffer) { - Ok (x) => Response::MarkdownPreview (x), - Err (x) => Response::MarkdownErr (x), - }); + if range.range_requested { + return Ok (Response::InvalidQuery); + } + + if file_len > MAX_BUF_SIZE.into () { + return Ok (Response::MarkdownErr (MarkdownErrWrapper::new (markdown::Error::TooBig))); + } + else { + let mut buffer = vec! [0_u8; MAX_BUF_SIZE.try_into ().expect ("Couldn't fit u32 into usize")]; + let bytes_read = file.read (&mut buffer).await?; + buffer.truncate (bytes_read); + + return Ok (match render_styled (&buffer) { + Ok (x) => Response::MarkdownPreview (x), + Err (x) => Response::MarkdownErr (MarkdownErrWrapper::new (x)), + }); + } } } diff --git a/crates/ptth_server/src/file_server/mod.rs b/crates/ptth_server/src/file_server/mod.rs index 689d53c..8fbd383 100644 --- a/crates/ptth_server/src/file_server/mod.rs +++ b/crates/ptth_server/src/file_server/mod.rs @@ -48,6 +48,7 @@ pub mod metrics; mod html; mod internal; +#[cfg(feature = "markdown")] mod markdown; mod range; @@ -279,14 +280,21 @@ pub async fn serve_all ( range, }) => serve_file (file.into_inner (), send_body, range).await?, MarkdownErr (e) => { - use markdown::Error::*; - let code = match &e { - TooBig => StatusCode::InternalServerError, - //NotMarkdown => serve_error (StatusCode::BadRequest, "File is not Markdown"), - NotUtf8 => StatusCode::BadRequest, - }; + #[cfg (feature = "markdown")] + { + use markdown::Error::*; + let e = e.inner; + let code = match &e { + TooBig => StatusCode::InternalServerError, + //NotMarkdown => serve_error (StatusCode::BadRequest, "File is not Markdown"), + NotUtf8 => StatusCode::BadRequest, + }; + + return Ok (serve_error (code, e.to_string ())); + } - serve_error (code, e.to_string ()) + #[cfg (not (feature = "markdown"))] + serve_error (StatusCode::BadRequest, "Markdown feature is disabled") }, MarkdownPreview (s) => html::serve (s), })