move streammap to state.rs
This commit is contained in:
		| @@ -1,10 +1,8 @@ | |||||||
| use {frame, ConnectionError, Peer, StreamId}; | use {frame, ConnectionError, Peer, StreamId}; | ||||||
| use frame::SettingSet; | use frame::SettingSet; | ||||||
|  |  | ||||||
| use bytes::{Buf, IntoBuf}; | use bytes::{Buf, IntoBuf}; | ||||||
| use fnv::FnvHasher; |  | ||||||
| use futures::*; | use futures::*; | ||||||
| use ordermap::{Entry, OrderMap}; |  | ||||||
| use std::hash::BuildHasherDefault; |  | ||||||
| use tokio_io::{AsyncRead, AsyncWrite}; | use tokio_io::{AsyncRead, AsyncWrite}; | ||||||
| use tokio_io::codec::length_delimited; | use tokio_io::codec::length_delimited; | ||||||
|  |  | ||||||
| @@ -28,7 +26,8 @@ pub use self::ping_pong::PingPong; | |||||||
| pub use self::ready::ReadySink; | pub use self::ready::ReadySink; | ||||||
| pub use self::settings::Settings; | pub use self::settings::Settings; | ||||||
| pub use self::stream_tracker::StreamTracker; | pub use self::stream_tracker::StreamTracker; | ||||||
| use self::state::StreamState; |  | ||||||
|  | use self::state::{StreamMap, StreamState}; | ||||||
|  |  | ||||||
| /// Represents the internals of an HTTP/2 connection. | /// Represents the internals of an HTTP/2 connection. | ||||||
| /// | /// | ||||||
| @@ -95,60 +94,6 @@ type Framer<T, B> = | |||||||
|  |  | ||||||
| pub type WindowSize = u32; | pub type WindowSize = u32; | ||||||
|  |  | ||||||
| #[derive(Debug, Default)] |  | ||||||
| pub struct StreamMap { |  | ||||||
|     inner: OrderMap<StreamId, StreamState, BuildHasherDefault<FnvHasher>> |  | ||||||
| } |  | ||||||
|  |  | ||||||
| impl StreamMap { |  | ||||||
|     fn get_mut(&mut self, id: &StreamId) -> Option<&mut StreamState> { |  | ||||||
|         self.inner.get_mut(id) |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     fn entry(&mut self, id: StreamId) -> Entry<StreamId, StreamState, BuildHasherDefault<FnvHasher>> { |  | ||||||
|         self.inner.entry(id) |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     fn shrink_all_local_windows(&mut self, decr: u32) { |  | ||||||
|         for (_, mut s) in &mut self.inner { |  | ||||||
|             if let Some(fc) = s.local_flow_controller() { |  | ||||||
|                 fc.shrink_window(decr); |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     fn expand_all_local_windows(&mut self, incr: u32) { |  | ||||||
|         for (_, mut s) in &mut self.inner { |  | ||||||
|             if let Some(fc) = s.local_flow_controller() { |  | ||||||
|                 fc.expand_window(incr); |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     fn shrink_all_remote_windows(&mut self, decr: u32) { |  | ||||||
|         for (_, mut s) in &mut self.inner { |  | ||||||
|             if let Some(fc) = s.remote_flow_controller() { |  | ||||||
|                 fc.shrink_window(decr); |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     fn expand_all_remote_windows(&mut self, incr: u32) { |  | ||||||
|         for (_, mut s) in &mut self.inner { |  | ||||||
|             if let Some(fc) = s.remote_flow_controller() { |  | ||||||
|                 fc.expand_window(incr); |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| /// Allows settings updates to be pushed "down" the transport (i.e. from Settings down to |  | ||||||
| /// FramedWrite). |  | ||||||
| pub trait ApplySettings { |  | ||||||
|     fn apply_local_settings(&mut self, set: &frame::SettingSet) -> Result<(), ConnectionError>; |  | ||||||
|     fn apply_remote_settings(&mut self, set: &frame::SettingSet) -> Result<(), ConnectionError>; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| /// Exposes settings to "upper" layers of the transport (i.e. from Settings up to---and | /// Exposes settings to "upper" layers of the transport (i.e. from Settings up to---and | ||||||
| /// above---Connection). | /// above---Connection). | ||||||
| pub trait ControlSettings { | pub trait ControlSettings { | ||||||
| @@ -157,18 +102,11 @@ pub trait ControlSettings { | |||||||
|     fn remote_settings(&self) -> &SettingSet; |     fn remote_settings(&self) -> &SettingSet; | ||||||
| } | } | ||||||
|  |  | ||||||
| /// Exposes stream states to "upper" layers of the transport (i.e. from StreamTracker up | /// Allows settings updates to be pushed "down" the transport (i.e. from Settings down to | ||||||
| /// to Connection). | /// FramedWrite). | ||||||
| pub trait ControlStreams { | pub trait ApplySettings { | ||||||
|     fn streams(&self)-> &StreamMap; |     fn apply_local_settings(&mut self, set: &frame::SettingSet) -> Result<(), ConnectionError>; | ||||||
|     fn streams_mut(&mut self) -> &mut StreamMap; |     fn apply_remote_settings(&mut self, set: &frame::SettingSet) -> Result<(), ConnectionError>; | ||||||
| } |  | ||||||
|  |  | ||||||
| pub type PingPayload = [u8; 8]; |  | ||||||
|  |  | ||||||
| pub trait ControlPing { |  | ||||||
|     fn start_ping(&mut self, body: PingPayload) -> StartSend<PingPayload, ConnectionError>; |  | ||||||
|     fn pop_pong(&mut self) -> Option<PingPayload>; |  | ||||||
| } | } | ||||||
|  |  | ||||||
| /// Exposes flow control states to "upper" layers of the transport (i.e. above | /// Exposes flow control states to "upper" layers of the transport (i.e. above | ||||||
| @@ -185,6 +123,20 @@ pub trait ControlFlow { | |||||||
|     fn expand_local_window(&mut self, id: StreamId, incr: WindowSize) -> Result<(), ConnectionError>; |     fn expand_local_window(&mut self, id: StreamId, incr: WindowSize) -> Result<(), ConnectionError>; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | /// Exposes stream states to "upper" layers of the transport (i.e. from StreamTracker up | ||||||
|  | /// to Connection). | ||||||
|  | pub trait ControlStreams { | ||||||
|  |     fn streams(&self)-> &StreamMap; | ||||||
|  |     fn streams_mut(&mut self) -> &mut StreamMap; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | pub type PingPayload = [u8; 8]; | ||||||
|  |  | ||||||
|  | pub trait ControlPing { | ||||||
|  |     fn start_ping(&mut self, body: PingPayload) -> StartSend<PingPayload, ConnectionError>; | ||||||
|  |     fn pop_pong(&mut self) -> Option<PingPayload>; | ||||||
|  | } | ||||||
|  |  | ||||||
| /// Create a full H2 transport from an I/O handle. | /// Create a full H2 transport from an I/O handle. | ||||||
| /// | /// | ||||||
| /// This is called as the final step of the client handshake future. | /// This is called as the final step of the client handshake future. | ||||||
|   | |||||||
| @@ -1,9 +1,13 @@ | |||||||
| use Peer; | use {Peer, StreamId}; | ||||||
| use error::ConnectionError; | use error::ConnectionError; | ||||||
| use error::Reason::*; | use error::Reason::*; | ||||||
| use error::User::*; | use error::User::*; | ||||||
| use proto::{FlowControlState, WindowSize}; | use proto::{FlowControlState, WindowSize}; | ||||||
|  |  | ||||||
|  | use fnv::FnvHasher; | ||||||
|  | use ordermap::{Entry, OrderMap}; | ||||||
|  | use std::hash::BuildHasherDefault; | ||||||
|  |  | ||||||
| /// Represents the state of an H2 stream | /// Represents the state of an H2 stream | ||||||
| /// | /// | ||||||
| /// ```not_rust | /// ```not_rust | ||||||
| @@ -277,3 +281,50 @@ impl PeerState { | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | #[derive(Debug, Default)] | ||||||
|  | pub struct StreamMap { | ||||||
|  |     inner: OrderMap<StreamId, StreamState, BuildHasherDefault<FnvHasher>> | ||||||
|  | } | ||||||
|  |  | ||||||
|  | impl StreamMap { | ||||||
|  |     pub fn get_mut(&mut self, id: &StreamId) -> Option<&mut StreamState> { | ||||||
|  |         self.inner.get_mut(id) | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     pub fn entry(&mut self, id: StreamId) -> Entry<StreamId, StreamState, BuildHasherDefault<FnvHasher>> { | ||||||
|  |         self.inner.entry(id) | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     pub fn shrink_all_local_windows(&mut self, decr: u32) { | ||||||
|  |         for (_, mut s) in &mut self.inner { | ||||||
|  |             if let Some(fc) = s.local_flow_controller() { | ||||||
|  |                 fc.shrink_window(decr); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     pub fn expand_all_local_windows(&mut self, incr: u32) { | ||||||
|  |         for (_, mut s) in &mut self.inner { | ||||||
|  |             if let Some(fc) = s.local_flow_controller() { | ||||||
|  |                 fc.expand_window(incr); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     pub fn shrink_all_remote_windows(&mut self, decr: u32) { | ||||||
|  |         for (_, mut s) in &mut self.inner { | ||||||
|  |             if let Some(fc) = s.remote_flow_controller() { | ||||||
|  |                 fc.shrink_window(decr); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     pub fn expand_all_remote_windows(&mut self, incr: u32) { | ||||||
|  |         for (_, mut s) in &mut self.inner { | ||||||
|  |             if let Some(fc) = s.remote_flow_controller() { | ||||||
|  |                 fc.expand_window(incr); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|   | |||||||
| @@ -134,13 +134,15 @@ impl<T, P> Stream for StreamTracker<T, P> | |||||||
|  |  | ||||||
|             Some(Data(v)) => { |             Some(Data(v)) => { | ||||||
|                 match self.streams.get_mut(&v.stream_id()) { |                 match self.streams.get_mut(&v.stream_id()) { | ||||||
|                     None => return Err(Reason::ProtocolError.into()), |                     None => Err(Reason::ProtocolError.into()), | ||||||
|                     Some(state) => state.recv_data(v.is_end_stream())?, |                     Some(state) => { | ||||||
|                 } |                         state.recv_data(v.is_end_stream())?; | ||||||
|                         Ok(Async::Ready(Some(Data(v)))) |                         Ok(Async::Ready(Some(Data(v)))) | ||||||
|                     } |                     } | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |  | ||||||
|             f => Ok(Async::Ready(f)) |             f => Ok(Async::Ready(f)), | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user