index : static-web-server.git

ascending towards madness

author Jose Quintana <joseluisquintana20@gmail.com> 2022-04-28 20:13:00.0 +00:00:00
committer Jose Quintana <joseluisquintana20@gmail.com> 2022-04-28 20:13:00.0 +00:00:00
commit
5fa3db4d619acd60cb0cafefffb118c09e0bcb0d [patch]
tree
9d8579582735a8275a9eac831b3ce179e40aab94
parent
62ebe52f7a255db0e3f0a322b3980e58ed6104f4
download
5fa3db4d619acd60cb0cafefffb118c09e0bcb0d.tar.gz

refactor: error context when compiling glob sources



Diff

 src/custom_headers.rs |  6 +++---
 src/handler.rs        |  4 ++--
 src/settings/mod.rs   | 32 ++++++++++++++++++++------------
 3 files changed, 25 insertions(+), 17 deletions(-)

diff --git a/src/custom_headers.rs b/src/custom_headers.rs
index a60b864..e680ea0 100644
--- a/src/custom_headers.rs
+++ b/src/custom_headers.rs
@@ -1,14 +1,14 @@
use hyper::{Body, Response};

use crate::settings::HeadersOpt;
use crate::settings::Header;

/** Append custom HTTP headers to current response. */
pub fn append_headers(
    uri: &str,
    multiple_headers: &Option<Vec<HeadersOpt>>,
    headers_opts_vec: &Option<Vec<Header>>,
    resp: &mut Response<Body>,
) {
    if let Some(multiple_headers) = multiple_headers {
    if let Some(multiple_headers) = headers_opts_vec {
        for headers_entry in multiple_headers.iter() {
            // Match header glob pattern against request uri
            if headers_entry.source.is_match(uri) {
diff --git a/src/handler.rs b/src/handler.rs
index dadbbb1..61eab62 100644
--- a/src/handler.rs
+++ b/src/handler.rs
@@ -3,7 +3,7 @@ use std::{future::Future, path::PathBuf, sync::Arc};

use crate::{
    basic_auth, compression, control_headers, cors, custom_headers, error_page, fallback_page,
    security_headers, settings::AdvancedOpts, static_files, Error, Result,
    security_headers, settings::Advanced, static_files, Error, Result,
};

/// It defines options for a request handler.
@@ -22,7 +22,7 @@ pub struct RequestHandlerOpts {
    pub basic_auth: String,

    // Advanced options
    pub advanced_opts: Option<AdvancedOpts>,
    pub advanced_opts: Option<Advanced>,
}

/// It defines the main request handler used by the Hyper service request.
diff --git a/src/settings/mod.rs b/src/settings/mod.rs
index 33474d9..cd1168a 100644
--- a/src/settings/mod.rs
+++ b/src/settings/mod.rs
@@ -9,21 +9,25 @@ pub mod file;

use cli::General;

pub struct AdvancedOpts {
    pub headers: Option<Vec<HeadersOpt>>,
}

pub struct HeadersOpt {
/// Headers file options.
pub struct Header {
    /// Source pattern glob matcher
    pub source: GlobMatcher,
    /// Custom HTTP headers
    pub headers: HeaderMap,
}

/// The advanced file options.
pub struct Advanced {
    pub headers: Option<Vec<Header>>,
}

/// The Server CLI and File settings.
pub struct Settings {
    /// General server options
    pub general: General,
    /// Advanced server options
    pub advanced: Option<AdvancedOpts>,
    pub advanced: Option<Advanced>,
}

impl Settings {
@@ -56,7 +60,7 @@ impl Settings {
        let mut page_fallback = opts.page_fallback.to_owned();

        // Define the advanced file options
        let mut settings_advanced: Option<AdvancedOpts> = None;
        let mut settings_advanced: Option<Advanced> = None;

        // Handle config file options and set them when available
        // NOTE: All config file based options shouldn't be mandatory, therefore `Some()` wrapped
@@ -67,7 +71,9 @@ impl Settings {
                    .with_context(|| "error resolving toml config file path")?;

                let settings = file::Settings::read(&path_resolved)
                    .with_context(|| {"can not read toml config file because has invalid or unsupported format/options" })?;
                    .with_context(|| {
                        "can not read toml config file because has invalid or unsupported format/options"
                    })?;

                config_file = Some(path_resolved);

@@ -139,17 +145,19 @@ impl Settings {

                if let Some(advanced) = settings.advanced {
                    if let Some(multiple_headers) = advanced.headers {
                        let mut headers_vec: Vec<HeadersOpt> = Vec::new();
                        let mut headers_vec: Vec<Header> = Vec::new();

                        // Compile glob patterns for header sources
                        for headers_entry in multiple_headers.iter() {
                            let source = Glob::new(&headers_entry.source)?.compile_matcher();
                            headers_vec.push(HeadersOpt {
                            let source = Glob::new(&headers_entry.source)
                                .with_context(|| "can not compile glob pattern for header source")?
                                .compile_matcher();
                            headers_vec.push(Header {
                                source,
                                headers: headers_entry.headers.to_owned(),
                            });
                        }
                        settings_advanced = Some(AdvancedOpts {
                        settings_advanced = Some(Advanced {
                            headers: Some(headers_vec),
                        });
                    }