Skip to content

Commit 5610123

Browse files
committed
Fix URI in request headers to match target service
1 parent 89c9d23 commit 5610123

File tree

1 file changed

+35
-1
lines changed

1 file changed

+35
-1
lines changed

src/lib.rs

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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)]
513547
pub enum ProxyError {

0 commit comments

Comments
 (0)