aboutsummaryrefslogtreecommitdiff
path: root/src/h3_support.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/h3_support.rs')
-rw-r--r--src/h3_support.rs30
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,
+ }
+ }
+}