server/rest: also log user agent
allows easily to see if a request is from a browser or a proxmox-backup-client CLI Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
This commit is contained in:
parent
8e7e2223d8
commit
86f3c2363c
|
@ -116,6 +116,7 @@ fn log_response(
|
||||||
method: hyper::Method,
|
method: hyper::Method,
|
||||||
path_query: &str,
|
path_query: &str,
|
||||||
resp: &Response<Body>,
|
resp: &Response<Body>,
|
||||||
|
user_agent: Option<String>,
|
||||||
) {
|
) {
|
||||||
|
|
||||||
if resp.extensions().get::<NoLogExtension>().is_some() { return; };
|
if resp.extensions().get::<NoLogExtension>().is_some() { return; };
|
||||||
|
@ -150,7 +151,7 @@ fn log_response(
|
||||||
.lock()
|
.lock()
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.log(format!(
|
.log(format!(
|
||||||
"{} - {} [{}] \"{} {}\" {} {}",
|
"{} - {} [{}] \"{} {}\" {} {} {}",
|
||||||
peer.ip(),
|
peer.ip(),
|
||||||
user,
|
user,
|
||||||
datetime,
|
datetime,
|
||||||
|
@ -158,6 +159,7 @@ fn log_response(
|
||||||
path,
|
path,
|
||||||
status.as_str(),
|
status.as_str(),
|
||||||
resp.body().size_hint().lower(),
|
resp.body().size_hint().lower(),
|
||||||
|
user_agent.unwrap_or("-".into()),
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -173,6 +175,15 @@ fn get_proxied_peer(headers: &HeaderMap) -> Option<std::net::SocketAddr> {
|
||||||
rhost.parse().ok()
|
rhost.parse().ok()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn get_user_agent(headers: &HeaderMap) -> Option<String> {
|
||||||
|
let agent = headers.get(header::USER_AGENT)?.to_str();
|
||||||
|
agent.map(|s| {
|
||||||
|
let mut s = s.to_owned();
|
||||||
|
s.truncate(128);
|
||||||
|
s
|
||||||
|
}).ok()
|
||||||
|
}
|
||||||
|
|
||||||
impl tower_service::Service<Request<Body>> for ApiService {
|
impl tower_service::Service<Request<Body>> for ApiService {
|
||||||
type Response = Response<Body>;
|
type Response = Response<Body>;
|
||||||
type Error = Error;
|
type Error = Error;
|
||||||
|
@ -185,6 +196,7 @@ impl tower_service::Service<Request<Body>> for ApiService {
|
||||||
fn call(&mut self, req: Request<Body>) -> Self::Future {
|
fn call(&mut self, req: Request<Body>) -> Self::Future {
|
||||||
let path = req.uri().path_and_query().unwrap().as_str().to_owned();
|
let path = req.uri().path_and_query().unwrap().as_str().to_owned();
|
||||||
let method = req.method().clone();
|
let method = req.method().clone();
|
||||||
|
let user_agent = get_user_agent(req.headers());
|
||||||
|
|
||||||
let config = Arc::clone(&self.api_config);
|
let config = Arc::clone(&self.api_config);
|
||||||
let peer = match get_proxied_peer(req.headers()) {
|
let peer = match get_proxied_peer(req.headers()) {
|
||||||
|
@ -203,7 +215,7 @@ impl tower_service::Service<Request<Body>> for ApiService {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
let logger = config.get_file_log();
|
let logger = config.get_file_log();
|
||||||
log_response(logger, &peer, method, &path, &response);
|
log_response(logger, &peer, method, &path, &response, user_agent);
|
||||||
Ok(response)
|
Ok(response)
|
||||||
}
|
}
|
||||||
.boxed()
|
.boxed()
|
||||||
|
|
Loading…
Reference in New Issue