#![deny(
missing_docs,
missing_debug_implementations,
unused_imports,
unused_import_braces
)]
pub use http::{HeaderMap, HeaderValue};
pub use httparse::Header;
use bytes::BytesMut;
use std::error::Error;
use std::fmt::Debug;
pub trait ExtensionProvider {
type Extension: Extension;
type Error: Error + Sync + Send + 'static;
fn apply_headers(&self, headers: &mut HeaderMap);
fn negotiate_client(&self, headers: &HeaderMap)
-> Result<Option<Self::Extension>, Self::Error>;
fn negotiate_server(
&self,
headers: &HeaderMap,
) -> Result<Option<(Self::Extension, HeaderValue)>, Self::Error>;
}
impl<'r, E> ExtensionProvider for &'r mut E
where
E: ExtensionProvider,
{
type Extension = E::Extension;
type Error = E::Error;
fn apply_headers(&self, headers: &mut HeaderMap) {
E::apply_headers(self, headers)
}
fn negotiate_client(
&self,
headers: &HeaderMap,
) -> Result<Option<Self::Extension>, Self::Error> {
E::negotiate_client(self, headers)
}
fn negotiate_server(
&self,
headers: &HeaderMap,
) -> Result<Option<(Self::Extension, HeaderValue)>, Self::Error> {
E::negotiate_server(self, headers)
}
}
impl<'r, E> ExtensionProvider for &'r E
where
E: ExtensionProvider,
{
type Extension = E::Extension;
type Error = E::Error;
fn apply_headers(&self, headers: &mut HeaderMap) {
E::apply_headers(self, headers)
}
fn negotiate_client(
&self,
headers: &HeaderMap,
) -> Result<Option<Self::Extension>, Self::Error> {
E::negotiate_client(self, headers)
}
fn negotiate_server(
&self,
headers: &HeaderMap,
) -> Result<Option<(Self::Extension, HeaderValue)>, Self::Error> {
E::negotiate_server(self, headers)
}
}
impl<E> ExtensionProvider for Option<E>
where
E: ExtensionProvider,
{
type Extension = E::Extension;
type Error = E::Error;
fn apply_headers(&self, headers: &mut HeaderMap) {
if let Some(provider) = self {
provider.apply_headers(headers);
}
}
fn negotiate_client(
&self,
headers: &HeaderMap,
) -> Result<Option<Self::Extension>, Self::Error> {
match self {
Some(ext) => ext.negotiate_client(headers),
None => Ok(None),
}
}
fn negotiate_server(
&self,
headers: &HeaderMap,
) -> Result<Option<(Self::Extension, HeaderValue)>, Self::Error> {
match self {
Some(ext) => ext.negotiate_server(headers),
None => Ok(None),
}
}
}
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub enum OpCode {
Continuation,
Text,
Binary,
}
impl OpCode {
pub fn is_continuation(&self) -> bool {
matches!(self, OpCode::Continuation)
}
pub fn is_text(&self) -> bool {
matches!(self, OpCode::Text)
}
pub fn is_binary(&self) -> bool {
matches!(self, OpCode::Binary)
}
}
#[derive(Debug, PartialEq, Eq)]
pub struct FrameHeader {
pub fin: bool,
pub rsv1: bool,
pub rsv2: bool,
pub rsv3: bool,
pub opcode: OpCode,
}
#[derive(Debug)]
pub struct RsvBits {
pub rsv1: bool,
pub rsv2: bool,
pub rsv3: bool,
}
impl From<RsvBits> for u8 {
fn from(bits: RsvBits) -> Self {
let RsvBits { rsv1, rsv2, rsv3 } = bits;
(rsv1 as u8) << 6 | (rsv2 as u8) << 5 | (rsv3 as u8) << 4
}
}
pub trait Extension: ExtensionEncoder + ExtensionDecoder + Debug {
fn bits(&self) -> RsvBits;
}
pub trait ExtensionEncoder {
type Error: Error + Send + Sync + 'static;
fn encode(
&mut self,
payload: &mut BytesMut,
header: &mut FrameHeader,
) -> Result<(), Self::Error>;
}
pub trait ExtensionDecoder {
type Error: Error + Send + Sync + 'static;
fn decode(
&mut self,
payload: &mut BytesMut,
header: &mut FrameHeader,
) -> Result<(), Self::Error>;
}
pub trait SplittableExtension: Extension {
type SplitEncoder: ExtensionEncoder + Send + Sync + 'static;
type SplitDecoder: ExtensionDecoder + Send + Sync + 'static;
fn split(self) -> (Self::SplitEncoder, Self::SplitDecoder);
}
pub trait ReunitableExtension: SplittableExtension {
fn reunite(encoder: Self::SplitEncoder, decoder: Self::SplitDecoder) -> Self;
}
impl<E> Extension for Option<E>
where
E: Extension,
{
fn bits(&self) -> RsvBits {
match self {
Some(ext) => ext.bits(),
None => RsvBits {
rsv1: false,
rsv2: false,
rsv3: false,
},
}
}
}
impl<E> ExtensionEncoder for Option<E>
where
E: ExtensionEncoder,
{
type Error = E::Error;
fn encode(
&mut self,
payload: &mut BytesMut,
header: &mut FrameHeader,
) -> Result<(), Self::Error> {
match self {
Some(e) => e.encode(payload, header),
None => Ok(()),
}
}
}
impl<E> ExtensionDecoder for Option<E>
where
E: ExtensionDecoder,
{
type Error = E::Error;
fn decode(
&mut self,
payload: &mut BytesMut,
header: &mut FrameHeader,
) -> Result<(), Self::Error> {
match self {
Some(e) => e.decode(payload, header),
None => Ok(()),
}
}
}
impl<E> ReunitableExtension for Option<E>
where
E: ReunitableExtension,
{
fn reunite(encoder: Self::SplitEncoder, decoder: Self::SplitDecoder) -> Self {
Option::zip(encoder, decoder).map(|(encoder, decoder)| E::reunite(encoder, decoder))
}
}
impl<E> SplittableExtension for Option<E>
where
E: SplittableExtension,
{
type SplitEncoder = Option<E::SplitEncoder>;
type SplitDecoder = Option<E::SplitDecoder>;
fn split(self) -> (Self::SplitEncoder, Self::SplitDecoder) {
match self {
Some(ext) => {
let (encoder, decoder) = ext.split();
(Some(encoder), (Some(decoder)))
}
None => (None, None),
}
}
}