@@ -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,106 @@ 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 " ) . unwrap ( ) ;
566
+ tx1. send ( ( ) ) . unwrap ( ) ;
567
+ rx2. wait ( ) . unwrap ( ) ;
568
+ req. write_all ( b"Host: localhost\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
+
598
+ #[ test]
599
+ fn disable_keep_alive_post_request ( ) {
600
+ let mut core = Core :: new ( ) . unwrap ( ) ;
601
+ let listener = TcpListener :: bind ( & "127.0.0.1:0" . parse ( ) . unwrap ( ) , & core. handle ( ) ) . unwrap ( ) ;
602
+ let addr = listener. local_addr ( ) . unwrap ( ) ;
603
+
604
+ let ( tx1, rx1) = oneshot:: channel ( ) ;
605
+
606
+ let child = thread:: spawn ( move || {
607
+ let mut req = connect ( & addr) ;
608
+ req. write_all ( b"\
609
+ GET / HTTP/1.1\r \n \
610
+ Host: localhost\r \n \
611
+ \r \n \
612
+ ") . unwrap ( ) ;
613
+
614
+ let mut buf = [ 0 ; 1024 * 8 ] ;
615
+ loop {
616
+ let n = req. read ( & mut buf) . expect ( "reading 1" ) ;
617
+ if n < buf. len ( ) {
618
+ if & buf[ n - HELLO . len ( ) ..n] == HELLO . as_bytes ( ) {
619
+ break ;
620
+ }
621
+ }
622
+ }
623
+
624
+ tx1. send ( ( ) ) . unwrap ( ) ;
625
+
626
+ let nread = req. read ( & mut buf) . unwrap ( ) ;
627
+ assert_eq ! ( nread, 0 ) ;
628
+ } ) ;
629
+
630
+ let fut = listener. incoming ( )
631
+ . into_future ( )
632
+ . map_err ( |_| unreachable ! ( ) )
633
+ . and_then ( |( item, _incoming) | {
634
+ let ( socket, _) = item. unwrap ( ) ;
635
+ Http :: < hyper:: Chunk > :: new ( ) . serve_connection ( socket, HelloWorld )
636
+ . select2 ( rx1)
637
+ . then ( |r| {
638
+ match r {
639
+ Ok ( Either :: A ( _) ) => panic ! ( "expected rx first" ) ,
640
+ Ok ( Either :: B ( ( ( ) , mut conn) ) ) => {
641
+ conn. disable_keep_alive ( ) ;
642
+ conn
643
+ }
644
+ Err ( Either :: A ( ( e, _) ) ) => panic ! ( "unexpected error {}" , e) ,
645
+ Err ( Either :: B ( ( e, _) ) ) => panic ! ( "unexpected error {}" , e) ,
646
+ }
647
+ } )
648
+ } ) ;
649
+
650
+ core. run ( fut) . unwrap ( ) ;
651
+ child. join ( ) . unwrap ( ) ;
652
+ }
653
+
554
654
#[ test]
555
655
fn no_proto_empty_parse_eof_does_not_return_error ( ) {
556
656
let mut core = Core :: new ( ) . unwrap ( ) ;
@@ -719,6 +819,8 @@ impl Service for TestService {
719
819
720
820
}
721
821
822
+ const HELLO : & ' static str = "hello" ;
823
+
722
824
struct HelloWorld ;
723
825
724
826
impl Service for HelloWorld {
@@ -728,7 +830,10 @@ impl Service for HelloWorld {
728
830
type Future = FutureResult < Self :: Response , Self :: Error > ;
729
831
730
832
fn call ( & self , _req : Request ) -> Self :: Future {
731
- future:: ok ( Response :: new ( ) )
833
+ let mut response = Response :: new ( ) ;
834
+ response. headers_mut ( ) . set ( hyper:: header:: ContentLength ( HELLO . len ( ) as u64 ) ) ;
835
+ response. set_body ( HELLO ) ;
836
+ future:: ok ( response)
732
837
}
733
838
}
734
839
0 commit comments