@@ -163,9 +163,20 @@ impl ProxyServer {
163163
164164 // Setup a request handler
165165 let service = service_fn ( move |mut req| {
166+ // Change the request uri to match the target service
167+ let new_uri = rewrite_uri_authority ( req. uri ( ) , & target) ;
168+ * req. uri_mut ( ) = new_uri;
169+ let headers = req. headers_mut ( ) ;
170+
171+ // Add or update the HOST header
172+ if let Ok ( host_header_value) = target. parse ( ) {
173+ headers. insert ( http:: header:: HOST , host_header_value) ;
174+ } else {
175+ error ! ( "Failed to encode host as header value: {target}" ) ;
176+ }
177+
166178 // If we have measurements, from the remote peer, add them to the request header
167179 let measurements = measurements. clone ( ) ;
168- let headers = req. headers_mut ( ) ;
169180 if let Some ( measurements) = measurements {
170181 match measurements. to_header_format ( ) {
171182 Ok ( header_value) => {
@@ -508,6 +519,29 @@ impl ProxyClient {
508519 }
509520}
510521
522+ /// Given an http request, update the host in the URI when proxying
523+ fn rewrite_uri_authority ( old_uri : & http:: Uri , new_authority : & str ) -> http:: Uri {
524+ let path_and_query = old_uri
525+ . path_and_query ( )
526+ . map ( |pq| pq. as_str ( ) )
527+ . unwrap_or ( "/" ) ;
528+
529+ let scheme = old_uri. scheme_str ( ) . unwrap_or ( "http" ) ;
530+
531+ match http:: Uri :: builder ( )
532+ . scheme ( scheme)
533+ . authority ( new_authority)
534+ . path_and_query ( path_and_query)
535+ . build ( )
536+ {
537+ Ok ( new_uri) => new_uri,
538+ Err ( err) => {
539+ tracing:: error!( "Failed to build URI - falling back to old one: {err}" ) ;
540+ old_uri. clone ( )
541+ }
542+ }
543+ }
544+
511545/// An error when running a proxy client or server
512546#[ derive( Error , Debug ) ]
513547pub enum ProxyError {
0 commit comments