diff --git a/src/frame/headers.rs b/src/frame/headers.rs index d30374e..6ed8f10 100644 --- a/src/frame/headers.rs +++ b/src/frame/headers.rs @@ -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() { diff --git a/tests/h2-support/src/assert.rs b/tests/h2-support/src/assert.rs index 2a4159a..57c6eb1 100644 --- a/tests/h2-support/src/assert.rs +++ b/tests/h2-support/src/assert.rs @@ -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), } }} } diff --git a/tests/h2-tests/tests/codec_read.rs b/tests/h2-tests/tests/codec_read.rs index ff97c30..c060580 100644 --- a/tests/h2-tests/tests/codec_read.rs +++ b/tests/h2-tests/tests/codec_read.rs @@ -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);