chore: http headers map deserialization
Diff
Cargo.lock | 11 +++++++++++
Cargo.toml | 1 +
src/config.rs | 9 ++-------
src/manifest.rs | 17 ++++++-----------
src/server.rs | 21 ++++++++++++++++++++-
tests/toml/config.toml | 32 +++++++++++++++-----------------
6 files changed, 55 insertions(+), 36 deletions(-)
@@ -401,6 +401,16 @@ dependencies = [
]
[[package]]
name = "http-serde"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6d98b3d9662de70952b14c4840ee0f37e23973542a363e2275f4b9d024ff6cca"
dependencies = [
"http",
"serde",
]
[[package]]
name = "httparse"
version = "1.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -894,6 +904,7 @@ dependencies = [
"futures-util",
"headers",
"http",
"http-serde",
"humansize",
"hyper",
"listenfd",
@@ -54,6 +54,7 @@ form_urlencoded = "1.0"
serde = { version = "1.0", default-features = false, features = ["derive"] }
serde_ignored = "0.1"
toml = "0.5"
http-serde = "1.1"
[target.'cfg(all(target_env = "musl", target_pointer_width = "64"))'.dependencies.tikv-jemallocator]
version = "0.4"
@@ -176,12 +176,7 @@ pub struct Config {
pub grace_period: u8,
#[structopt(
long,
short = "w",
default_value = "config.toml",
env = "SEVER_CONFIG_FILE"
)]
#[structopt(long, short = "w", env = "SERVER_CONFIG_FILE")]
pub config_file: PathBuf,
pub config_file: Option<PathBuf>,
}
@@ -1,5 +1,6 @@
use headers::HeaderMap;
use serde::Deserialize;
use std::collections::BTreeSet;
use std::path::{Path, PathBuf};
@@ -16,18 +17,12 @@ pub enum LogLevel {
Trace,
}
#[derive(Debug, Serialize, Deserialize, Clone, Default)]
#[serde(rename_all = "kebab-case")]
pub struct Header {
pub key: String,
pub value: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, Default)]
#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(rename_all = "kebab-case")]
pub struct Headers {
pub source: String,
pub headers: Option<Vec<Header>>,
#[serde(with = "http_serde::header_map")]
pub headers: HeaderMap,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
@@ -61,11 +56,11 @@ pub struct Manifest {
pub cors_allow_origins: String,
pub cors_allow_headers: String,
pub cors_allow_headers: Option<String>,
pub directory_listing: bool,
pub directory_listing_order: u8,
pub directory_listing_order: Option<u8>,
pub basic_auth: Option<String>,
@@ -8,7 +8,7 @@ use structopt::StructOpt;
use crate::handler::{RequestHandler, RequestHandlerOpts};
use crate::tls::{TlsAcceptor, TlsConfigBuilder};
use crate::{config::Config, service::RouterService, Context, Result};
use crate::{cors, helpers, logger, signals};
use crate::{cors, helpers, logger, manifest, signals};
pub struct Server {
@@ -59,6 +59,25 @@ impl Server {
logger::init(&opts.log_level)
.with_context(|| "failed to initialize logging".to_string())?;
if let Some(config_file) = &opts.config_file {
if config_file.is_file() {
let path_resolved = config_file
.canonicalize()
.with_context(|| "error resolving config file path.")?;
let manifest = manifest::read_manifest(&path_resolved).with_context(|| {
format!(
"can not get \"{}\" config file because has invalid format or inaccessible",
path_resolved.display()
)
})?;
println!("{:?}", manifest.unwrap().headers);
}
}
let (tcp_listener, addr_str);
match opts.fd {
@@ -32,35 +32,33 @@ directory-listing = false
basic-auth = ""
fd = ""
threads-multiplier = 1
grace-period = 0
page-fallback = ""
[[headers]]
source = "**/*.@(eot|otf|ttf|ttc|woff|font.css)"
[[headers.headers]]
key = "Access-Control-Allow-Origin"
value = "*"
[[headers.headers]]
key = "Access-Control-Allow-Origin"
value = "*"
[[headers.headers]]
key = "Access-Control-Allow-Origin"
value = "*"
headers = { Access-Control-Allow-Origin = "*", X-XSS-PROTECTION = "1; mode=block" }
[[headers]]
source = "**/*.@(jpg|jpeg|gif|png)"
[[headers.headers]]
key = "Cache-Control"
value = "max-age=7200"
source = "**/*.@(jpg|jpeg|gif|png)"
[headers.headers]
Cache-Control = "max-age=7200"
Content-Security-Policy = "frame-ancestors 'self'"
[[headers]]
source = "404.html"
[[headers.headers]]
key = "Cache-Control"
value = "max-age=300"
headers.Cache-Control = "max-age=300"
headers.Strict-Transport-Security = "max-age=63072000; includeSubDomains; preload"