wasi_hyperium/hyperium0/
incoming.rs1use 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}