Insert header that is missing from traefik
All checks were successful
Build and deploy / Build container and manifests (push) Successful in 6m16s

This commit is contained in:
Dreaded_X 2025-04-15 02:33:48 +02:00
parent b9f6824fc9
commit a4de19972d
Signed by: Dreaded_X
GPG Key ID: FA5F485356B0D2D4
2 changed files with 10 additions and 3 deletions

View File

@ -1,5 +1,5 @@
use hyper::{ use hyper::{
HeaderMap, StatusCode, HeaderMap, Method, StatusCode,
header::{self, HeaderName, HeaderValue, ToStrError}, header::{self, HeaderName, HeaderValue, ToStrError},
}; };
use reqwest::redirect::Policy; use reqwest::redirect::Policy;
@ -30,6 +30,7 @@ pub enum AuthStatus {
} }
const REMOTE_USER: HeaderName = HeaderName::from_static("remote-user"); const REMOTE_USER: HeaderName = HeaderName::from_static("remote-user");
const X_FORWARDED_METHOD: HeaderName = HeaderName::from_static("x-forwarded-method");
#[derive(Debug, thiserror::Error)] #[derive(Debug, thiserror::Error)]
pub enum AuthError { pub enum AuthError {
@ -54,13 +55,14 @@ impl ForwardAuth {
pub async fn check_auth( pub async fn check_auth(
&self, &self,
methods: &Method,
headers: &HeaderMap<HeaderValue>, headers: &HeaderMap<HeaderValue>,
) -> Result<AuthStatus, AuthError> { ) -> Result<AuthStatus, AuthError> {
let client = reqwest::ClientBuilder::new() let client = reqwest::ClientBuilder::new()
.redirect(Policy::none()) .redirect(Policy::none())
.build()?; .build()?;
let headers = headers let mut headers: HeaderMap = headers
.clone() .clone()
.into_iter() .into_iter()
.filter_map(|(key, value)| { .filter_map(|(key, value)| {
@ -75,6 +77,11 @@ impl ForwardAuth {
}) })
.collect(); .collect();
headers.insert(
X_FORWARDED_METHOD,
HeaderValue::from_str(methods.as_str()).expect("method should convert to valid ascii"),
);
let resp = client.get(&self.address).headers(headers).send().await?; let resp = client.get(&self.address).headers(headers).send().await?;
let status_code = resp.status(); let status_code = resp.status();

View File

@ -215,7 +215,7 @@ impl Service<Request<Incoming>> for Tunnels {
}; };
if !matches!(tunnel.access.read().await.deref(), TunnelAccess::Public) { if !matches!(tunnel.access.read().await.deref(), TunnelAccess::Public) {
let user = match s.forward_auth.check_auth(req.headers()).await { let user = match s.forward_auth.check_auth(req.method(), req.headers()).await {
Ok(AuthStatus::Authenticated(user)) => user, Ok(AuthStatus::Authenticated(user)) => user,
Ok(AuthStatus::Unauthenticated(location)) => { Ok(AuthStatus::Unauthenticated(location)) => {
let resp = Response::builder() let resp = Response::builder()