From b0499dfefd7d4f1b78a3373928f9c7b399022717 Mon Sep 17 00:00:00 2001 From: Jose Quintana Date: Tue, 24 May 2022 00:38:43 +0200 Subject: [PATCH] feat: log request file with its remote address if available example: static-web-server -a 0.0.0.0 -p 8080 -d docker/public/ -g info 2022-05-23T22:24:50.519540Z INFO static_web_server::handler: incoming request: method=GET uri=/ remote_addr=192.168.1.126:57625 2022-05-23T22:25:26.516841Z INFO static_web_server::handler: incoming request: method=GET uri=/favicon.ico remote_addr=192.168.1.126:57625 resolves #111 --- src/handler.rs | 12 +++++++++++- src/service.rs | 17 ++++++++++------- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/src/handler.rs b/src/handler.rs index a9ab4f7..bb311b4 100644 --- a/src/handler.rs +++ b/src/handler.rs @@ -1,5 +1,5 @@ use hyper::{header::WWW_AUTHENTICATE, Body, Method, Request, Response, StatusCode}; -use std::{future::Future, path::PathBuf, sync::Arc}; +use std::{future::Future, net::SocketAddr, path::PathBuf, sync::Arc}; use crate::{ basic_auth, compression, control_headers, cors, custom_headers, error_page, fallback_page, @@ -35,6 +35,7 @@ impl RequestHandler { pub fn handle<'a>( &'a self, req: &'a mut Request, + remote_addr: Option, ) -> impl Future, Error>> + Send + 'a { let method = req.method(); let headers = req.headers(); @@ -48,6 +49,15 @@ impl RequestHandler { let mut cors_headers: Option = None; + // Log request information with its remote address + let remote_addr = remote_addr.map_or("".to_owned(), |v| v.to_string()); + tracing::info!( + "incoming request: method={} uri={} remote_addr={}", + method, + uri, + remote_addr, + ); + async move { // Check for disallowed HTTP methods and reject request accordently if !(method == Method::GET || method == Method::HEAD || method == Method::OPTIONS) { diff --git a/src/service.rs b/src/service.rs index 7f5aa8b..315fd16 100644 --- a/src/service.rs +++ b/src/service.rs @@ -1,12 +1,12 @@ use hyper::{service::Service, Body, Request, Response}; use std::convert::Infallible; use std::future::{ready, Future, Ready}; +use std::net::SocketAddr; use std::pin::Pin; use std::sync::Arc; use std::task::{Context, Poll}; -use crate::handler::RequestHandler; -use crate::Error; +use crate::{handler::RequestHandler, transport::Transport, Error}; /// It defines the router service which is the main entry point for Hyper Server. pub struct RouterService { @@ -21,7 +21,7 @@ impl RouterService { } } -impl Service for RouterService { +impl Service<&T> for RouterService { type Response = RequestService; type Error = Infallible; type Future = Ready>; @@ -30,14 +30,15 @@ impl Service for RouterService { Poll::Ready(Ok(())) } - fn call(&mut self, _: T) -> Self::Future { - ready(Ok(self.builder.build())) + fn call(&mut self, conn: &T) -> Self::Future { + ready(Ok(self.builder.build(conn.remote_addr()))) } } /// It defines a Hyper service request which delegates a request handler. pub struct RequestService { handler: Arc, + remote_addr: Option, } impl Service> for RequestService { @@ -51,7 +52,8 @@ impl Service> for RequestService { fn call(&mut self, mut req: Request) -> Self::Future { let handler = self.handler.clone(); - Box::pin(async move { handler.handle(&mut req).await }) + let remote_addr = self.remote_addr; + Box::pin(async move { handler.handle(&mut req, remote_addr).await }) } } @@ -67,9 +69,10 @@ impl RequestServiceBuilder { } } - pub fn build(&self) -> RequestService { + pub fn build(&self, remote_addr: Option) -> RequestService { RequestService { handler: self.handler.clone(), + remote_addr, } } } -- libgit2 1.7.2