@@ -562,10 +562,10 @@ fn disable_keep_alive_mid_request() {
562
562
563
563
let child = thread:: spawn ( move || {
564
564
let mut req = connect ( & addr) ;
565
- req. write_all ( b"GET / HTTP/1.1\r \n Connection: keep-alive \r \ n " ) . unwrap ( ) ;
565
+ req. write_all ( b"GET / HTTP/1.1\r \n " ) . unwrap ( ) ;
566
566
tx1. send ( ( ) ) . unwrap ( ) ;
567
567
rx2. wait ( ) . unwrap ( ) ;
568
- req. write_all ( b"Host: localhost\r \n Content-Length: 0 \r \ n\r \n " ) . unwrap ( ) ;
568
+ req. write_all ( b"Host: localhost\r \n \r \n " ) . unwrap ( ) ;
569
569
let mut buf = vec ! [ ] ;
570
570
req. read_to_end ( & mut buf) . unwrap ( ) ;
571
571
} ) ;
@@ -595,6 +595,62 @@ fn disable_keep_alive_mid_request() {
595
595
child. join ( ) . unwrap ( ) ;
596
596
}
597
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
+
598
654
#[ test]
599
655
fn no_proto_empty_parse_eof_does_not_return_error ( ) {
600
656
let mut core = Core :: new ( ) . unwrap ( ) ;
@@ -763,6 +819,8 @@ impl Service for TestService {
763
819
764
820
}
765
821
822
+ const HELLO : & ' static str = "hello" ;
823
+
766
824
struct HelloWorld ;
767
825
768
826
impl Service for HelloWorld {
@@ -772,7 +830,10 @@ impl Service for HelloWorld {
772
830
type Future = FutureResult < Self :: Response , Self :: Error > ;
773
831
774
832
fn call ( & self , _req : Request ) -> Self :: Future {
775
- 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)
776
837
}
777
838
}
778
839
0 commit comments