index : static-web-server.git

ascending towards madness

author Jose Quintana <joseluisquintana20@gmail.com> 2022-05-01 4:44:29.0 +00:00:00
committer Jose Quintana <joseluisquintana20@gmail.com> 2022-05-01 4:44:29.0 +00:00:00
commit
55461b273b93aee7fa93e5f81fa80f4236dfa8e0 [patch]
tree
c4e049de66d08da8eaadec334fffc413e0e6d02f
parent
5fa3db4d619acd60cb0cafefffb118c09e0bcb0d
download
55461b273b93aee7fa93e5f81fa80f4236dfa8e0.tar.gz

refactor: http headers assignments



Diff

 src/custom_headers.rs  |  8 +++----
 src/server.rs          |  3 ++-
 src/settings/mod.rs    | 60 +++++++++++++++++++++++++++++++--------------------
 tests/toml/config.toml | 10 ++++-----
 4 files changed, 48 insertions(+), 33 deletions(-)

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

use crate::settings::Header;
use crate::settings::Headers;

/** Append custom HTTP headers to current response. */
pub fn append_headers(
    uri: &str,
    headers_opts_vec: &Option<Vec<Header>>,
    headers_opts_vec: &Option<Vec<Headers>>,
    resp: &mut Response<Body>,
) {
    if let Some(multiple_headers) = headers_opts_vec {
        for headers_entry in multiple_headers.iter() {
    if let Some(headers_vec) = headers_opts_vec {
        for headers_entry in headers_vec.iter() {
            // Match header glob pattern against request uri
            if headers_entry.source.is_match(uri) {
                // Add/update headers if uri matches
diff --git a/src/server.rs b/src/server.rs
index 372c17a..a39f298 100644
--- a/src/server.rs
+++ b/src/server.rs
@@ -52,9 +52,10 @@ impl Server {
    /// Run the inner Hyper `HyperServer` (HTTP1/HTTP2) forever on the current thread
    // using the given configuration.
    async fn start_server(self) -> Result {
        // Config "general" options
        let general = self.opts.general;

        // TODO: handle advanced options
        // Config-file "advanced" options
        let advanced_opts = self.opts.advanced;

        // Logging system initialization
diff --git a/src/settings/mod.rs b/src/settings/mod.rs
index cd1168a..65ebf9f 100644
--- a/src/settings/mod.rs
+++ b/src/settings/mod.rs
@@ -9,20 +9,20 @@ pub mod file;

use cli::General;

/// Headers file options.
pub struct Header {
/// The `headers` file options.
pub struct Headers {
    /// Source pattern glob matcher
    pub source: GlobMatcher,
    /// Custom HTTP headers
    /// Map of custom HTTP headers
    pub headers: HeaderMap,
}

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

/// The Server CLI and File settings.
/// The full server CLI and File options.
pub struct Settings {
    /// General server options
    pub general: General,
@@ -62,7 +62,7 @@ impl Settings {
        // Define the advanced file options
        let mut settings_advanced: Option<Advanced> = None;

        // Handle config file options and set them when available
        // Handle "config file options" and set them when available
        // NOTE: All config file based options shouldn't be mandatory, therefore `Some()` wrapped
        if let Some(ref p) = opts.config_file {
            if p.is_file() {
@@ -77,6 +77,7 @@ impl Settings {

                config_file = Some(path_resolved);

                // Assign the corresponding file option values
                if let Some(general) = settings.general {
                    if let Some(ref v) = general.host {
                        host = v.to_owned()
@@ -143,24 +144,37 @@ impl Settings {
                    }
                }

                // Prepare the "advanced" options
                if let Some(advanced) = settings.advanced {
                    if let Some(multiple_headers) = advanced.headers {
                        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)
                                .with_context(|| "can not compile glob pattern for header source")?
                                .compile_matcher();
                            headers_vec.push(Header {
                                source,
                                headers: headers_entry.headers.to_owned(),
                            });
                    // 1. Custom HTTP headers assignment
                    let headers_entries = match advanced.headers {
                        Some(headers_entries) => {
                            let mut headers_vec: Vec<Headers> = Vec::new();

                            // Compile a glob pattern for each header sources entry
                            for headers_entry in headers_entries.iter() {
                                let source = Glob::new(&headers_entry.source)
                                    .with_context(|| {
                                        format!(
                                            "can not compile glob pattern for header source: {}",
                                            &headers_entry.source
                                        )
                                    })?
                                    .compile_matcher();

                                headers_vec.push(Headers {
                                    source,
                                    headers: headers_entry.headers.to_owned(),
                                });
                            }
                            Some(headers_vec)
                        }
                        settings_advanced = Some(Advanced {
                            headers: Some(headers_vec),
                        });
                    }
                        _ => None,
                    };

                    settings_advanced = Some(Advanced {
                        headers: headers_entries,
                    });
                }
            }
        }
diff --git a/tests/toml/config.toml b/tests/toml/config.toml
index f5392e0..5416e22 100644
--- a/tests/toml/config.toml
+++ b/tests/toml/config.toml
@@ -56,11 +56,11 @@ headers = { Access-Control-Allow-Origin = "*", X-XSS-PROTECTION = "1; mode=block

# #### b. Multiline version
[[advanced.headers]]
  source = "*.html"
  [advanced.headers.headers]
  Cache-Control = "public, max-age=36000"
  Content-Security-Policy = "frame-ancestors 'self'"
  Strict-Transport-Security = "max-age=63072000; includeSubDomains; preload"
source = "*.html"
[advanced.headers.headers]
Cache-Control = "public, max-age=36000"
Content-Security-Policy = "frame-ancestors 'self'"
Strict-Transport-Security = "max-age=63072000; includeSubDomains; preload"

#### c. Multiline version with explicit key (dotted)
[[advanced.headers]]