mirror of
https://github.com/DefectingCat/candy
synced 2025-07-15 16:51:34 +00:00
fix(reverse_proxy): exclude http headers
This commit is contained in:
@ -4,7 +4,7 @@ use axum::{
|
|||||||
response::{IntoResponse, Response},
|
response::{IntoResponse, Response},
|
||||||
};
|
};
|
||||||
use axum_extra::extract::Host;
|
use axum_extra::extract::Host;
|
||||||
use http::Uri;
|
use http::{HeaderName, Uri};
|
||||||
use reqwest::Client;
|
use reqwest::Client;
|
||||||
|
|
||||||
use crate::utils::parse_port_from_host;
|
use crate::utils::parse_port_from_host;
|
||||||
@ -76,17 +76,57 @@ pub async fn serve(
|
|||||||
*req.uri_mut() = Uri::try_from(uri.clone()).map_err(|_| RouteError::InternalError())?;
|
*req.uri_mut() = Uri::try_from(uri.clone()).map_err(|_| RouteError::InternalError())?;
|
||||||
|
|
||||||
let client = Client::new();
|
let client = Client::new();
|
||||||
let reqwest_response = client.get(uri).send().await.map_err(|e| {
|
let mut forward_req = client.request(req.method().clone(), uri);
|
||||||
|
// let reqwest_response = client.get(uri).send().await.map_err(|e| {
|
||||||
|
// tracing::error!("Failed to proxy request: {}", e);
|
||||||
|
// RouteError::BadRequest()
|
||||||
|
// })?;
|
||||||
|
for (name, value) in req.headers().iter() {
|
||||||
|
if !is_exclude_header(name) {
|
||||||
|
forward_req = forward_req.header(name.clone(), value.clone());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let reqwest_response = forward_req.send().await.map_err(|e| {
|
||||||
tracing::error!("Failed to proxy request: {}", e);
|
tracing::error!("Failed to proxy request: {}", e);
|
||||||
RouteError::BadRequest()
|
RouteError::BadRequest()
|
||||||
})?;
|
})?;
|
||||||
|
|
||||||
let mut response_builder = Response::builder().status(reqwest_response.status());
|
let mut response_builder = Response::builder().status(reqwest_response.status());
|
||||||
*response_builder.headers_mut().unwrap() = reqwest_response.headers().clone();
|
copy_headers(
|
||||||
|
reqwest_response.headers(),
|
||||||
|
response_builder
|
||||||
|
.headers_mut()
|
||||||
|
.ok_or(RouteError::InternalError())?,
|
||||||
|
);
|
||||||
let res = response_builder
|
let res = response_builder
|
||||||
.body(Body::from_stream(reqwest_response.bytes_stream()))
|
.body(Body::from_stream(reqwest_response.bytes_stream()))
|
||||||
// This unwrap is fine because the body is empty here
|
.map_err(|e| {
|
||||||
.unwrap();
|
tracing::error!("Failed to proxy request: {}", e);
|
||||||
|
RouteError::BadRequest()
|
||||||
|
})?;
|
||||||
|
|
||||||
Ok(res)
|
Ok(res)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn is_exclude_header(name: &HeaderName) -> bool {
|
||||||
|
matches!(
|
||||||
|
name.as_str(),
|
||||||
|
"host"
|
||||||
|
| "connection"
|
||||||
|
| "proxy-authenticate"
|
||||||
|
| "upgrade"
|
||||||
|
| "proxy-authorization"
|
||||||
|
| "keep-alive"
|
||||||
|
| "transfer-encoding"
|
||||||
|
| "te"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn copy_headers(from: &http::HeaderMap, to: &mut http::HeaderMap) {
|
||||||
|
for (name, value) in from.iter() {
|
||||||
|
if !is_exclude_header(name) {
|
||||||
|
to.append(name.clone(), value.clone());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user