From 55461b273b93aee7fa93e5f81fa80f4236dfa8e0 Mon Sep 17 00:00:00 2001 From: Jose Quintana Date: Sun, 1 May 2022 06:44:29 +0200 Subject: [PATCH] refactor: http headers assignments --- 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>, + headers_opts_vec: &Option>, resp: &mut Response, ) { - 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>, + pub headers: Option>, } -/// 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 = 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
= 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 = 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]] -- libgit2 1.7.2