move streammap to state.rs
This commit is contained in:
@@ -1,10 +1,8 @@
|
||||
use {frame, ConnectionError, Peer, StreamId};
|
||||
use frame::SettingSet;
|
||||
|
||||
use bytes::{Buf, IntoBuf};
|
||||
use fnv::FnvHasher;
|
||||
use futures::*;
|
||||
use ordermap::{Entry, OrderMap};
|
||||
use std::hash::BuildHasherDefault;
|
||||
use tokio_io::{AsyncRead, AsyncWrite};
|
||||
use tokio_io::codec::length_delimited;
|
||||
|
||||
@@ -28,7 +26,8 @@ pub use self::ping_pong::PingPong;
|
||||
pub use self::ready::ReadySink;
|
||||
pub use self::settings::Settings;
|
||||
pub use self::stream_tracker::StreamTracker;
|
||||
use self::state::StreamState;
|
||||
|
||||
use self::state::{StreamMap, StreamState};
|
||||
|
||||
/// Represents the internals of an HTTP/2 connection.
|
||||
///
|
||||
@@ -95,60 +94,6 @@ type Framer<T, B> =
|
||||
|
||||
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
|
||||
/// above---Connection).
|
||||
pub trait ControlSettings {
|
||||
@@ -157,18 +102,11 @@ pub trait ControlSettings {
|
||||
fn remote_settings(&self) -> &SettingSet;
|
||||
}
|
||||
|
||||
/// 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>;
|
||||
/// 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 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>;
|
||||
}
|
||||
|
||||
/// 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.
|
||||
///
|
||||
/// 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::Reason::*;
|
||||
use error::User::*;
|
||||
use proto::{FlowControlState, WindowSize};
|
||||
|
||||
use fnv::FnvHasher;
|
||||
use ordermap::{Entry, OrderMap};
|
||||
use std::hash::BuildHasherDefault;
|
||||
|
||||
/// Represents the state of an H2 stream
|
||||
///
|
||||
/// ```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)) => {
|
||||
match self.streams.get_mut(&v.stream_id()) {
|
||||
None => return Err(Reason::ProtocolError.into()),
|
||||
Some(state) => state.recv_data(v.is_end_stream())?,
|
||||
None => Err(Reason::ProtocolError.into()),
|
||||
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