4 // Simple H2 client to test H2 download speed using h2server.rs
6 use tokio
::net
::TcpStream
;
14 impl Future
for Process
{
18 fn poll(&mut self) -> Poll
<usize, Error
> {
21 let trailers
= try_ready
!(self.body
.poll_trailers());
22 if let Some(trailers
) = trailers
{
23 println
!("trailers: {:?}", trailers
);
25 println
!("Received {} bytes", self.bytes
);
27 return Ok(Async
::Ready(self.bytes
));
29 match try_ready
!(self.body
.poll()) {
31 self.body
.release_capacity().release_capacity(chunk
.len())?
;
32 self.bytes
+= chunk
.len();
33 // println!("GOT FRAME {}", chunk.len());
44 fn send_request(mut client
: h2
::client
::SendRequest
<bytes
::Bytes
>) -> impl Future
<Item
=usize, Error
=Error
> {
46 println
!("sending request");
48 let request
= http
::Request
::builder()
49 .uri("http://localhost/")
53 let (response
, _stream
) = client
.send_request(request
, true).unwrap();
57 .and_then(|response
| {
58 Process { body: response.into_body(), trailers: false, bytes: 0 }
62 pub fn main() -> Result
<(), Error
> {
64 let tcp_stream
= TcpStream
::connect(&"127.0.0.1:8008".parse().unwrap());
66 let start
= std
::time
::SystemTime
::now();
71 h2
::client
::handshake(c
)
74 .and_then(|(client
, h2
)| {
76 // Spawn a task to run the conn...
77 tokio
::spawn(h2
.map_err(|e
| println
!("GOT ERR={:?}", e
)));
79 futures
::stream
::repeat(())
81 .and_then(move |_
| send_request(client
.clone()))
82 .fold(0, move |mut acc
, size
| {
90 println
!("ERROR {}", err
);
93 let elapsed
= start
.elapsed().unwrap();
94 let elapsed
= (elapsed
.as_secs() as f64) +
95 (elapsed
.subsec_millis() as f64)/1000.0;
97 println
!("Downloaded {} bytes, {} MB/s", bytes
, (bytes
as f64)/(elapsed
*1024.0*1024.0));