in neqo-http3/src/connection.rs [665:737]
fn handle_new_stream(
&mut self,
conn: &mut Connection,
stream_type: NewStreamType,
stream_id: StreamId,
) -> Res<ReceiveOutput> {
match stream_type {
NewStreamType::Control => {
self.check_stream_exists(Http3StreamType::Control)?;
self.recv_streams
.insert(stream_id, Box::new(ControlStreamRemote::new(stream_id)));
}
NewStreamType::Push(push_id) => {
qinfo!("[{self}] A new push stream {stream_id} push_id:{push_id}");
}
NewStreamType::Decoder => {
qdebug!("[{self}] A new remote qpack encoder stream {stream_id}");
self.check_stream_exists(Http3StreamType::Decoder)?;
self.recv_streams.insert(
stream_id,
Box::new(DecoderRecvStream::new(
stream_id,
Rc::clone(&self.qpack_decoder),
)),
);
}
NewStreamType::Encoder => {
qdebug!("[{self}] A new remote qpack decoder stream {stream_id}");
self.check_stream_exists(Http3StreamType::Encoder)?;
self.recv_streams.insert(
stream_id,
Box::new(EncoderRecvStream::new(
stream_id,
Rc::clone(&self.qpack_encoder),
)),
);
}
NewStreamType::Http(_) => {
qinfo!("[{self}] A new http stream {stream_id}");
}
NewStreamType::WebTransportStream(session_id) => {
let session_exists = self
.send_streams
.get(&StreamId::from(session_id))
.is_some_and(|s| s.stream_type() == Http3StreamType::ExtendedConnect);
if !session_exists {
conn.stream_stop_sending(stream_id, Error::HttpStreamCreation.code())?;
return Ok(ReceiveOutput::NoOutput);
}
// Set incoming WebTransport streams to be fair (share bandwidth).
// We may call this with an invalid stream ID, so ignore that error.
match conn.stream_fairness(stream_id, true) {
Ok(()) | Err(neqo_transport::Error::InvalidStreamId) => (),
Err(e) => return Err(Error::from(e)),
}
qinfo!("[{self}] A new WebTransport stream {stream_id} for session {session_id}");
}
NewStreamType::Unknown => {
conn.stream_stop_sending(stream_id, Error::HttpStreamCreation.code())?;
}
}
match stream_type {
NewStreamType::Control | NewStreamType::Decoder | NewStreamType::Encoder => {
self.stream_receive(conn, stream_id)
}
NewStreamType::Push(_)
| NewStreamType::Http(_)
| NewStreamType::WebTransportStream(_) => Ok(ReceiveOutput::NewStream(stream_type)),
NewStreamType::Unknown => Ok(ReceiveOutput::NoOutput),
}
}