use crate::error::Error;
use crate::event::Event;
use crate::qpack::Header;
use crate::settings::Settings;
use crate::varint::VarInt;
use super::{Connection, H3InitData, Role};
#[derive(Debug)]
pub struct ServerConnection {
inner: Connection,
}
impl ServerConnection {
pub fn new(settings: Settings) -> Self {
Self {
inner: Connection::new(Role::Server, settings),
}
}
pub fn with_default_settings() -> Self {
Self::new(Settings::default())
}
pub fn set_control_stream_id(&mut self, stream_id: u64) -> Result<(), Error> {
self.inner.set_control_stream_id(stream_id)
}
pub fn init_h3_streams(
&mut self,
control_stream_id: u64,
encoder_stream_id: u64,
decoder_stream_id: u64,
) -> Result<H3InitData, Error> {
self.inner
.init_h3_streams(control_stream_id, encoder_stream_id, decoder_stream_id)
}
pub fn feed_stream(&mut self, stream_id: u64, data: &[u8], fin: bool) -> Result<(), Error> {
self.inner.feed_stream(stream_id, data, fin)
}
pub fn poll_event(&mut self) -> Result<Option<Event>, Error> {
self.inner.poll_event()
}
pub fn drain_events(&mut self) -> Result<Vec<Event>, Error> {
self.inner.drain_events()
}
pub fn writable_streams(&self) -> impl Iterator<Item = u64> + '_ {
self.inner.writable_streams()
}
pub fn get_stream_data(&mut self, stream_id: u64) -> Option<(&[u8], bool)> {
self.inner.get_stream_data(stream_id)
}
pub fn take_stream_data(&mut self, stream_id: u64) -> Option<(Vec<u8>, bool)> {
self.inner.take_stream_data(stream_id)
}
pub fn consume_stream_data(&mut self, stream_id: u64, len: usize) {
self.inner.consume_stream_data(stream_id, len);
}
pub fn send_response(
&mut self,
stream_id: u64,
headers: &[Header],
fin: bool,
) -> Result<(), Error> {
self.inner.send_response(stream_id, headers, fin)
}
pub fn send_body(&mut self, stream_id: u64, data: &[u8], fin: bool) -> Result<(), Error> {
self.inner.send_body(stream_id, data, fin)
}
pub fn peer_settings(&self) -> Option<&Settings> {
self.inner.peer_settings()
}
pub fn local_settings(&self) -> &Settings {
self.inner.local_settings()
}
pub fn send_goaway(&mut self, id: VarInt) -> Result<(), Error> {
self.inner.send_goaway(id)
}
pub fn feed_datagram(&mut self, data: &[u8]) -> Result<(), Error> {
self.inner.feed_datagram(data)
}
pub fn send_datagram(&self, session_id: u64, payload: &[u8]) -> Result<Vec<u8>, Error> {
self.inner.send_datagram(session_id, payload)
}
pub fn set_webtransport_transport_verified(
&mut self,
max_datagram_frame_size_nonzero: bool,
reset_stream_at_supported: bool,
) -> Result<(), Error> {
self.inner.set_webtransport_transport_verified(
max_datagram_frame_size_nonzero,
reset_stream_at_supported,
)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_server_connection() {
let mut server = ServerConnection::with_default_settings();
server.set_control_stream_id(3).unwrap();
let (data, fin) = server.get_stream_data(3).unwrap();
assert!(!data.is_empty());
assert!(!fin);
}
#[test]
fn test_server_receive_request() {
let server = ServerConnection::with_default_settings();
assert!(server.peer_settings().is_none()); }
}