Skip to content

Commit 684f2fa

Browse files
authored
fix(http1): apply header title case for consecutive dashes (#2613)
Fix the header title-casing to work with consecutive dashes. Previously with two dashes in a row the first dash would uppercase the second dash which would then not count, so `weird--header` would be cased as `Weird--header` instead of `Weird--Header`.
1 parent 73bff4e commit 684f2fa

File tree

1 file changed

+11
-27
lines changed

1 file changed

+11
-27
lines changed

src/proto/h1/role.rs

+11-27
Original file line numberDiff line numberDiff line change
@@ -1308,36 +1308,18 @@ fn record_header_indices(
13081308
Ok(())
13091309
}
13101310

1311-
// Write header names as title case. The header name is assumed to be ASCII,
1312-
// therefore it is trivial to convert an ASCII character from lowercase to
1313-
// uppercase. It is as simple as XORing the lowercase character byte with
1314-
// space.
1311+
// Write header names as title case. The header name is assumed to be ASCII.
13151312
fn title_case(dst: &mut Vec<u8>, name: &[u8]) {
13161313
dst.reserve(name.len());
13171314

1318-
let mut iter = name.iter();
1319-
1320-
// Uppercase the first character
1321-
if let Some(c) = iter.next() {
1322-
if *c >= b'a' && *c <= b'z' {
1323-
dst.push(*c ^ b' ');
1324-
} else {
1325-
dst.push(*c);
1326-
}
1327-
}
1328-
1329-
while let Some(c) = iter.next() {
1330-
dst.push(*c);
1331-
1332-
if *c == b'-' {
1333-
if let Some(c) = iter.next() {
1334-
if *c >= b'a' && *c <= b'z' {
1335-
dst.push(*c ^ b' ');
1336-
} else {
1337-
dst.push(*c);
1338-
}
1339-
}
1315+
// Ensure first character is uppercased
1316+
let mut prev = b'-';
1317+
for &(mut c) in name {
1318+
if prev == b'-' {
1319+
c.make_ascii_uppercase();
13401320
}
1321+
dst.push(c);
1322+
prev = c;
13411323
}
13421324
}
13431325

@@ -2316,6 +2298,8 @@ mod tests {
23162298
.insert("content-length", HeaderValue::from_static("10"));
23172299
head.headers
23182300
.insert("content-type", HeaderValue::from_static("application/json"));
2301+
head.headers
2302+
.insert("weird--header", HeaderValue::from_static(""));
23192303

23202304
let mut vec = Vec::new();
23212305
Server::encode(
@@ -2331,7 +2315,7 @@ mod tests {
23312315
.unwrap();
23322316

23332317
let expected_response =
2334-
b"HTTP/1.1 200 OK\r\nContent-Length: 10\r\nContent-Type: application/json\r\n";
2318+
b"HTTP/1.1 200 OK\r\nContent-Length: 10\r\nContent-Type: application/json\r\nWeird--Header: \r\n";
23352319

23362320
assert_eq!(&vec[..expected_response.len()], &expected_response[..]);
23372321
}

0 commit comments

Comments
 (0)