From 6d1d54f104e484288e60dbedc98b247384e5e489 Mon Sep 17 00:00:00 2001 From: Carl Lerche Date: Sat, 8 Jul 2017 22:36:24 -0700 Subject: [PATCH] Stub out window update --- src/frame/mod.rs | 2 ++ src/frame/window_update.rs | 28 ++++++++++++++++++++++++++++ src/proto/framed_read.rs | 7 ++++++- 3 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 src/frame/window_update.rs diff --git a/src/frame/mod.rs b/src/frame/mod.rs index ba95bdd..36f85d4 100644 --- a/src/frame/mod.rs +++ b/src/frame/mod.rs @@ -34,6 +34,7 @@ mod reset; mod settings; mod stream_id; mod util; +mod window_update; pub use self::data::Data; pub use self::go_away::GoAway; @@ -43,6 +44,7 @@ pub use self::ping::Ping; pub use self::reset::Reset; pub use self::settings::{Settings, SettingSet}; pub use self::stream_id::StreamId; +pub use self::window_update::WindowUpdate; // Re-export some constants pub use self::settings::{ diff --git a/src/frame/window_update.rs b/src/frame/window_update.rs new file mode 100644 index 0000000..8b80ebd --- /dev/null +++ b/src/frame/window_update.rs @@ -0,0 +1,28 @@ +use frame::{Head, Error}; +use super::{StreamId}; + +#[derive(Debug)] +pub struct WindowUpdate { + stream_id: StreamId, + size_increment: u32, +} + +const SIZE_INCREMENT_MASK: u32 = 1 << 31; + +impl WindowUpdate { + pub fn load(head: Head, payload: &[u8]) -> Result { + if payload.len() != 4 { + // Invalid payload len + // TODO: Handle error + unimplemented!(); + } + + let size_increment = unpack_octets_4!(payload, 0, u32) + & !SIZE_INCREMENT_MASK; + + Ok(WindowUpdate { + stream_id: head.stream_id(), + size_increment: size_increment, + }) + } +} diff --git a/src/proto/framed_read.rs b/src/proto/framed_read.rs index 469e4a1..8b630a4 100644 --- a/src/proto/framed_read.rs +++ b/src/proto/framed_read.rs @@ -91,7 +91,12 @@ impl FramedRead { debug!("decoded; frame={:?}", frame); unimplemented!(); } - Kind::WindowUpdate => unimplemented!(), + Kind::WindowUpdate => { + // TODO: IMPLEMENT + let frame = try!(frame::WindowUpdate::load(head, &bytes[frame::HEADER_LEN..])); + debug!("decoded; frame={:?}", frame); + return Ok(None); + }, Kind::Continuation => { unimplemented!(); }