Skip to content

Commit

Permalink
refactor: http headers assignments
Browse files Browse the repository at this point in the history
  • Loading branch information
joseluisq committed May 1, 2022
1 parent 5fa3db4 commit 55461b2
Show file tree
Hide file tree
Showing 4 changed files with 48 additions and 33 deletions.
8 changes: 4 additions & 4 deletions src/custom_headers.rs
Original file line number Diff line number Diff line change
@@ -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
Expand Down
3 changes: 2 additions & 1 deletion src/server.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
60 changes: 37 additions & 23 deletions src/settings/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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() {
Expand All @@ -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()
Expand Down Expand Up @@ -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,
});
}
}
}
Expand Down
10 changes: 5 additions & 5 deletions tests/toml/config.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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]]
Expand Down

0 comments on commit 55461b2

Please sign in to comment.