Skip to content

Commit 9f50e6c

Browse files
eaufavorandrewhavck
authored andcommitted
Handle bare IPv6 address in raw connect Host
1 parent 29746f6 commit 9f50e6c

File tree

2 files changed

+20
-3
lines changed

2 files changed

+20
-3
lines changed

.bleep

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
c90e4ce2596840c60b5ff1737e2141447e5953e1
1+
d04fc15ccce78032d84491744e29641f3e577347

pingora-core/src/protocols/raw_connect.rs

+19-2
Original file line numberDiff line numberDiff line change
@@ -68,9 +68,13 @@ where
6868
H: Iterator<Item = (S, &'a Vec<u8>)>,
6969
{
7070
// TODO: valid that host doesn't have port
71-
// TODO: support adding ad-hoc headers
7271

73-
let authority = format!("{host}:{port}");
72+
let authority = if host.parse::<std::net::Ipv6Addr>().is_ok() {
73+
format!("[{host}]:{port}")
74+
} else {
75+
format!("{host}:{port}")
76+
};
77+
7478
let req = http::request::Builder::new()
7579
.version(http::Version::HTTP_11)
7680
.method(http::method::Method::CONNECT)
@@ -217,6 +221,19 @@ mod test_sync {
217221
assert_eq!(req.headers.get("Host").unwrap(), "pingora.org:123");
218222
assert_eq!(req.headers.get("foo").unwrap(), "bar");
219223
}
224+
225+
#[test]
226+
fn test_generate_connect_header_ipv6() {
227+
let mut headers = BTreeMap::new();
228+
headers.insert(String::from("foo"), b"bar".to_vec());
229+
let req = generate_connect_header("::1", 123, headers.iter()).unwrap();
230+
231+
assert_eq!(req.method, http::method::Method::CONNECT);
232+
assert_eq!(req.uri.authority().unwrap(), "[::1]:123");
233+
assert_eq!(req.headers.get("Host").unwrap(), "[::1]:123");
234+
assert_eq!(req.headers.get("foo").unwrap(), "bar");
235+
}
236+
220237
#[test]
221238
fn test_request_to_wire_auth_form() {
222239
let new_request = http::Request::builder()

0 commit comments

Comments
 (0)