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(-)
@@ -1,15 +1,15 @@
use hyper::{Body, Response};
use crate::settings::Header;
use crate::settings::Headers;
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() {
if headers_entry.source.is_match(uri) {
@@ -52,9 +52,10 @@ impl Server {
async fn start_server(self) -> Result {
let general = self.opts.general;
let advanced_opts = self.opts.advanced;
@@ -9,20 +9,20 @@ pub mod file;
use cli::General;
pub struct Header {
pub struct Headers {
pub source: GlobMatcher,
pub headers: HeaderMap,
}
pub struct Advanced {
pub headers: Option<Vec<Header>>,
pub headers: Option<Vec<Headers>>,
}
pub struct Settings {
pub general: General,
@@ -62,7 +62,7 @@ impl Settings {
let mut settings_advanced: Option<Advanced> = None;
if let Some(ref p) = opts.config_file {
if p.is_file() {
@@ -77,6 +77,7 @@ impl Settings {
config_file = Some(path_resolved);
if let Some(general) = settings.general {
if let Some(ref v) = general.host {
host = v.to_owned()
@@ -143,24 +144,37 @@ impl Settings {
}
}
if let Some(advanced) = settings.advanced {
if let Some(multiple_headers) = advanced.headers {
let mut headers_vec: Vec<Header> = Vec::new();
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(),
});
let headers_entries = match advanced.headers {
Some(headers_entries) => {
let mut headers_vec: Vec<Headers> = Vec::new();
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,
});
}
}
}
@@ -56,11 +56,11 @@ headers = { Access-Control-Allow-Origin = "*", X-XSS-PROTECTION = "1; mode=block
[[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"
[[advanced.headers]]