add Connection::max_concurrent_send_streams (#513)

This PR adds accessors to `client::Connection` and `server::Connection`
that return the send stream concurrency limit on that connection, as
negotiated by the remote peer. This is part of issue #512.

I think we probably ought to expose similar accessors for other
settings, but I thought it was better to add each one in a separate,
focused PR.

Signed-off-by: Eliza Weisman <eliza@buoyant.io>
This commit is contained in:
Eliza Weisman
2021-02-05 09:58:10 -08:00
committed by GitHub
parent 2c8c847cd5
commit 978c71270a
5 changed files with 42 additions and 0 deletions

View File

@@ -1228,6 +1228,19 @@ where
pub fn ping_pong(&mut self) -> Option<PingPong> { pub fn ping_pong(&mut self) -> Option<PingPong> {
self.inner.take_user_pings().map(PingPong::new) self.inner.take_user_pings().map(PingPong::new)
} }
/// Returns the maximum number of concurrent streams that may be initiated
/// by this client.
///
/// This limit is configured by the server peer by sending the
/// [`SETTINGS_MAX_CONCURRENT_STREAMS` parameter][settings] in a `SETTINGS`
/// frame. This method returns the currently acknowledged value recieved
/// from the remote.
///
/// [settings]: https://tools.ietf.org/html/rfc7540#section-5.1.2
pub fn max_concurrent_send_streams(&self) -> usize {
self.inner.max_send_streams()
}
} }
impl<T, B> Future for Connection<T, B> impl<T, B> Future for Connection<T, B>

View File

@@ -120,6 +120,12 @@ where
self.settings.send_settings(settings) self.settings.send_settings(settings)
} }
/// Returns the maximum number of concurrent streams that may be initiated
/// by this peer.
pub(crate) fn max_send_streams(&self) -> usize {
self.streams.max_send_streams()
}
/// Returns `Ready` when the connection is ready to receive a frame. /// Returns `Ready` when the connection is ready to receive a frame.
/// ///
/// Returns `RecvError` as this may raise errors that are caused by delayed /// Returns `RecvError` as this may raise errors that are caused by delayed

View File

@@ -167,6 +167,12 @@ impl Counts {
} }
} }
/// Returns the maximum number of streams that can be initiated by this
/// peer.
pub(crate) fn max_send_streams(&self) -> usize {
self.max_send_streams
}
fn dec_num_streams(&mut self, stream: &mut store::Ptr) { fn dec_num_streams(&mut self, stream: &mut store::Ptr) {
assert!(stream.is_counted); assert!(stream.is_counted);

View File

@@ -836,6 +836,10 @@ where
Ok(()) Ok(())
} }
pub(crate) fn max_send_streams(&self) -> usize {
self.inner.lock().unwrap().counts.max_send_streams()
}
#[cfg(feature = "unstable")] #[cfg(feature = "unstable")]
pub fn num_active_streams(&self) -> usize { pub fn num_active_streams(&self) -> usize {
let me = self.inner.lock().unwrap(); let me = self.inner.lock().unwrap();

View File

@@ -529,6 +529,19 @@ where
pub fn ping_pong(&mut self) -> Option<PingPong> { pub fn ping_pong(&mut self) -> Option<PingPong> {
self.connection.take_user_pings().map(PingPong::new) self.connection.take_user_pings().map(PingPong::new)
} }
/// Returns the maximum number of concurrent streams that may be initiated
/// by the server on this connection.
///
/// This limit is configured by the client peer by sending the
/// [`SETTINGS_MAX_CONCURRENT_STREAMS` parameter][settings] in a `SETTINGS`
/// frame. This method returns the currently acknowledged value recieved
/// from the remote.
///
/// [settings]: https://tools.ietf.org/html/rfc7540#section-5.1.2
pub fn max_concurrent_send_streams(&self) -> usize {
self.connection.max_send_streams()
}
} }
#[cfg(feature = "stream")] #[cfg(feature = "stream")]