Skip to main content

wasi_hyperium/hyperium0/
incoming.rs

1use std::task::Poll;
2
3use bytes::Bytes;
4use wasi::http::types;
5
6use crate::{
7    incoming::{IncomingHttpBody, IncomingState},
8    poll::PollableRegistry,
9    wasi::IncomingRequest,
10    Error,
11};
12
13pub fn incoming_request<Registry>(
14    request: types::IncomingRequest,
15    registry: Registry,
16) -> Result<http0::Request<IncomingHttpBody<Registry>>, Error>
17where
18    Registry: PollableRegistry,
19{
20    let req = IncomingRequest::new(request, registry)?;
21    let uri = {
22        let mut builder = http0::Uri::builder();
23        if let Some(scheme) = req.scheme() {
24            builder = builder.scheme(scheme);
25        }
26        if let Some(auth) = req.authority() {
27            builder = builder.authority(auth)
28        }
29        if let Some(p_and_q) = req.path_with_query() {
30            builder = builder.path_and_query(p_and_q);
31        }
32        builder.build()?
33    };
34    let mut builder = http0::Request::builder().method(req.method()).uri(uri);
35    for (name, val) in req.headers() {
36        builder = builder.header(name, val);
37    }
38    Ok(builder.body(req.into_body().into())?)
39}
40
41impl<Registry> http_body0::Body for IncomingHttpBody<Registry>
42where
43    Registry: PollableRegistry,
44{
45    type Data = Bytes;
46    type Error = Error;
47
48    fn poll_data(
49        mut self: std::pin::Pin<&mut Self>,
50        cx: &mut std::task::Context<'_>,
51    ) -> Poll<Option<Result<Self::Data, Self::Error>>> {
52        let IncomingState::Body { .. } = &self.state else {
53            return Poll::Ready(None);
54        };
55        self.poll_incoming_body(cx)
56    }
57
58    fn poll_trailers(
59        mut self: std::pin::Pin<&mut Self>,
60        cx: &mut std::task::Context<'_>,
61    ) -> Poll<Result<Option<http0::HeaderMap>, Self::Error>> {
62        match self.poll_incoming_trailers(cx)? {
63            Poll::Ready(Some(trailers)) => Poll::Ready(Ok(Some(trailers.try_into()?))),
64            Poll::Ready(None) => Poll::Ready(Ok(None)),
65            Poll::Pending => Poll::Pending,
66        }
67    }
68}