@@ -8,14 +8,13 @@ extern crate tokio_core;
8
8
9
9
use std:: net:: SocketAddr ;
10
10
11
- use futures:: { future , Future , Stream } ;
11
+ use futures:: { Future , Stream } ;
12
12
use tokio_core:: reactor:: { Core , Handle } ;
13
13
use tokio_core:: net:: TcpListener ;
14
14
15
15
use hyper:: client;
16
16
use hyper:: header:: { ContentLength , ContentType } ;
17
17
use hyper:: Method ;
18
- use hyper:: server:: { self , Service } ;
19
18
20
19
21
20
#[ bench]
@@ -42,13 +41,15 @@ fn get_one_at_a_time(b: &mut test::Bencher) {
42
41
43
42
#[ bench]
44
43
fn post_one_at_a_time ( b : & mut test:: Bencher ) {
44
+ extern crate pretty_env_logger;
45
+ let _ = pretty_env_logger:: try_init ( ) ;
45
46
let mut core = Core :: new ( ) . unwrap ( ) ;
46
47
let handle = core. handle ( ) ;
47
48
let addr = spawn_hello ( & handle) ;
48
49
49
50
let client = hyper:: Client :: new ( & handle) ;
50
51
51
- let url: hyper:: Uri = format ! ( "http://{}/get " , addr) . parse ( ) . unwrap ( ) ;
52
+ let url: hyper:: Uri = format ! ( "http://{}/post " , addr) . parse ( ) . unwrap ( ) ;
52
53
53
54
let post = "foo bar baz quux" ;
54
55
b. bytes = 180 * 2 + post. len ( ) as u64 + PHRASE . len ( ) as u64 ;
@@ -69,35 +70,32 @@ fn post_one_at_a_time(b: &mut test::Bencher) {
69
70
70
71
static PHRASE : & ' static [ u8 ] = include_bytes ! ( "../CHANGELOG.md" ) ; //b"Hello, World!";
71
72
72
- #[ derive( Clone , Copy ) ]
73
- struct Hello ;
74
-
75
- impl Service for Hello {
76
- type Request = server:: Request ;
77
- type Response = server:: Response ;
78
- type Error = hyper:: Error ;
79
- type Future = future:: FutureResult < Self :: Response , hyper:: Error > ;
80
- fn call ( & self , _req : Self :: Request ) -> Self :: Future {
81
- future:: ok (
82
- server:: Response :: new ( )
83
- . with_header ( ContentLength ( PHRASE . len ( ) as u64 ) )
84
- . with_header ( ContentType :: plaintext ( ) )
85
- . with_body ( PHRASE )
86
- )
87
- }
88
-
89
- }
90
-
91
73
fn spawn_hello ( handle : & Handle ) -> SocketAddr {
74
+ use hyper:: server:: { const_service, service_fn, NewService , Request , Response } ;
92
75
let addr = "127.0.0.1:0" . parse ( ) . unwrap ( ) ;
93
76
let listener = TcpListener :: bind ( & addr, handle) . unwrap ( ) ;
94
77
let addr = listener. local_addr ( ) . unwrap ( ) ;
95
78
96
79
let handle2 = handle. clone ( ) ;
97
80
let http = hyper:: server:: Http :: < hyper:: Chunk > :: new ( ) ;
81
+
82
+ let service = const_service ( service_fn ( |req : Request | {
83
+ req. body ( )
84
+ . concat2 ( )
85
+ . map ( |_| {
86
+ Response :: < hyper:: Body > :: new ( )
87
+ . with_header ( ContentLength ( PHRASE . len ( ) as u64 ) )
88
+ . with_header ( ContentType :: plaintext ( ) )
89
+ . with_body ( PHRASE )
90
+ } )
91
+ } ) ) ;
92
+
93
+ let mut conns = 0 ;
98
94
handle. spawn ( listener. incoming ( ) . for_each ( move |( socket, _addr) | {
95
+ conns += 1 ;
96
+ assert_eq ! ( conns, 1 , "should only need 1 connection" ) ;
99
97
handle2. spawn (
100
- http. serve_connection ( socket, Hello )
98
+ http. serve_connection ( socket, service . new_service ( ) ? )
101
99
. map ( |_| ( ) )
102
100
. map_err ( |_| ( ) )
103
101
) ;
0 commit comments