summaryrefslogtreecommitdiffstats
path: root/vendor/h2/src/proto/streams/streams.rs
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/h2/src/proto/streams/streams.rs')
-rw-r--r--vendor/h2/src/proto/streams/streams.rs22
1 files changed, 15 insertions, 7 deletions
diff --git a/vendor/h2/src/proto/streams/streams.rs b/vendor/h2/src/proto/streams/streams.rs
index dfc5c768b..274bf4553 100644
--- a/vendor/h2/src/proto/streams/streams.rs
+++ b/vendor/h2/src/proto/streams/streams.rs
@@ -118,7 +118,7 @@ where
}
}
- pub fn set_target_connection_window_size(&mut self, size: WindowSize) {
+ pub fn set_target_connection_window_size(&mut self, size: WindowSize) -> Result<(), Reason> {
let mut me = self.inner.lock().unwrap();
let me = &mut *me;
@@ -216,7 +216,7 @@ where
mut request: Request<()>,
end_of_stream: bool,
pending: Option<&OpaqueStreamRef>,
- ) -> Result<StreamRef<B>, SendError> {
+ ) -> Result<(StreamRef<B>, bool), SendError> {
use super::stream::ContentLength;
use http::Method;
@@ -298,10 +298,14 @@ where
// the lock, so it can't.
me.refs += 1;
- Ok(StreamRef {
- opaque: OpaqueStreamRef::new(self.inner.clone(), &mut stream),
- send_buffer: self.send_buffer.clone(),
- })
+ let is_full = me.counts.next_send_stream_will_reach_capacity();
+ Ok((
+ StreamRef {
+ opaque: OpaqueStreamRef::new(self.inner.clone(), &mut stream),
+ send_buffer: self.send_buffer.clone(),
+ },
+ is_full,
+ ))
}
pub(crate) fn is_extended_connect_protocol_enabled(&self) -> bool {
@@ -726,7 +730,11 @@ impl Inner {
}
// The stream must be receive open
- stream.state.ensure_recv_open()?;
+ if !stream.state.ensure_recv_open()? {
+ proto_err!(conn: "recv_push_promise: initiating stream is not opened");
+ return Err(Error::library_go_away(Reason::PROTOCOL_ERROR));
+ }
+
stream.key()
}
None => {