Get settings handshake working + other junk
This commit is contained in:
@@ -83,7 +83,7 @@ impl Peer for Client {
|
||||
|
||||
// TODO: Factor in trailers
|
||||
if !body {
|
||||
frame.set_end_stream();
|
||||
// frame.set_end_stream();
|
||||
} else {
|
||||
unimplemented!();
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@ use bytes::{Bytes, BytesMut, BufMut, BigEndian};
|
||||
|
||||
#[derive(Debug, Clone, Default, Eq, PartialEq)]
|
||||
pub struct Settings {
|
||||
flag: SettingsFlag,
|
||||
flags: SettingsFlags,
|
||||
// Fields
|
||||
values: SettingSet,
|
||||
}
|
||||
@@ -32,7 +32,7 @@ pub enum Setting {
|
||||
}
|
||||
|
||||
#[derive(Debug, Copy, Clone, Eq, PartialEq, Default)]
|
||||
pub struct SettingsFlag(u8);
|
||||
pub struct SettingsFlags(u8);
|
||||
|
||||
const ACK: u8 = 0x1;
|
||||
const ALL: u8 = ACK;
|
||||
@@ -45,18 +45,26 @@ pub const DEFAULT_MAX_FRAME_SIZE: usize = 16_384;
|
||||
impl Settings {
|
||||
pub fn ack() -> Settings {
|
||||
Settings {
|
||||
flag: SettingsFlag::ack(),
|
||||
flags: SettingsFlags::ack(),
|
||||
.. Settings::default()
|
||||
}
|
||||
}
|
||||
|
||||
pub fn new(values: SettingSet) -> Settings {
|
||||
Settings {
|
||||
flag: SettingsFlag::empty(),
|
||||
flags: SettingsFlags::empty(),
|
||||
values: values,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn is_ack(&self) -> bool {
|
||||
self.flags.is_ack()
|
||||
}
|
||||
|
||||
pub fn into_set(self) -> SettingSet {
|
||||
self.values
|
||||
}
|
||||
|
||||
pub fn load(head: Head, payload: &[u8]) -> Result<Settings, Error> {
|
||||
use self::Setting::*;
|
||||
|
||||
@@ -67,7 +75,7 @@ impl Settings {
|
||||
}
|
||||
|
||||
// Load the flag
|
||||
let flag = SettingsFlag::load(head.flag());
|
||||
let flag = SettingsFlags::load(head.flag());
|
||||
|
||||
if flag.is_ack() {
|
||||
// Ensure that the payload is empty
|
||||
@@ -86,7 +94,7 @@ impl Settings {
|
||||
}
|
||||
|
||||
let mut settings = Settings::default();
|
||||
debug_assert!(!settings.flag.is_ack());
|
||||
debug_assert!(!settings.flags.is_ack());
|
||||
|
||||
for raw in payload.chunks(6) {
|
||||
match Setting::load(raw) {
|
||||
@@ -123,7 +131,7 @@ impl Settings {
|
||||
|
||||
pub fn encode(&self, dst: &mut BytesMut) {
|
||||
// Create & encode an appropriate frame head
|
||||
let head = Head::new(Kind::Settings, self.flag.into(), 0);
|
||||
let head = Head::new(Kind::Settings, self.flags.into(), 0);
|
||||
let payload_len = self.payload_len();
|
||||
|
||||
head.encode(payload_len, dst);
|
||||
@@ -221,19 +229,19 @@ impl Setting {
|
||||
}
|
||||
}
|
||||
|
||||
// ===== impl SettingsFlag =====
|
||||
// ===== impl SettingsFlags =====
|
||||
|
||||
impl SettingsFlag {
|
||||
pub fn empty() -> SettingsFlag {
|
||||
SettingsFlag(0)
|
||||
impl SettingsFlags {
|
||||
pub fn empty() -> SettingsFlags {
|
||||
SettingsFlags(0)
|
||||
}
|
||||
|
||||
pub fn load(bits: u8) -> SettingsFlag {
|
||||
SettingsFlag(bits & ALL)
|
||||
pub fn load(bits: u8) -> SettingsFlags {
|
||||
SettingsFlags(bits & ALL)
|
||||
}
|
||||
|
||||
pub fn ack() -> SettingsFlag {
|
||||
SettingsFlag(ACK)
|
||||
pub fn ack() -> SettingsFlags {
|
||||
SettingsFlags(ACK)
|
||||
}
|
||||
|
||||
pub fn is_ack(&self) -> bool {
|
||||
@@ -241,8 +249,8 @@ impl SettingsFlag {
|
||||
}
|
||||
}
|
||||
|
||||
impl From<SettingsFlag> for u8 {
|
||||
fn from(src: SettingsFlag) -> u8 {
|
||||
impl From<SettingsFlags> for u8 {
|
||||
fn from(src: SettingsFlags) -> u8 {
|
||||
src.0
|
||||
}
|
||||
}
|
||||
|
||||
@@ -36,6 +36,7 @@ pub use frame::{StreamId};
|
||||
pub use proto::Connection;
|
||||
|
||||
/// An H2 connection frame
|
||||
#[derive(Debug)]
|
||||
pub enum Frame<T> {
|
||||
Message {
|
||||
id: StreamId,
|
||||
|
||||
@@ -78,7 +78,23 @@ impl<T> Stream for Settings<T>
|
||||
type Error = ConnectionError;
|
||||
|
||||
fn poll(&mut self) -> Poll<Option<Frame>, ConnectionError> {
|
||||
self.inner.poll()
|
||||
loop {
|
||||
match try_ready!(self.inner.poll()) {
|
||||
Some(Frame::Settings(v)) => {
|
||||
if v.is_ack() {
|
||||
debug!("received remote settings ack");
|
||||
// TODO: Handle acks
|
||||
} else {
|
||||
// Received new settings, queue an ACK
|
||||
self.remaining_acks += 1;
|
||||
|
||||
// Save off the settings
|
||||
self.remote = v.into_set();
|
||||
}
|
||||
}
|
||||
v => return Ok(Async::Ready(v)),
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user