mod deflate_config;
mod web_socket_decompression;
mod window_bits;
#[cfg(feature = "zlib-rs")]
mod zlib_rs;
use crate::{codec::Compression, collections::ArrayVectorCopy, http::GenericHeader};
pub use deflate_config::DeflateConfig;
pub use web_socket_decompression::WebSocketDecompression;
pub use window_bits::WindowBits;
#[cfg(feature = "zlib-rs")]
pub use zlib_rs::{
NegotiatedZlibRs, NegotiatedZlibRsCompression, NegotiatedZlibRsDecompression, ZlibRs,
};
pub trait WsCompression<const IS_CLIENT: bool> {
type NegotiatedCompression: NegotiatedWsCompression;
fn negotiate(
self,
headers: impl Iterator<Item = impl GenericHeader>,
) -> crate::Result<Self::NegotiatedCompression>;
fn req_headers(&self) -> ArrayVectorCopy<u8, 160>;
}
impl<const IS_CLIENT: bool> WsCompression<IS_CLIENT> for () {
type NegotiatedCompression = ();
#[inline]
fn negotiate(
self,
_: impl Iterator<Item = impl GenericHeader>,
) -> crate::Result<Self::NegotiatedCompression> {
Ok(())
}
#[inline]
fn req_headers(&self) -> ArrayVectorCopy<u8, 160> {
ArrayVectorCopy::new()
}
}
pub trait NegotiatedWsCompression: WebSocketCompression + WebSocketDecompression {
type Compression: WebSocketCompression;
type Decompression: WebSocketDecompression;
fn into_split(self) -> (Self::Compression, Self::Decompression);
fn res_headers(&self) -> ArrayVectorCopy<u8, 160>;
fn rsv1(&self) -> u8;
}
impl NegotiatedWsCompression for () {
type Compression = ();
type Decompression = ();
#[inline]
fn into_split(self) -> (Self::Compression, Self::Decompression) {
((), ())
}
#[inline]
fn res_headers(&self) -> ArrayVectorCopy<u8, 160> {
ArrayVectorCopy::new()
}
#[inline]
fn rsv1(&self) -> u8 {
0
}
}
impl<T> NegotiatedWsCompression for Option<T>
where
T: NegotiatedWsCompression,
{
type Compression = Option<T::Compression>;
type Decompression = Option<T::Decompression>;
#[inline]
fn into_split(self) -> (Self::Compression, Self::Decompression) {
match self {
Some(el) => {
let (compression, decompression) = el.into_split();
(Some(compression), Some(decompression))
}
None => (None, None),
}
}
#[inline]
fn res_headers(&self) -> ArrayVectorCopy<u8, 160> {
match self {
Some(el) => el.res_headers(),
None => ArrayVectorCopy::new(),
}
}
#[inline]
fn rsv1(&self) -> u8 {
match self {
Some(el) => el.rsv1(),
None => ().rsv1(),
}
}
}
pub trait WebSocketCompression: Compression {
fn no_context_takeover(&self) -> bool;
}
impl WebSocketCompression for () {
#[inline]
fn no_context_takeover(&self) -> bool {
false
}
}
impl<T> WebSocketCompression for Option<T>
where
T: WebSocketCompression,
{
#[inline]
fn no_context_takeover(&self) -> bool {
if let Some(elem) = self { elem.no_context_takeover() } else { false }
}
}