@@ -600,10 +600,29 @@ impl Http1Transaction for Client {
600
600
. take ( )
601
601
. unwrap_or_else ( HeaderMap :: new) ;
602
602
603
+ let mut keep_alive = version == Version :: HTTP_11 ;
604
+
603
605
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 ) ) ;
605
609
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
+ }
607
626
608
627
let head = MessageHead {
609
628
version,
@@ -907,14 +926,6 @@ fn record_header_indices(bytes: &[u8], headers: &[httparse::Header], indices: &m
907
926
}
908
927
}
909
928
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
-
918
929
// Write header names as title case. The header name is assumed to be ASCII,
919
930
// therefore it is trivial to convert an ASCII character from lowercase to
920
931
// uppercase. It is as simple as XORing the lowercase character byte with
@@ -1319,6 +1330,33 @@ mod tests {
1319
1330
transfer-encoding: chunked\r \n \
1320
1331
\r \n \
1321
1332
") ;
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" ) ;
1322
1360
}
1323
1361
1324
1362
#[ test]
0 commit comments