feat(ffi): Initial C API for hyper
This commit is contained in:
		| @@ -51,6 +51,8 @@ enum Kind { | ||||
|         content_length: DecodedLength, | ||||
|         recv: h2::RecvStream, | ||||
|     }, | ||||
|     #[cfg(feature = "ffi")] | ||||
|     Ffi(crate::ffi::UserBody), | ||||
|     #[cfg(feature = "stream")] | ||||
|     Wrapped( | ||||
|         SyncWrapper< | ||||
| @@ -260,6 +262,21 @@ impl Body { | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     #[cfg(feature = "ffi")] | ||||
|     pub(crate) fn as_ffi_mut(&mut self) -> &mut crate::ffi::UserBody { | ||||
|         match self.kind { | ||||
|             Kind::Ffi(ref mut body) => return body, | ||||
|             _ => { | ||||
|                 self.kind = Kind::Ffi(crate::ffi::UserBody::new()); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         match self.kind { | ||||
|             Kind::Ffi(ref mut body) => body, | ||||
|             _ => unreachable!(), | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     fn poll_inner(&mut self, cx: &mut task::Context<'_>) -> Poll<Option<crate::Result<Bytes>>> { | ||||
|         match self.kind { | ||||
|             Kind::Once(ref mut val) => Poll::Ready(val.take().map(Ok)), | ||||
| @@ -294,6 +311,9 @@ impl Body { | ||||
|                 None => Poll::Ready(None), | ||||
|             }, | ||||
|  | ||||
|             #[cfg(feature = "ffi")] | ||||
|             Kind::Ffi(ref mut body) => body.poll_data(cx), | ||||
|  | ||||
|             #[cfg(feature = "stream")] | ||||
|             Kind::Wrapped(ref mut s) => match ready!(s.get_mut().as_mut().poll_next(cx)) { | ||||
|                 Some(res) => Poll::Ready(Some(res.map_err(crate::Error::new_body))), | ||||
| @@ -348,6 +368,10 @@ impl HttpBody for Body { | ||||
|                 } | ||||
|                 Err(e) => Poll::Ready(Err(crate::Error::new_h2(e))), | ||||
|             }, | ||||
|  | ||||
|             #[cfg(feature = "ffi")] | ||||
|             Kind::Ffi(ref mut body) => body.poll_trailers(cx), | ||||
|  | ||||
|             _ => Poll::Ready(Ok(None)), | ||||
|         } | ||||
|     } | ||||
| @@ -358,6 +382,8 @@ impl HttpBody for Body { | ||||
|             Kind::Chan { content_length, .. } => content_length == DecodedLength::ZERO, | ||||
|             #[cfg(all(feature = "http2", any(feature = "client", feature = "server")))] | ||||
|             Kind::H2 { recv: ref h2, .. } => h2.is_end_stream(), | ||||
|             #[cfg(feature = "ffi")] | ||||
|             Kind::Ffi(..) => false, | ||||
|             #[cfg(feature = "stream")] | ||||
|             Kind::Wrapped(..) => false, | ||||
|         } | ||||
| @@ -384,6 +410,8 @@ impl HttpBody for Body { | ||||
|             Kind::Chan { content_length, .. } => opt_len!(content_length), | ||||
|             #[cfg(all(feature = "http2", any(feature = "client", feature = "server")))] | ||||
|             Kind::H2 { content_length, .. } => opt_len!(content_length), | ||||
|             #[cfg(feature = "ffi")] | ||||
|             Kind::Ffi(..) => SizeHint::default(), | ||||
|         } | ||||
|     } | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user