mirror of
https://github.com/n0-computer/noq.git
synced 2026-09-21 02:33:23 +00:00
Handle MaxStreamData frame in Streams
This commit is contained in:
committed by
Benjamin Saunders
parent
b65e78009d
commit
4eedff0653
@@ -2121,23 +2121,8 @@ where
|
||||
self.streams.increase_max_data(bytes);
|
||||
}
|
||||
Frame::MaxStreamData { id, offset } => {
|
||||
if id.initiator() != self.side && id.dir() == Dir::Uni {
|
||||
debug!("got MAX_STREAM_DATA on recv-only {}", id);
|
||||
return Err(TransportError::STREAM_STATE_ERROR(
|
||||
"MAX_STREAM_DATA on recv-only stream",
|
||||
));
|
||||
}
|
||||
if let Some(ss) = self.streams.send_mut(id) {
|
||||
if ss.increase_max_data(offset) {
|
||||
// Unblocked
|
||||
self.streams.events.push_back(StreamEvent::Writable { id });
|
||||
}
|
||||
} else if id.initiator() == self.side() && self.streams.is_local_unopened(id) {
|
||||
debug!("got MAX_STREAM_DATA on unopened {}", id);
|
||||
return Err(TransportError::STREAM_STATE_ERROR(
|
||||
"MAX_STREAM_DATA on unopened stream",
|
||||
));
|
||||
}
|
||||
self.streams
|
||||
.received_max_stream_data(id, offset, self.side)?;
|
||||
self.on_stream_frame(false, id);
|
||||
}
|
||||
Frame::MaxStreams { dir, count } => {
|
||||
|
||||
@@ -371,6 +371,34 @@ impl Streams {
|
||||
self.max_data = self.max_data.max(n);
|
||||
}
|
||||
|
||||
pub fn received_max_stream_data(
|
||||
&mut self,
|
||||
id: StreamId,
|
||||
offset: u64,
|
||||
side: Side,
|
||||
) -> Result<(), TransportError> {
|
||||
if id.initiator() != side && id.dir() == Dir::Uni {
|
||||
debug!("got MAX_STREAM_DATA on recv-only {}", id);
|
||||
return Err(TransportError::STREAM_STATE_ERROR(
|
||||
"MAX_STREAM_DATA on recv-only stream",
|
||||
));
|
||||
}
|
||||
|
||||
if let Some(ss) = self.send_mut(id) {
|
||||
if ss.increase_max_data(offset) {
|
||||
self.events.push_back(StreamEvent::Writable { id });
|
||||
}
|
||||
Ok(())
|
||||
} else if id.initiator() == side && self.is_local_unopened(id) {
|
||||
debug!("got MAX_STREAM_DATA on unopened {}", id);
|
||||
Err(TransportError::STREAM_STATE_ERROR(
|
||||
"MAX_STREAM_DATA on unopened stream",
|
||||
))
|
||||
} else {
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
/// Yield stream events
|
||||
pub fn poll(&mut self) -> Option<StreamEvent> {
|
||||
if let Some(dir) = Dir::iter().find(|&i| mem::replace(&mut self.opened[i as usize], false))
|
||||
|
||||
Reference in New Issue
Block a user