feat: support user-agent logging
Diff
src/handler.rs | 25 ++++++++++++++++++++++---
src/server.rs | 5 +++++
src/settings/cli.rs | 12 ++++++++++++
src/settings/file.rs | 3 +++
src/settings/mod.rs | 5 +++++
src/testing.rs | 1 +
6 files changed, 48 insertions(+), 3 deletions(-)
@@ -6,7 +6,7 @@
use headers::{ContentType, HeaderMap, HeaderMapExt, HeaderValue};
use headers::{ContentType, HeaderMap, HeaderMapExt, HeaderValue, UserAgent};
use hyper::{Body, Request, Response, StatusCode};
use std::{future::Future, net::IpAddr, net::SocketAddr, path::PathBuf, sync::Arc};
@@ -74,6 +74,8 @@ pub struct RequestHandlerOpts {
pub index_files: Vec<String>,
pub log_remote_address: bool,
pub log_remote_user_agent: bool,
pub redirect_trailing_slash: bool,
@@ -121,6 +123,7 @@ impl RequestHandler {
#[cfg(feature = "directory-listing")]
let dir_listing_format = &self.opts.dir_listing_format;
let log_remote_addr = self.opts.log_remote_address;
let log_remote_user_agent = self.opts.log_remote_user_agent;
let redirect_trailing_slash = self.opts.redirect_trailing_slash;
let compression_static = self.opts.compression_static;
let ignore_hidden_files = self.opts.ignore_hidden_files;
@@ -155,20 +158,36 @@ impl RequestHandler {
}
}
let mut remote_user_agent_str = String::new();
if log_remote_user_agent {
if let Some(client_user_agent) = headers
.get("User-Agent")
.and_then(|v| v.to_str().ok())
.and_then(|s| s.split(',').next())
.and_then(|s| s.trim().parse::<UserAgent>().ok())
{
remote_user_agent_str.push_str(" user_agent=");
remote_user_agent_str.push_str(&client_user_agent.to_string())
}
}
if health_request {
tracing::debug!(
"incoming request: method={} uri={}{}",
"incoming request: method={} uri={}{}{}",
method,
uri,
remote_addr_str,
remote_user_agent_str,
);
} else {
tracing::info!(
"incoming request: method={} uri={}{}",
"incoming request: method={} uri={}{}{}",
method,
uri,
remote_addr_str,
remote_user_agent_str,
);
}
@@ -273,6 +273,10 @@ impl Server {
let log_remote_address = general.log_remote_address;
server_info!("log remote address: enabled={}", log_remote_address);
let log_remote_user_agent = general.log_remote_user_agent;
server_info!("log remote user-agent: enabled={}", log_remote_user_agent);
let redirect_trailing_slash = general.redirect_trailing_slash;
server_info!(
@@ -357,6 +361,7 @@ impl Server {
#[cfg(feature = "basic-auth")]
basic_auth,
log_remote_address,
log_remote_user_agent,
redirect_trailing_slash,
ignore_hidden_files,
index_files,
@@ -365,6 +365,18 @@ pub struct General {
#[arg(
long,
default_value = "false",
default_missing_value("true"),
num_args(0..=1),
require_equals(true),
action = clap::ArgAction::Set,
env = "SERVER_LOG_REMOTE_USER_AGENT",
)]
pub log_remote_user_agent: bool,
#[arg(
long,
default_value = "true",
default_missing_value("true"),
num_args(0..=1),
@@ -230,6 +230,9 @@ pub struct General {
pub log_remote_address: Option<bool>,
pub log_remote_user_agent: Option<bool>,
pub redirect_trailing_slash: Option<bool>,
@@ -145,6 +145,7 @@ impl Settings {
let mut page_fallback = opts.page_fallback;
let mut log_remote_address = opts.log_remote_address;
let mut log_remote_user_agent = opts.log_remote_user_agent;
let mut redirect_trailing_slash = opts.redirect_trailing_slash;
let mut ignore_hidden_files = opts.ignore_hidden_files;
let mut index_files = opts.index_files;
@@ -288,6 +289,9 @@ impl Settings {
if let Some(v) = general.log_remote_address {
log_remote_address = v
}
if let Some(v) = general.log_remote_user_agent {
log_remote_user_agent = v
}
if let Some(v) = general.redirect_trailing_slash {
redirect_trailing_slash = v
}
@@ -550,6 +554,7 @@ impl Settings {
#[cfg(feature = "fallback-page")]
page_fallback,
log_remote_address,
log_remote_user_agent,
redirect_trailing_slash,
ignore_hidden_files,
index_files,
@@ -48,6 +48,7 @@ pub mod fixtures {
#[cfg(feature = "basic-auth")]
basic_auth: opts.general.basic_auth,
log_remote_address: opts.general.log_remote_address,
log_remote_user_agent: opts.general.log_remote_user_agent,
redirect_trailing_slash: opts.general.redirect_trailing_slash,
ignore_hidden_files: opts.general.ignore_hidden_files,
index_files: vec![opts.general.index_files],