add set_target_window_size methods to Server and Client (#149)

Closes #101
This commit is contained in:
Sean McArthur
2017-10-13 11:19:56 -07:00
committed by GitHub
parent 2fcf8c3740
commit 5c1bde7d62
10 changed files with 347 additions and 33 deletions

View File

@@ -800,3 +800,132 @@ fn recv_settings_removes_available_capacity() {
let _ = h2.join(srv)
.wait().unwrap();
}
#[test]
fn client_increase_target_window_size() {
let _ = ::env_logger::init();
let (io, srv) = mock::new();
let srv = srv.assert_client_handshake()
.unwrap()
.recv_settings()
.recv_frame(frames::window_update(0, (2 << 20) - 65_535))
.close();
let client = Client::handshake(io).unwrap()
.and_then(|(_client, mut conn)| {
conn.set_target_window_size(2 << 20);
conn.unwrap()
});
srv.join(client).wait().unwrap();
}
#[test]
fn increase_target_window_size_after_using_some() {
let _ = ::env_logger::init();
let (io, srv) = mock::new();
let srv = srv.assert_client_handshake()
.unwrap()
.recv_settings()
.recv_frame(
frames::headers(1)
.request("GET", "https://http2.akamai.com/")
.eos()
)
.send_frame(frames::headers(1).response(200))
.send_frame(frames::data(1, vec![0; 16_384]).eos())
.recv_frame(frames::window_update(0, (2 << 20) - 65_535))
.close();
let client = Client::handshake(io).unwrap()
.and_then(|(mut client, conn)| {
let request = Request::builder()
.uri("https://http2.akamai.com/")
.body(()).unwrap();
let res = client.send_request(request, true).unwrap()
.and_then(|res| {
// "leak" the capacity for now
res.into_parts().1.concat2()
});
conn.drive(res)
.and_then(|(mut conn, _bytes)| {
conn.set_target_window_size(2 << 20);
conn.unwrap()
})
});
srv.join(client).wait().unwrap();
}
#[test]
fn decrease_target_window_size() {
let _ = ::env_logger::init();
let (io, srv) = mock::new();
let srv = srv.assert_client_handshake()
.unwrap()
.recv_settings()
.recv_frame(
frames::headers(1)
.request("GET", "https://http2.akamai.com/")
.eos()
)
.send_frame(frames::headers(1).response(200))
.send_frame(frames::data(1, vec![0; 16_384]))
.send_frame(frames::data(1, vec![0; 16_384]))
.send_frame(frames::data(1, vec![0; 16_384]))
.send_frame(frames::data(1, vec![0; 16_383]).eos())
.recv_frame(frames::window_update(0, 16_384))
.close();
let client = Client::handshake(io).unwrap()
.and_then(|(mut client, mut conn)| {
conn.set_target_window_size(16_384 * 2);
let request = Request::builder()
.uri("https://http2.akamai.com/")
.body(()).unwrap();
let res = client.send_request(request, true).unwrap();
conn.drive(res.expect("response"))
})
.and_then(|(mut conn, res)| {
conn.set_target_window_size(16_384);
let mut body = res.into_parts().1;
let mut cap = body.release_capacity().clone();
conn.drive(body.concat2().expect("concat"))
.and_then(move |(conn, bytes)| {
assert_eq!(bytes.len(), 65_535);
cap.release_capacity(bytes.len()).unwrap();
conn.expect("conn")
})
});
srv.join(client).wait().unwrap();
}
#[test]
fn server_target_window_size() {
let _ = ::env_logger::init();
let (io, client) = mock::new();
let client = client.assert_server_handshake()
.unwrap()
.recv_settings()
.recv_frame(frames::window_update(0, (2 << 20) - 65_535))
.close();
let srv = Server::handshake(io).unwrap()
.and_then(|mut conn| {
conn.set_target_window_size(2 << 20);
conn.into_future().unwrap()
});
srv.join(client).wait().unwrap();
}

View File

@@ -538,7 +538,7 @@ impl Future for Idle {
match self.handle.as_mut().unwrap().poll() {
Ok(Async::NotReady) => Ok(Async::NotReady),
res => {
panic!("Received unexpected frame on handle; frame={:?}", res);
panic!("Idle received unexpected frame on handle; frame={:?}", res);
},
}
}