@@ -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