@@ -37,8 +37,9 @@ pub async fn handle_https_connection(
3737 stream : TcpStream ,
3838 rule_engine : Arc < RuleEngine > ,
3939 cert_manager : Arc < CertificateManager > ,
40+ remote_addr : std:: net:: SocketAddr ,
4041) -> Result < ( ) > {
41- debug ! ( "Handling new HTTPS connection" ) ;
42+ debug ! ( "Handling new HTTPS connection from {}" , remote_addr ) ;
4243
4344 // Peek at the first few bytes to determine if this is HTTP or TLS
4445 let mut peek_buf = [ 0 ; 6 ] ;
@@ -64,18 +65,18 @@ pub async fn handle_https_connection(
6465 if peek_buf[ 0 ] == 0x16 && n > 1 && ( peek_buf[ 1 ] == 0x03 || peek_buf[ 1 ] == 0x02 ) {
6566 // This is a TLS ClientHello - we're in transparent proxy mode
6667 debug ! ( "Detected TLS ClientHello - transparent proxy mode" ) ;
67- handle_transparent_tls ( stream, rule_engine, cert_manager) . await
68+ handle_transparent_tls ( stream, rule_engine, cert_manager, remote_addr ) . await
6869 } else if peek_buf[ 0 ] >= 0x41 && peek_buf[ 0 ] <= 0x5A {
6970 // This looks like HTTP (starts with uppercase ASCII letter)
7071 // Check if it's a CONNECT request
7172 let request_str = String :: from_utf8_lossy ( & peek_buf) ;
7273 if request_str. starts_with ( "CONNEC" ) {
7374 debug ! ( "Detected CONNECT request - explicit proxy mode" ) ;
74- handle_connect_tunnel ( stream, rule_engine, cert_manager) . await
75+ handle_connect_tunnel ( stream, rule_engine, cert_manager, remote_addr ) . await
7576 } else {
7677 // Regular HTTP on HTTPS port
7778 debug ! ( "Detected plain HTTP on HTTPS port" ) ;
78- handle_plain_http ( stream, rule_engine, cert_manager) . await
79+ handle_plain_http ( stream, rule_engine, cert_manager, remote_addr ) . await
7980 }
8081 } else {
8182 warn ! (
@@ -159,6 +160,7 @@ async fn handle_transparent_tls(
159160 mut stream : TcpStream ,
160161 rule_engine : Arc < RuleEngine > ,
161162 cert_manager : Arc < CertificateManager > ,
163+ remote_addr : std:: net:: SocketAddr ,
162164) -> Result < ( ) > {
163165 debug ! ( "Handling transparent TLS connection" ) ;
164166
@@ -212,7 +214,7 @@ async fn handle_transparent_tls(
212214 let io = TokioIo :: new ( tls_stream) ;
213215 let service = service_fn ( move |req| {
214216 let host_clone = hostname. clone ( ) ;
215- handle_decrypted_https_request ( req, Arc :: clone ( & rule_engine) , host_clone)
217+ handle_decrypted_https_request ( req, Arc :: clone ( & rule_engine) , host_clone, remote_addr )
216218 } ) ;
217219
218220 debug ! ( "Starting HTTP/1.1 server for decrypted requests" ) ;
@@ -230,6 +232,7 @@ async fn handle_connect_tunnel(
230232 stream : TcpStream ,
231233 rule_engine : Arc < RuleEngine > ,
232234 cert_manager : Arc < CertificateManager > ,
235+ remote_addr : std:: net:: SocketAddr ,
233236) -> Result < ( ) > {
234237 debug ! ( "Handling CONNECT tunnel" ) ;
235238
@@ -305,8 +308,9 @@ async fn handle_connect_tunnel(
305308
306309 // Check if this host is allowed
307310 let full_url = format ! ( "https://{}" , target) ;
311+ let requester_ip = remote_addr. ip ( ) . to_string ( ) ;
308312 let evaluation = rule_engine
309- . evaluate_with_context ( Method :: GET , & full_url)
313+ . evaluate_with_context_and_ip ( Method :: GET , & full_url, & requester_ip )
310314 . await ;
311315 match evaluation. action {
312316 Action :: Allow => {
@@ -337,7 +341,7 @@ async fn handle_connect_tunnel(
337341 debug ! ( "Sent 200 Connection Established, starting TLS handshake" ) ;
338342
339343 // Now perform TLS handshake with the client
340- perform_tls_interception ( stream, rule_engine, cert_manager, host) . await
344+ perform_tls_interception ( stream, rule_engine, cert_manager, host, remote_addr ) . await
341345 }
342346 Action :: Deny => {
343347 warn ! ( "CONNECT denied to: {}" , host) ;
@@ -372,6 +376,7 @@ async fn perform_tls_interception(
372376 rule_engine : Arc < RuleEngine > ,
373377 cert_manager : Arc < CertificateManager > ,
374378 host : & str ,
379+ remote_addr : std:: net:: SocketAddr ,
375380) -> Result < ( ) > {
376381 // Get certificate for the host
377382 let ( cert_chain, key) = cert_manager
@@ -405,9 +410,10 @@ async fn perform_tls_interception(
405410 // Now handle the decrypted HTTPS requests
406411 let io = TokioIo :: new ( tls_stream) ;
407412 let host_string = host. to_string ( ) ;
413+ let remote_addr_copy = remote_addr; // Copy for the closure
408414 let service = service_fn ( move |req| {
409415 let host_clone = host_string. clone ( ) ;
410- handle_decrypted_https_request ( req, Arc :: clone ( & rule_engine) , host_clone)
416+ handle_decrypted_https_request ( req, Arc :: clone ( & rule_engine) , host_clone, remote_addr_copy )
411417 } ) ;
412418
413419 debug ! ( "Starting HTTP/1.1 server for decrypted requests" ) ;
@@ -425,12 +431,18 @@ async fn handle_plain_http(
425431 stream : TcpStream ,
426432 rule_engine : Arc < RuleEngine > ,
427433 cert_manager : Arc < CertificateManager > ,
434+ remote_addr : std:: net:: SocketAddr ,
428435) -> Result < ( ) > {
429436 debug ! ( "Handling plain HTTP on HTTPS port" ) ;
430437
431438 let io = TokioIo :: new ( stream) ;
432439 let service = service_fn ( move |req| {
433- crate :: proxy:: handle_http_request ( req, Arc :: clone ( & rule_engine) , Arc :: clone ( & cert_manager) )
440+ crate :: proxy:: handle_http_request (
441+ req,
442+ Arc :: clone ( & rule_engine) ,
443+ Arc :: clone ( & cert_manager) ,
444+ remote_addr,
445+ )
434446 } ) ;
435447
436448 http1:: Builder :: new ( )
@@ -447,6 +459,7 @@ async fn handle_decrypted_https_request(
447459 req : Request < Incoming > ,
448460 rule_engine : Arc < RuleEngine > ,
449461 host : String ,
462+ remote_addr : std:: net:: SocketAddr ,
450463) -> Result < Response < BoxBody < Bytes , HyperError > > , std:: convert:: Infallible > {
451464 let method = req. method ( ) . clone ( ) ;
452465 let uri = req. uri ( ) . clone ( ) ;
@@ -455,11 +468,15 @@ async fn handle_decrypted_https_request(
455468 let path = uri. path_and_query ( ) . map ( |pq| pq. as_str ( ) ) . unwrap_or ( "/" ) ;
456469 let full_url = format ! ( "https://{}{}" , host, path) ;
457470
458- debug ! ( "Proxying HTTPS request: {} {}" , method, full_url) ;
471+ debug ! (
472+ "Proxying HTTPS request: {} {} from {}" ,
473+ method, full_url, remote_addr
474+ ) ;
459475
460- // Evaluate rules with method
476+ // Evaluate rules with method and requester IP
477+ let requester_ip = remote_addr. ip ( ) . to_string ( ) ;
461478 let evaluation = rule_engine
462- . evaluate_with_context ( method. clone ( ) , & full_url)
479+ . evaluate_with_context_and_ip ( method. clone ( ) , & full_url, & requester_ip )
463480 . await ;
464481 match evaluation. action {
465482 Action :: Allow => {
@@ -671,8 +688,8 @@ mod tests {
671688
672689 // Spawn proxy handler
673690 tokio:: spawn ( async move {
674- let ( stream, _ ) = listener. accept ( ) . await . unwrap ( ) ;
675- let _ = handle_connect_tunnel ( stream, rule_engine, cert_manager) . await ;
691+ let ( stream, addr ) = listener. accept ( ) . await . unwrap ( ) ;
692+ let _ = handle_connect_tunnel ( stream, rule_engine, cert_manager, addr ) . await ;
676693 } ) ;
677694
678695 // Connect to proxy
@@ -706,8 +723,8 @@ mod tests {
706723
707724 // Spawn proxy handler
708725 tokio:: spawn ( async move {
709- let ( stream, _ ) = listener. accept ( ) . await . unwrap ( ) ;
710- let _ = handle_connect_tunnel ( stream, rule_engine, cert_manager) . await ;
726+ let ( stream, addr ) = listener. accept ( ) . await . unwrap ( ) ;
727+ let _ = handle_connect_tunnel ( stream, rule_engine, cert_manager, addr ) . await ;
711728 } ) ;
712729
713730 // Connect to proxy
@@ -743,8 +760,8 @@ mod tests {
743760
744761 // Spawn proxy handler
745762 tokio:: spawn ( async move {
746- let ( stream, _ ) = listener. accept ( ) . await . unwrap ( ) ;
747- let _ = handle_transparent_tls ( stream, rule_engine, cert_manager) . await ;
763+ let ( stream, addr ) = listener. accept ( ) . await . unwrap ( ) ;
764+ let _ = handle_transparent_tls ( stream, rule_engine, cert_manager, addr ) . await ;
748765 } ) ;
749766
750767 // Connect to proxy with TLS directly (transparent mode)
@@ -815,8 +832,8 @@ mod tests {
815832 let cert_manager = cert_manager. clone ( ) ;
816833 let rule_engine = rule_engine. clone ( ) ;
817834 tokio:: spawn ( async move {
818- let ( stream, _ ) = listener. accept ( ) . await . unwrap ( ) ;
819- let _ = handle_https_connection ( stream, rule_engine, cert_manager) . await ;
835+ let ( stream, addr ) = listener. accept ( ) . await . unwrap ( ) ;
836+ let _ = handle_https_connection ( stream, rule_engine, cert_manager, addr ) . await ;
820837 } ) ;
821838
822839 let mut stream = TcpStream :: connect ( addr) . await . unwrap ( ) ;
@@ -848,9 +865,9 @@ mod tests {
848865
849866 // Start proxy handler
850867 tokio:: spawn ( async move {
851- let ( stream, _ ) = listener. accept ( ) . await . unwrap ( ) ;
868+ let ( stream, addr ) = listener. accept ( ) . await . unwrap ( ) ;
852869 // Use the actual transparent TLS handler (which will extract SNI, etc.)
853- let _ = handle_transparent_tls ( stream, rule_engine, cert_manager) . await ;
870+ let _ = handle_transparent_tls ( stream, rule_engine, cert_manager, addr ) . await ;
854871 } ) ;
855872
856873 // Give the server time to start
0 commit comments