Skip to content

Commit d614784

Browse files
johansmitsnlctron
authored andcommitted
Report invalid header names on start
1 parent 83522d5 commit d614784

File tree

3 files changed

+22
-13
lines changed

3 files changed

+22
-13
lines changed

src/proxy.rs

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,15 @@ use axum::{
66
ws::{Message as MsgAxm, WebSocket, WebSocketUpgrade},
77
Request, State,
88
},
9-
http::{HeaderName, Response, Uri},
9+
http::{Response, Uri},
1010
routing::{any, get, Router},
1111
RequestExt,
1212
};
1313
use bytes::BytesMut;
1414
use futures_util::{sink::SinkExt, stream::StreamExt, TryStreamExt};
1515
use hyper::{header::HOST, HeaderMap};
1616
use reqwest::header::HeaderValue;
17-
use std::{collections::HashMap, str::FromStr, sync::Arc};
17+
use std::sync::Arc;
1818
use tokio_tungstenite::{
1919
connect_async,
2020
tungstenite::{protocol::CloseFrame, Message as MsgTng},
@@ -35,7 +35,7 @@ pub(crate) struct ProxyHandlerHttp {
3535
/// The URL of the backend to which requests are to be proxied.
3636
backend: Uri,
3737
/// The headers to inject with the request
38-
request_headers: HashMap<String, String>,
38+
request_headers: HeaderMap,
3939
/// An optional rewrite path to be used as the listening URI prefix, but which will be
4040
/// stripped before being sent to the proxy backend.
4141
rewrite: Option<String>,
@@ -107,7 +107,7 @@ impl ProxyHandlerHttp {
107107
pub fn new(
108108
client: reqwest::Client,
109109
backend: Uri,
110-
request_headers: HashMap<String, String>,
110+
request_headers: HeaderMap,
111111
rewrite: Option<String>,
112112
) -> Arc<Self> {
113113
Arc::new(Self {
@@ -146,12 +146,9 @@ impl ProxyHandlerHttp {
146146

147147
let mut headers = req.headers().clone();
148148
for (header_name, header_value) in state.request_headers.clone() {
149-
headers.insert(
150-
HeaderName::from_str(&header_name).context("Error building the header key")?,
151-
header_value
152-
.parse()
153-
.context("Error building the header value")?,
154-
);
149+
if let Some(name) = header_name {
150+
headers.insert(name, header_value);
151+
}
155152
}
156153

157154
let mut outbound_req = state

src/serve/mod.rs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ use axum::response::{IntoResponse, Response};
1616
use axum::routing::{get, get_service, Router};
1717
use axum_server::Handle;
1818
use futures_util::FutureExt;
19+
use hyper::HeaderMap;
1920
use proxy::{ProxyBuilder, ProxyClientOptions};
2021
use std::collections::{BTreeSet, HashMap};
2122
use std::net::{IpAddr, Ipv4Addr, SocketAddr};
@@ -364,10 +365,20 @@ fn router(state: Arc<State>, cfg: Arc<RtcServe>) -> Result<Router> {
364365
// Build proxies
365366

366367
for proxy in &cfg.proxies {
368+
let mut request_headers = HeaderMap::new();
369+
for (key, value) in &proxy.request_headers {
370+
let name = HeaderName::from_bytes(key.as_bytes())
371+
.with_context(|| format!("invalid header {:?}", key))?;
372+
let value: HeaderValue = value
373+
.parse()
374+
.with_context(|| format!("invalid header value {:?} for header {}", value, name))?;
375+
request_headers.insert(name, value);
376+
}
377+
367378
builder = builder.register_proxy(
368379
proxy.ws,
369380
&proxy.backend,
370-
&proxy.request_headers,
381+
&request_headers,
371382
proxy.rewrite.clone(),
372383
ProxyClientOptions {
373384
insecure: proxy.insecure,

src/serve/proxy.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use anyhow::Context;
44
use axum::http::Uri;
55
use axum::Router;
66
use console::Emoji;
7+
use hyper::HeaderMap;
78
use reqwest::Client;
89
use std::collections::hash_map::Entry;
910
use std::collections::HashMap;
@@ -30,7 +31,7 @@ impl ProxyBuilder {
3031
mut self,
3132
ws: bool,
3233
backend: &Uri,
33-
request_headers: &HashMap<String, String>,
34+
request_headers: &HeaderMap,
3435
rewrite: Option<String>,
3536
opts: ProxyClientOptions,
3637
) -> anyhow::Result<Self> {
@@ -57,7 +58,7 @@ impl ProxyBuilder {
5758
&backend,
5859
&request_headers
5960
.iter()
60-
.map(|(header_name, header_value)| format!("{header_name}={header_value}"))
61+
.map(|(header_name, header_value)| format!("{header_name}={header_value:?}"))
6162
.collect::<Vec<String>>()
6263
.join(";"),
6364
if no_sys_proxy {

0 commit comments

Comments
 (0)