wasi-hyperium 0.3.0

Hyperium for WASI Preview2 HTTP
Documentation
mod incoming;
mod outgoing;
mod service;

pub use incoming::incoming_request;
pub use outgoing::{outgoing_response, Hyperium0OutgoingBodyCopier};
pub use service::handle_service_call;

use crate::wasi::{FieldEntries, Method, Scheme};

impl TryFrom<Method> for http0::Method {
    type Error = http0::Error;

    fn try_from(method: Method) -> Result<Self, Self::Error> {
        Ok(match method {
            Method::Get => Self::GET,
            Method::Head => Self::HEAD,
            Method::Post => Self::POST,
            Method::Put => Self::PUT,
            Method::Delete => Self::DELETE,
            Method::Connect => Self::CONNECT,
            Method::Options => Self::OPTIONS,
            Method::Trace => Self::TRACE,
            Method::Patch => Self::PATCH,
            Method::Other(other) => other.parse()?,
        })
    }
}

impl TryFrom<Scheme> for http0::uri::Scheme {
    type Error = http0::Error;
    fn try_from(scheme: Scheme) -> Result<Self, Self::Error> {
        Ok(match scheme {
            Scheme::Http => Self::HTTP,
            Scheme::Https => Self::HTTPS,
            Scheme::Other(other) => other.parse()?,
        })
    }
}

impl TryFrom<FieldEntries> for http0::HeaderMap {
    type Error = http0::Error;

    fn try_from(entries: FieldEntries) -> Result<Self, Self::Error> {
        entries
            .into_iter()
            .map(|(name, val)| Ok((name.try_into()?, val.try_into()?)))
            .collect()
    }
}

impl From<http0::HeaderMap> for FieldEntries {
    fn from(map: http0::HeaderMap) -> Self {
        (&map).into()
    }
}

impl From<&http0::HeaderMap> for FieldEntries {
    fn from(map: &http0::HeaderMap) -> Self {
        map.iter()
            .map(|(name, val)| (name.to_string(), val.as_bytes().to_vec()))
            .collect::<Vec<_>>()
            .into()
    }
}