diff options
Diffstat (limited to 'src/h3_support.rs')
-rw-r--r-- | src/h3_support.rs | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/src/h3_support.rs b/src/h3_support.rs new file mode 100644 index 0000000..56286db --- /dev/null +++ b/src/h3_support.rs @@ -0,0 +1,30 @@ +use crate::error::ServiceError; +use bytes::{Buf, Bytes}; +use h3::server::RequestStream; +use h3_quinn::RecvStream; +use hyper::body::{Body, Frame}; +use std::{ + pin::Pin, + task::{Context, Poll}, +}; + +pub struct H3RequestBody(pub RequestStream<RecvStream, Bytes>); + +impl Body for H3RequestBody { + type Data = Bytes; + type Error = ServiceError; + + fn poll_frame( + mut self: Pin<&mut Self>, + cx: &mut Context<'_>, + ) -> Poll<Option<Result<Frame<Self::Data>, Self::Error>>> { + match self.0.poll_recv_data(cx) { + Poll::Ready(Ok(Some(mut f))) => { + Poll::Ready(Some(Ok(Frame::data(f.copy_to_bytes(f.remaining()))))) + } + Poll::Ready(Ok(None)) => Poll::Ready(None), + Poll::Ready(Err(e)) => Poll::Ready(Some(Err(ServiceError::H3(e)))), + Poll::Pending => Poll::Pending, + } + } +} |