diff --git a/src/codec/framed_read.rs b/src/codec/framed_read.rs index 2432e6c..562290f 100644 --- a/src/codec/framed_read.rs +++ b/src/codec/framed_read.rs @@ -49,10 +49,6 @@ impl FramedRead { } } - pub fn apply_remote_settings(&mut self, _settings: &frame::Settings) { - // TODO: Is this needed? - } - fn decode_frame(&mut self, mut bytes: BytesMut) -> Result, RecvError> { use self::RecvError::*; diff --git a/src/codec/framed_write.rs b/src/codec/framed_write.rs index 19052a4..1e92100 100644 --- a/src/codec/framed_write.rs +++ b/src/codec/framed_write.rs @@ -224,11 +224,10 @@ impl FramedWrite { self.max_frame_size as usize } - /// Apply settings received by the peer - pub fn apply_remote_settings(&mut self, settings: &frame::Settings) { - if let Some(val) = settings.max_frame_size() { - self.max_frame_size = val; - } + /// Set the peer's max frame size. + pub fn set_max_frame_size(&mut self, val: usize) { + assert!(val <= frame::MAX_MAX_FRAME_SIZE); + self.max_frame_size = val as FrameSize; } /// Retrieve the last data frame that has been sent diff --git a/src/codec/mod.rs b/src/codec/mod.rs index 9762ab3..62a321b 100644 --- a/src/codec/mod.rs +++ b/src/codec/mod.rs @@ -7,7 +7,7 @@ pub use self::error::{SendError, RecvError, UserError}; use self::framed_read::FramedRead; use self::framed_write::FramedWrite; -use frame::{self, Frame, Data, Settings}; +use frame::{self, Frame, Data}; use futures::*; @@ -49,33 +49,30 @@ impl Codec } impl Codec { - /// Apply a settings received from the peer - pub fn apply_remote_settings(&mut self, frame: &Settings) { - self.framed_read().apply_remote_settings(frame); - self.framed_write().apply_remote_settings(frame); - } - - /// Takes the data payload value that was fully written to the socket - pub fn take_last_data_frame(&mut self) -> Option> { - self.framed_write().take_last_data_frame() - } - - /// Returns the max frame size that can be sent to the peer + /// Returns the max frame size that can be sent to the peer. pub fn max_send_frame_size(&self) -> usize { self.inner.get_ref().max_frame_size() } + /// Set the peer's max frame size. + pub fn set_max_send_frame_size(&mut self, val: usize) { + self.framed_write().set_max_frame_size(val) + } + + /// Get a reference to the inner stream. #[cfg(feature = "unstable")] pub fn get_ref(&self) -> &T { self.inner.get_ref().get_ref() } + /// Get a mutable reference to the inner stream. pub fn get_mut(&mut self) -> &mut T { self.inner.get_mut().get_mut() } - fn framed_read(&mut self) -> &mut FramedRead> { - &mut self.inner + /// Takes the data payload value that was fully written to the socket + pub(crate) fn take_last_data_frame(&mut self) -> Option> { + self.framed_write().take_last_data_frame() } fn framed_write(&mut self) -> &mut FramedWrite { diff --git a/src/frame/mod.rs b/src/frame/mod.rs index 5063bbb..94b500d 100644 --- a/src/frame/mod.rs +++ b/src/frame/mod.rs @@ -55,6 +55,8 @@ pub use self::window_update::WindowUpdate; pub use self::settings::{ DEFAULT_SETTINGS_HEADER_TABLE_SIZE, DEFAULT_MAX_FRAME_SIZE, + MAX_INITIAL_WINDOW_SIZE, + MAX_MAX_FRAME_SIZE, }; pub type FrameSize = u32; diff --git a/src/frame/settings.rs b/src/frame/settings.rs index 6f9a7a5..f158bdd 100644 --- a/src/frame/settings.rs +++ b/src/frame/settings.rs @@ -33,10 +33,16 @@ pub struct SettingsFlags(u8); const ACK: u8 = 0x1; const ALL: u8 = ACK; +/// The default value of SETTINGS_HEADER_TABLE_SIZE pub const DEFAULT_SETTINGS_HEADER_TABLE_SIZE: usize = 4_096; + +/// The default value of MAX_FRAME_SIZE pub const DEFAULT_MAX_FRAME_SIZE: FrameSize = 16_384; +/// INITIAL_WINDOW_SIZE upper bound pub const MAX_INITIAL_WINDOW_SIZE: usize = (1 << 31) - 1; + +/// MAX_FRAME_SIZE upper bound pub const MAX_MAX_FRAME_SIZE: usize = (1 << 24) - 1; // ===== impl Settings ===== diff --git a/src/proto/settings.rs b/src/proto/settings.rs index ff6a80b..2361e9f 100644 --- a/src/proto/settings.rs +++ b/src/proto/settings.rs @@ -52,7 +52,10 @@ impl Settings { trace!("ACK sent; applying settings"); - dst.apply_remote_settings(settings); + if let Some(val) = settings.max_frame_size() { + dst.set_max_send_frame_size(val as usize); + } + streams.apply_remote_settings(settings)?; } diff --git a/tests/codec_read.rs b/tests/codec_read.rs index 0f6f91a..18696c3 100644 --- a/tests/codec_read.rs +++ b/tests/codec_read.rs @@ -11,6 +11,12 @@ fn read_none() { assert_closed!(codec); } +#[test] +fn read_frame_too_big() { +} + +// ===== DATA ===== + #[test] fn read_data_no_padding() { let mut codec = raw_codec! { @@ -28,6 +34,39 @@ fn read_data_no_padding() { assert_closed!(codec); } +#[test] +fn read_data_empty_payload() { + let mut codec = raw_codec! { + read => [ + 0, 0, 0, 0, 0, 0, 0, 0, 1, + ]; + }; + + let data = poll_data!(codec); + assert_eq!(data.stream_id(), 1); + assert_eq!(data.payload(), &b""[..]); + assert!(!data.is_end_stream()); + + assert_closed!(codec); +} + +#[test] +fn read_data_end_stream() { + let mut codec = raw_codec! { + read => [ + 0, 0, 5, 0, 1, 0, 0, 0, 1, + "hello", + ]; + }; + + let data = poll_data!(codec); + assert_eq!(data.stream_id(), 1); + assert_eq!(data.payload(), &b"hello"[..]); + assert!(data.is_end_stream()); + + assert_closed!(codec); +} + #[test] fn read_data_padding() { let mut codec = raw_codec! { @@ -58,3 +97,17 @@ fn read_data_stream_id_zero() { poll_err!(codec); } + +// ===== HEADERS ===== + +#[test] +fn read_headers_without_pseudo() { +} + +#[test] +fn read_headers_with_pseudo() { +} + +#[test] +fn read_headers_empty_payload() { +}