@@ -6,7 +6,7 @@ extern crate pretty_env_logger;
6
6
extern crate tokio_core;
7
7
8
8
use futures:: { Future , Stream } ;
9
- use futures:: future:: { self , FutureResult } ;
9
+ use futures:: future:: { self , FutureResult , Either } ;
10
10
use futures:: sync:: oneshot;
11
11
12
12
use tokio_core:: net:: TcpListener ;
@@ -551,6 +551,50 @@ fn pipeline_enabled() {
551
551
assert_eq ! ( n, 0 ) ;
552
552
}
553
553
554
+ #[ test]
555
+ fn disable_keep_alive_mid_request ( ) {
556
+ let mut core = Core :: new ( ) . unwrap ( ) ;
557
+ let listener = TcpListener :: bind ( & "127.0.0.1:0" . parse ( ) . unwrap ( ) , & core. handle ( ) ) . unwrap ( ) ;
558
+ let addr = listener. local_addr ( ) . unwrap ( ) ;
559
+
560
+ let ( tx1, rx1) = oneshot:: channel ( ) ;
561
+ let ( tx2, rx2) = oneshot:: channel ( ) ;
562
+
563
+ let child = thread:: spawn ( move || {
564
+ let mut req = connect ( & addr) ;
565
+ req. write_all ( b"GET / HTTP/1.1\r \n Connection: keep-alive\r \n " ) . unwrap ( ) ;
566
+ tx1. send ( ( ) ) . unwrap ( ) ;
567
+ rx2. wait ( ) . unwrap ( ) ;
568
+ req. write_all ( b"Host: localhost\r \n Content-Length: 0\r \n \r \n " ) . unwrap ( ) ;
569
+ let mut buf = vec ! [ ] ;
570
+ req. read_to_end ( & mut buf) . unwrap ( ) ;
571
+ } ) ;
572
+
573
+ let fut = listener. incoming ( )
574
+ . into_future ( )
575
+ . map_err ( |_| unreachable ! ( ) )
576
+ . and_then ( |( item, _incoming) | {
577
+ let ( socket, _) = item. unwrap ( ) ;
578
+ Http :: < hyper:: Chunk > :: new ( ) . serve_connection ( socket, HelloWorld )
579
+ . select2 ( rx1)
580
+ . then ( |r| {
581
+ match r {
582
+ Ok ( Either :: A ( _) ) => panic ! ( "expected rx first" ) ,
583
+ Ok ( Either :: B ( ( ( ) , mut conn) ) ) => {
584
+ conn. disable_keep_alive ( ) ;
585
+ tx2. send ( ( ) ) . unwrap ( ) ;
586
+ conn
587
+ }
588
+ Err ( Either :: A ( ( e, _) ) ) => panic ! ( "unexpected error {}" , e) ,
589
+ Err ( Either :: B ( ( e, _) ) ) => panic ! ( "unexpected error {}" , e) ,
590
+ }
591
+ } )
592
+ } ) ;
593
+
594
+ core. run ( fut) . unwrap ( ) ;
595
+ child. join ( ) . unwrap ( ) ;
596
+ }
597
+
554
598
#[ test]
555
599
fn no_proto_empty_parse_eof_does_not_return_error ( ) {
556
600
let mut core = Core :: new ( ) . unwrap ( ) ;
0 commit comments