/// Supply a response header to a request. /// /// # Errors /// /// It may return `InvalidStreamId` if a stream does not exist anymore. pubfn send_headers(&self, headers: &[Header]) -> Res<()> { self.handler.borrow_mut().send_headers( self.stream_id(),
headers,
&mutself.conn.borrow_mut(),
)
}
/// Supply response data to a request. /// /// # Errors /// /// It may return `InvalidStreamId` if a stream does not exist anymore. pubfn send_data(&self, buf: &[u8], now: Instant) -> Res<usize> { self.handler
.borrow_mut()
.send_data(self.stream_id(), buf, &mutself.conn.borrow_mut(), now)
}
/// Bytes sendable on stream at the QUIC layer. /// /// Note that this does not yet account for HTTP3 frame headers. /// /// # Errors /// /// It may return `InvalidStreamId` if a stream does not exist anymore. pubfn available(&self) -> Res<usize> { let stream_id = self.stream_id(); let n = self.conn.borrow_mut().stream_avail_send_space(stream_id)?;
Ok(n)
}
/// Close sending side. /// /// # Errors /// /// It may return `InvalidStreamId` if a stream does not exist anymore. pubfn stream_close_send(&self, now: Instant) -> Res<()> { self.handler.borrow_mut().stream_close_send( self.stream_id(),
&mutself.conn.borrow_mut(),
now,
)
}
/// Request a peer to stop sending a stream. /// /// # Errors /// /// It may return `InvalidStreamId` if a stream does not exist anymore. pubfn stream_stop_sending(&self, app_error: AppError) -> Res<()> {
qdebug!( "[{self}] stop sending stream_id:{} error:{app_error}", self.stream_info.stream_id()
); self.handler.borrow_mut().stream_stop_sending( self.stream_info.stream_id(),
app_error,
&mutself.conn.borrow_mut(),
)
}
/// Reset sending side of a stream. /// /// # Errors /// /// It may return `InvalidStreamId` if a stream does not exist anymore. pubfn stream_reset_send(&self, app_error: AppError) -> Res<()> {
qdebug!( "[{self}] reset send stream_id:{} error:{app_error}", self.stream_info.stream_id()
); self.handler.borrow_mut().stream_reset_send( self.stream_info.stream_id(),
app_error,
&mutself.conn.borrow_mut(),
)
}
/// Reset a stream/request. /// /// # Errors /// /// It may return `InvalidStreamId` if a stream does not exist anymore pubfn cancel_fetch(&self, app_error: AppError) -> Res<()> {
qdebug!("[{self}] reset error:{app_error}"); self.handler.borrow_mut().cancel_fetch( self.stream_info.stream_id(),
app_error,
&mutself.conn.borrow_mut(),
)
}
}
/// Supply a response header to a request. /// /// # Errors /// /// It may return `InvalidStreamId` if a stream does not exist anymore. pubfn send_headers(&self, headers: &[Header]) -> Res<()> { self.stream_handler.send_headers(headers)
}
/// Supply response data to a request. /// /// # Errors /// /// It may return `InvalidStreamId` if a stream does not exist anymore. pubfn send_data(&self, data: &[u8], now: Instant) -> Res<usize> {
qdebug!("[{self}] Set new response"); self.stream_handler.send_data(data, now)
}
/// Close sending side. /// /// # Errors /// /// It may return `InvalidStreamId` if a stream does not exist anymore. pubfn stream_close_send(&self, now: Instant) -> Res<()> {
qdebug!("[{self}] Set new response"); self.stream_handler.stream_close_send(now)
}
}
impl Deref for Http3OrWebTransportStream { type Target = StreamHandler; fn deref(&self) -> &Self::Target {
&self.stream_handler
}
}
/// Respond to a `WebTransport` session request. /// /// # Errors /// /// It may return `InvalidStreamId` if a stream does not exist anymore. pubfn response(&self, accept: &SessionAcceptAction, now: Instant) -> Res<()> {
qdebug!("[{self}] Set a response for a WebTransport session"); self.stream_handler
.handler
.borrow_mut()
.webtransport_session_accept(
&mutself.stream_handler.conn.borrow_mut(), self.stream_handler.stream_info.stream_id(),
accept,
now,
)
}
/// # Errors /// /// It may return `InvalidStreamId` if a stream does not exist anymore. /// Also return an error if the stream was closed on the transport layer, /// but that information is not yet consumed on the http/3 layer. pubfn close_session(&self, error: u32, message: &str, now: Instant) -> Res<()> { self.stream_handler
.handler
.borrow_mut()
.webtransport_close_session(
&mutself.stream_handler.conn.borrow_mut(), self.stream_handler.stream_info.stream_id(),
error,
message,
now,
)
}
/// Create `WebTransport` stream. /// /// # Errors /// /// It may return `InvalidStreamId` if a stream does not exist anymore. pubfn create_stream(&self, stream_type: StreamType) -> Res<Http3OrWebTransportStream> { let session_id = self.stream_handler.stream_id(); let id = self
.stream_handler
.handler
.borrow_mut()
.webtransport_create_stream(
&mutself.stream_handler.conn.borrow_mut(),
session_id,
stream_type,
)?;
/// Send `WebTransport` datagram. /// /// # Errors /// /// It may return `InvalidStreamId` if a stream does not exist anymore. /// The function returns `TooMuchData` if the supply buffer is bigger than /// the allowed remote datagram size. pubfn send_datagram<I: Into<DatagramTracking>>(
&self,
buf: &[u8],
id: I,
now: Instant,
) -> Res<()> { let session_id = self.stream_handler.stream_id(); self.stream_handler
.handler
.borrow_mut()
.webtransport_send_datagram(
&mutself.stream_handler.conn.borrow_mut(),
session_id,
buf,
id,
now,
)
}
// TODO: Currently not called in neqo or gecko. It should likely be called at least from gecko. #[must_use] pubfn remote_datagram_size(&self) -> u64 { self.stream_handler.conn.borrow().remote_datagram_size()
}
/// Returns the current max size of a datagram that can fit into a packet. /// The value will change over time depending on the encoded size of the /// packet number, ack frames, etc. /// /// # Errors /// /// The function returns `NotAvailable` if datagrams are not enabled. /// /// # Panics /// /// This cannot panic. The max varint length is 8. pubfn max_datagram_size(&self) -> Res<u64> { let max_size = self.stream_handler.conn.borrow().max_datagram_size()?;
Ok(max_size
- u64::try_from(Encoder::varint_len( self.stream_handler.stream_id().as_u64(),
))
.map_err(|_| Error::Internal)?)
}
}
/// Respond to a `ConnectUdp` session request. /// /// # Errors /// /// It may return `InvalidStreamId` if a stream does not exist anymore. pubfn response(&self, accept: &SessionAcceptAction, now: Instant) -> Res<()> {
qdebug!("[{self}] Set a response for a ConnectUdp session"); self.stream_handler
.handler
.borrow_mut()
.connect_udp_session_accept(
&mutself.stream_handler.conn.borrow_mut(), self.stream_handler.stream_info.stream_id(),
accept,
now,
)
}
/// # Errors /// /// It may return `InvalidStreamId` if a stream does not exist anymore. /// Also return an error if the stream was closed on the transport layer, /// but that information is not yet consumed on the http/3 layer. pubfn close_session(&self, error: u32, message: &str, now: Instant) -> Res<()> { self.stream_handler
.handler
.borrow_mut()
.connect_udp_close_session(
&mutself.stream_handler.conn.borrow_mut(), self.stream_handler.stream_info.stream_id(),
error,
message,
now,
)
}
/// Send connect-udp datagram. /// /// # Errors /// /// It may return `InvalidStreamId` if a stream does not exist anymore. /// The function returns `TooMuchData` if the supply buffer is bigger than /// the allowed remote datagram size. pubfn send_datagram<I: Into<DatagramTracking>>(
&self,
buf: &[u8],
id: I,
now: Instant,
) -> Res<()> { let session_id = self.stream_handler.stream_id(); self.stream_handler
.handler
.borrow_mut()
.connect_udp_send_datagram(
&mutself.stream_handler.conn.borrow_mut(),
session_id,
buf,
id,
now,
)
}
/// Used for testing only. /// /// # Errors /// /// It may return `InvalidStreamId` if a stream does not exist anymore. pubfn reset_send(&self) -> Res<()> { self.stream_handler.handler.borrow_mut().stream_reset_send( self.stream_id(), 0,
&mutself.stream_handler.conn.borrow_mut(),
)
}
}
impl Deref for WebTransportRequest { type Target = StreamHandler; fn deref(&self) -> &Self::Target {
&self.stream_handler
}
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.