Fix push promise frame parsing (#309)

This commit is contained in:
Michael Beaumont
2018-09-17 23:55:37 +02:00
committed by Sean McArthur
parent 2b960b897d
commit 586106adf2
3 changed files with 30 additions and 10 deletions

View File

@@ -312,7 +312,7 @@ impl PushPromise {
let (promised_id, _) = StreamId::parse(&src[..4]);
// Drop promised_id bytes
let _ = src.split_to(5);
let _ = src.split_to(4);
if pad > 0 {
if pad > src.len() {

View File

@@ -57,14 +57,14 @@ macro_rules! poll_err {
}
#[macro_export]
macro_rules! poll_data {
($transport:expr) => {{
macro_rules! poll_frame {
($type: ident, $transport:expr) => {{
use h2::frame::Frame;
use futures::Async;
match $transport.poll() {
Ok(Async::Ready(Some(Frame::Data(frame)))) => frame,
frame => panic!("expected data frame; actual={:?}", frame),
Ok(Async::Ready(Some(Frame::$type(frame)))) => frame,
frame => panic!("unexpected frame; actual={:?}", frame),
}
}}
}

View File

@@ -27,7 +27,7 @@ fn read_data_no_padding() {
];
};
let data = poll_data!(codec);
let data = poll_frame!(Data, codec);
assert_eq!(data.stream_id(), 1);
assert_eq!(data.payload(), &b"hello"[..]);
assert!(!data.is_end_stream());
@@ -43,7 +43,7 @@ fn read_data_empty_payload() {
];
};
let data = poll_data!(codec);
let data = poll_frame!(Data, codec);
assert_eq!(data.stream_id(), 1);
assert_eq!(data.payload(), &b""[..]);
assert!(!data.is_end_stream());
@@ -60,7 +60,7 @@ fn read_data_end_stream() {
];
};
let data = poll_data!(codec);
let data = poll_frame!(Data, codec);
assert_eq!(data.stream_id(), 1);
assert_eq!(data.payload(), &b"hello"[..]);
assert!(data.is_end_stream());
@@ -79,7 +79,7 @@ fn read_data_padding() {
];
};
let data = poll_data!(codec);
let data = poll_frame!(Data, codec);
assert_eq!(data.stream_id(), 1);
assert_eq!(data.payload(), &b"hello"[..]);
assert!(!data.is_end_stream());
@@ -87,6 +87,26 @@ fn read_data_padding() {
assert_closed!(codec);
}
#[test]
fn read_push_promise() {
let mut codec = raw_codec! {
read => [
0, 0, 0x5,
0x5, 0x4,
0, 0, 0, 0x1, // stream id
0, 0, 0, 0x2, // promised id
0x82, // HPACK :method="GET"
];
};
let pp = poll_frame!(PushPromise, codec);
assert_eq!(pp.stream_id(), 1);
assert_eq!(pp.promised_id(), 2);
assert_eq!(pp.into_parts().0.method, Some(Method::GET));
assert_closed!(codec);
}
#[test]
fn read_data_stream_id_zero() {
let mut codec = raw_codec! {
@@ -182,7 +202,7 @@ fn update_max_frame_len_at_rest() {
];
};
assert_eq!(poll_data!(codec).payload(), &b"hello"[..]);
assert_eq!(poll_frame!(Data, codec).payload(), &b"hello"[..]);
codec.set_max_recv_frame_size(16_384);