Files
h2/src/proto/settings.rs
2017-08-30 18:16:21 -04:00

60 lines
1.5 KiB
Rust

use frame;
use proto::*;
use futures::Sink;
#[derive(Debug)]
pub(crate) struct Settings {
/// Received SETTINGS frame pending processing. The ACK must be written to
/// the socket first then the settings applied **before** receiving any
/// further frames.
pending: Option<frame::Settings>,
}
impl Settings {
pub fn new() -> Self {
Settings {
pending: None,
}
}
pub fn recv_settings(&mut self, frame: frame::Settings) {
if frame.is_ack() {
debug!("received remote settings ack");
// TODO: handle acks
} else {
assert!(self.pending.is_none());
self.pending = Some(frame);
}
}
pub fn send_pending_ack<T, B, C>(&mut self,
dst: &mut Codec<T, B>,
streams: &mut Streams<C>)
-> Poll<(), ConnectionError>
where T: AsyncWrite,
B: Buf,
C: Buf,
{
trace!("send_pending_ack; pending={:?}", self.pending);
if let Some(ref settings) = self.pending {
let frame = frame::Settings::ack();
if let AsyncSink::NotReady(_) = dst.start_send(frame.into())? {
trace!("failed to send ACK");
return Ok(Async::NotReady);
}
trace!("ACK sent; applying settings");
dst.apply_remote_settings(settings);
streams.apply_remote_settings(settings)?;
}
self.pending = None;
Ok(().into())
}
}