From 8a4149cbf25216e021d009f4fed4c0c65323a3ef Mon Sep 17 00:00:00 2001 From: Jun Kurihara Date: Sun, 10 Jul 2022 11:21:17 +0900 Subject: [PATCH] fix proxy response bug, add log for response object --- src/msg_handler/handler.rs | 19 +++++++++++++----- src/msg_handler/mod.rs | 1 + src/msg_handler/utils_request.rs | 4 ++-- src/msg_handler/utils_response.rs | 33 +++++++++++++++++++++++++++++++ 4 files changed, 50 insertions(+), 7 deletions(-) create mode 100644 src/msg_handler/utils_response.rs diff --git a/src/msg_handler/handler.rs b/src/msg_handler/handler.rs index 6916b99..a8bd348 100644 --- a/src/msg_handler/handler.rs +++ b/src/msg_handler/handler.rs @@ -1,5 +1,5 @@ // Highly motivated by https://github.com/felipenoris/hyper-reverse-proxy -use super::{utils_headers::*, utils_request::*, utils_synth_response::*}; +use super::{utils_headers::*, utils_request::*, utils_response::ResLog, utils_synth_response::*}; use crate::{backend::Upstream, constants::*, error::*, globals::Globals, log::*}; use hyper::{ client::connect::Connect, @@ -30,7 +30,7 @@ where listen_addr: SocketAddr, tls_enabled: bool, ) -> Result> { - req.log(&client_addr, Some("(Incoming)")); + req.log(&client_addr, Some("(Request from Client)")); // Here we start to handle with server_name // Find backend application for given server_name, and drop if incoming request is invalid as request. @@ -92,7 +92,7 @@ where return http_error(StatusCode::SERVICE_UNAVAILABLE); }; // debug!("Request to be forwarded: {:?}", req_forwarded); - req_forwarded.log(&client_addr, Some("(Forwarding)")); + req_forwarded.log(&client_addr, Some("(Request to Backend)")); // Forward request to let mut res_backend = match self.forwarder.request(req_forwarded).await { @@ -102,7 +102,11 @@ where return http_error(StatusCode::BAD_REQUEST); } }; - debug!("Response from backend: {:?}", res_backend.status()); + res_backend.log( + &backend.server_name, + &client_addr, + Some("(Response from Backend)"), + ); // let response_log = res_backend.status().to_string(); if res_backend.status() == StatusCode::SWITCHING_PROTOCOLS { @@ -152,6 +156,11 @@ where // Generate response to client if self.generate_response_forwarded(&mut res_backend).is_ok() { // info!("{} => {}", request_log, response_log); + res_backend.log( + &backend.server_name, + &client_addr, + Some("(Response to Client)"), + ); Ok(res_backend) } else { // info!("{} => {}", request_log, StatusCode::BAD_GATEWAY); @@ -168,8 +177,8 @@ where response: &mut Response, ) -> Result<()> { let headers = response.headers_mut(); - remove_hop_header(headers); remove_connection_header(headers); + remove_hop_header(headers); append_header_entry_with_comma( headers, "server", diff --git a/src/msg_handler/mod.rs b/src/msg_handler/mod.rs index 89d6c8a..87620b8 100644 --- a/src/msg_handler/mod.rs +++ b/src/msg_handler/mod.rs @@ -1,6 +1,7 @@ mod handler; mod utils_headers; mod utils_request; +mod utils_response; mod utils_synth_response; pub use handler::HttpMessageHandler; diff --git a/src/msg_handler/utils_request.rs b/src/msg_handler/utils_request.rs index 1374339..bb32eba 100644 --- a/src/msg_handler/utils_request.rs +++ b/src/msg_handler/utils_request.rs @@ -4,10 +4,10 @@ use std::fmt::Display; //////////////////////////////////////////////////// // Functions of utils for request messages -pub trait MsgLog { +pub trait ReqLog { fn log(self, src: &T, extra: Option<&str>); } -impl MsgLog for &Request { +impl ReqLog for &Request { fn log(self, src: &T, extra: Option<&str>) { let canonical_src = src.to_canonical(); diff --git a/src/msg_handler/utils_response.rs b/src/msg_handler/utils_response.rs new file mode 100644 index 0000000..67da694 --- /dev/null +++ b/src/msg_handler/utils_response.rs @@ -0,0 +1,33 @@ +use crate::{log::*, utils::*}; +use hyper::Response; +use std::fmt::Display; + +//////////////////////////////////////////////////// +// Functions of utils for request messages +pub trait ResLog { + fn log( + self, + server_name: &T1, + client_addr: &T2, + extra: Option<&str>, + ); +} +impl ResLog for &Response { + fn log( + self, + server_name: &T1, + client_addr: &T2, + extra: Option<&str>, + ) { + let canonical_client_addr = client_addr.to_canonical(); + info!( + "{} <- {} -- {} {:?} {:?} {}", + canonical_client_addr, + server_name, + self.status(), + self.version(), + self.headers(), + extra.map_or_else(|| "", |v| v) + ); + } +}