diff options
author | boastful-squirrel <boastful.squirrel@gmail.com> | 2019-05-02 19:36:47 +0000 |
---|---|---|
committer | boastful-squirrel <boastful.squirrel@gmail.com> | 2019-05-02 19:36:47 +0000 |
commit | dd8d11c698435217c370b940b41d060a614892c1 (patch) | |
tree | 56061af9f8ecf6324f98de49cd898cdcf40bd48f /src | |
parent | Cargo fmt (diff) | |
download | miniserve-dd8d11c698435217c370b940b41d060a614892c1.tar.gz miniserve-dd8d11c698435217c370b940b41d060a614892c1.zip |
Read query params to handle error back link
Diffstat (limited to '')
-rw-r--r-- | src/auth.rs | 1 | ||||
-rw-r--r-- | src/file_upload.rs | 59 | ||||
-rw-r--r-- | src/listing.rs | 40 | ||||
-rw-r--r-- | src/main.rs | 10 | ||||
-rw-r--r-- | src/renderer.rs | 9 |
5 files changed, 61 insertions, 58 deletions
diff --git a/src/auth.rs b/src/auth.rs index 3989ab4..c3cbd54 100644 --- a/src/auth.rs +++ b/src/auth.rs @@ -163,6 +163,7 @@ fn build_unauthorized_response( req.state().default_color_scheme, req.state().default_color_scheme, false, + false, ) .into_string() } diff --git a/src/file_upload.rs b/src/file_upload.rs index 9344e8b..36b2401 100644 --- a/src/file_upload.rs +++ b/src/file_upload.rs @@ -1,7 +1,7 @@ use actix_web::{ dev, http::{header, StatusCode}, - multipart, FromRequest, FutureResponse, HttpMessage, HttpRequest, HttpResponse, Query, + multipart, FutureResponse, HttpMessage, HttpRequest, HttpResponse, }; use futures::{future, future::FutureResult, Future, Stream}; use std::{ @@ -11,7 +11,7 @@ use std::{ }; use crate::errors::{self, ContextualError}; -use crate::listing::{QueryParameters, SortingMethod, SortingOrder}; +use crate::listing::{self, SortingMethod, SortingOrder}; use crate::renderer; use crate::themes::ColorScheme; @@ -127,48 +127,24 @@ pub fn upload_file( "/".to_string() }; - let (path, sort_method, sort_order, color_scheme) = match Query::<QueryParameters>::extract(req) - { - Ok(query) => { - let sort_param = query.sort; - let order_param = query.order; - let theme_param = query.theme.unwrap_or(default_color_scheme); - - if let Some(path) = query.path.clone() { - if let Ok(stripped_path) = path.strip_prefix(Component::RootDir) { - ( - stripped_path.to_owned(), - sort_param, - order_param, - theme_param, - ) - } else { - (path.clone(), sort_param, order_param, theme_param) - } - } else { - let err = ContextualError::InvalidHTTPRequestError( - "Missing query parameter 'path'".to_string(), - ); - return Box::new(create_error_response( - &err.to_string(), - StatusCode::BAD_REQUEST, - &return_path, - sort_param, - order_param, - theme_param, - default_color_scheme, - )); - } - } - Err(e) => { - let err = ContextualError::InvalidHTTPRequestError(e.to_string()); + let (sort_method, sort_order, _, color_scheme, path) = listing::extract_query_parameters(req); + let color_scheme = color_scheme.unwrap_or(default_color_scheme); + let upload_path = match path { + Some(path) => match path.strip_prefix(Component::RootDir) { + Ok(stripped_path) => stripped_path.to_owned(), + Err(_) => path.clone(), + }, + None => { + let err = ContextualError::InvalidHTTPRequestError( + "Missing query parameter 'path'".to_string(), + ); return Box::new(create_error_response( &err.to_string(), StatusCode::BAD_REQUEST, &return_path, - None, - None, - default_color_scheme, + sort_method, + sort_order, + color_scheme, default_color_scheme, )); } @@ -194,7 +170,7 @@ pub fn upload_file( }; // If the target path is under the app root directory, save the file. - let target_dir = match &app_root_dir.clone().join(path).canonicalize() { + let target_dir = match &app_root_dir.clone().join(upload_path).canonicalize() { Ok(path) if path.starts_with(&app_root_dir) => path.clone(), _ => { let err = ContextualError::InvalidHTTPRequestError( @@ -261,6 +237,7 @@ fn create_error_response( color_scheme, default_color_scheme, true, + true, ) .into_string(), ), diff --git a/src/listing.rs b/src/listing.rs index 22e43f0..2e3093d 100644 --- a/src/listing.rs +++ b/src/listing.rs @@ -10,10 +10,10 @@ use std::path::{Path, PathBuf}; use std::time::SystemTime; use strum_macros::{Display, EnumString}; -use crate::archive; +use crate::archive::{self, CompressionMethod}; use crate::errors; use crate::renderer; -use crate::themes; +use crate::themes::ColorScheme; /// Query parameters #[derive(Deserialize)] @@ -21,8 +21,8 @@ pub struct QueryParameters { pub path: Option<PathBuf>, pub sort: Option<SortingMethod>, pub order: Option<SortingOrder>, - pub theme: Option<themes::ColorScheme>, - download: Option<archive::CompressionMethod>, + pub theme: Option<ColorScheme>, + download: Option<CompressionMethod>, } /// Available sorting methods @@ -131,7 +131,7 @@ pub fn directory_listing<S>( skip_symlinks: bool, file_upload: bool, random_route: Option<String>, - default_color_scheme: themes::ColorScheme, + default_color_scheme: ColorScheme, upload_route: String, ) -> Result<HttpResponse, io::Error> { let serve_path = req.path(); @@ -144,12 +144,7 @@ pub fn directory_listing<S>( Err(_) => base.to_path_buf(), }; - let (sort_method, sort_order, download, color_scheme) = - if let Ok(query) = Query::<QueryParameters>::extract(req) { - (query.sort, query.order, query.download.clone(), query.theme) - } else { - (None, None, None, None) - }; + let (sort_method, sort_order, download, color_scheme, _) = extract_query_parameters(req); let mut entries: Vec<Entry> = Vec::new(); @@ -273,6 +268,7 @@ pub fn directory_listing<S>( color_scheme, default_color_scheme, false, + true, ) .into_string(), )) @@ -299,3 +295,25 @@ pub fn directory_listing<S>( )) } } + +pub fn extract_query_parameters<S>( + req: &HttpRequest<S>, +) -> ( + Option<SortingMethod>, + Option<SortingOrder>, + Option<CompressionMethod>, + Option<ColorScheme>, + Option<PathBuf>, +) { + if let Ok(query) = Query::<QueryParameters>::extract(req) { + ( + query.sort, + query.order, + query.download.clone(), + query.theme, + query.path.clone(), + ) + } else { + (None, None, None, None, None) + } +} diff --git a/src/main.rs b/src/main.rs index 22b91cb..3bac14d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -287,6 +287,9 @@ fn error_404(req: &HttpRequest<crate::MiniserveConfig>) -> Result<HttpResponse, None => "/".to_string(), }; + let (sort_method, sort_order, _, color_scheme, _) = listing::extract_query_parameters(req); + let color_scheme = color_scheme.unwrap_or(default_color_scheme); + errors::log_error_chain(err_404.to_string()); Ok(actix_web::HttpResponse::NotFound().body( @@ -294,11 +297,12 @@ fn error_404(req: &HttpRequest<crate::MiniserveConfig>) -> Result<HttpResponse, &err_404.to_string(), StatusCode::NOT_FOUND, &return_address, - None, - None, - default_color_scheme, + sort_method, + sort_order, + color_scheme, default_color_scheme, false, + true, ) .into_string(), )) diff --git a/src/renderer.rs b/src/renderer.rs index acef208..cdcec94 100644 --- a/src/renderer.rs +++ b/src/renderer.rs @@ -854,6 +854,7 @@ pub fn render_error( color_scheme: ColorScheme, default_color_scheme: ColorScheme, has_referer: bool, + display_back_link: bool, ) -> Markup { let link = if has_referer { return_address.to_string() @@ -875,9 +876,11 @@ pub fn render_error( @for error in error_description.lines() { p { (error) } } - div.error-nav { - a.error-back href=(link) { - "Go back to file listing" + @if display_back_link { + div.error-nav { + a.error-back href=(link) { + "Go back to file listing" + } } } } |