Skip to content

Commit c03c39e

Browse files
committed
fix(client): fix keep-alive header detection when parsing responses
1 parent e7c7f2d commit c03c39e

File tree

1 file changed

+48
-10
lines changed

1 file changed

+48
-10
lines changed

src/proto/h1/role.rs

Lines changed: 48 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -600,10 +600,29 @@ impl Http1Transaction for Client {
600600
.take()
601601
.unwrap_or_else(HeaderMap::new);
602602

603+
let mut keep_alive = version == Version::HTTP_11;
604+
603605
headers.reserve(headers_len);
604-
fill_headers(&mut headers, slice, &headers_indices[..headers_len]);
606+
for header in &headers_indices[..headers_len] {
607+
let name = header_name!(&slice[header.name.0..header.name.1]);
608+
let value = header_value!(slice.slice(header.value.0, header.value.1));
605609

606-
let keep_alive = version == Version::HTTP_11;
610+
match name {
611+
header::CONNECTION => {
612+
// keep_alive was previously set to default for Version
613+
if keep_alive {
614+
// HTTP/1.1
615+
keep_alive = !headers::connection_close(&value);
616+
617+
} else {
618+
// HTTP/1.0
619+
keep_alive = headers::connection_keep_alive(&value);
620+
}
621+
},
622+
_ => (),
623+
}
624+
headers.append(name, value);
625+
}
607626

608627
let head = MessageHead {
609628
version,
@@ -907,14 +926,6 @@ fn record_header_indices(bytes: &[u8], headers: &[httparse::Header], indices: &m
907926
}
908927
}
909928

910-
fn fill_headers(headers: &mut HeaderMap, slice: Bytes, indices: &[HeaderIndices]) {
911-
for header in indices {
912-
let name = header_name!(&slice[header.name.0..header.name.1]);
913-
let value = header_value!(slice.slice(header.value.0, header.value.1));
914-
headers.append(name, value);
915-
}
916-
}
917-
918929
// Write header names as title case. The header name is assumed to be ASCII,
919930
// therefore it is trivial to convert an ASCII character from lowercase to
920931
// uppercase. It is as simple as XORing the lowercase character byte with
@@ -1319,6 +1330,33 @@ mod tests {
13191330
transfer-encoding: chunked\r\n\
13201331
\r\n\
13211332
");
1333+
1334+
// keep-alive
1335+
assert!(parse("\
1336+
HTTP/1.1 200 OK\r\n\
1337+
content-length: 0\r\n\
1338+
\r\n\
1339+
").keep_alive, "HTTP/1.1 keep-alive is default");
1340+
1341+
assert!(!parse("\
1342+
HTTP/1.1 200 OK\r\n\
1343+
content-length: 0\r\n\
1344+
connection: foo, close, bar\r\n\
1345+
\r\n\
1346+
").keep_alive, "connection close is always close");
1347+
1348+
assert!(!parse("\
1349+
HTTP/1.0 200 OK\r\n\
1350+
content-length: 0\r\n\
1351+
\r\n\
1352+
").keep_alive, "HTTP/1.0 close is default");
1353+
1354+
assert!(parse("\
1355+
HTTP/1.0 200 OK\r\n\
1356+
content-length: 0\r\n\
1357+
connection: foo, keep-alive, bar\r\n\
1358+
\r\n\
1359+
").keep_alive, "connection keep-alive is always keep-alive");
13221360
}
13231361

13241362
#[test]

0 commit comments

Comments
 (0)