Split response future from client::Stream (#153)
This commit is contained in:
@@ -29,6 +29,11 @@ pub struct Connection<T, B: IntoBuf> {
|
||||
inner: proto::Connection<T, Peer, B>,
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct ResponseFuture<B: IntoBuf> {
|
||||
inner: proto::StreamRef<B::Buf, Peer>,
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct Stream<B: IntoBuf> {
|
||||
inner: proto::StreamRef<B::Buf, Peer>,
|
||||
@@ -113,7 +118,7 @@ where
|
||||
&mut self,
|
||||
request: Request<()>,
|
||||
end_of_stream: bool,
|
||||
) -> Result<Stream<B>, ::Error> {
|
||||
) -> Result<(ResponseFuture<B>, Stream<B>), ::Error> {
|
||||
self.inner
|
||||
.send_request(request, end_of_stream, self.pending.as_ref())
|
||||
.map_err(Into::into)
|
||||
@@ -121,9 +126,16 @@ where
|
||||
if stream.is_pending_open() {
|
||||
self.pending = Some(stream.key());
|
||||
}
|
||||
Stream {
|
||||
|
||||
let response = ResponseFuture {
|
||||
inner: stream.clone(),
|
||||
};
|
||||
|
||||
let stream = Stream {
|
||||
inner: stream,
|
||||
}
|
||||
};
|
||||
|
||||
(response, stream)
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -334,19 +346,26 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
// ===== impl Stream =====
|
||||
// ===== impl ResponseFuture =====
|
||||
|
||||
impl<B: IntoBuf> Stream<B> {
|
||||
/// Receive the HTTP/2.0 response, if it is ready.
|
||||
pub fn poll_response(&mut self) -> Poll<Response<Body<B>>, ::Error> {
|
||||
impl<B: IntoBuf> Future for ResponseFuture<B> {
|
||||
type Item = Response<Body<B>>;
|
||||
type Error = ::Error;
|
||||
|
||||
fn poll(&mut self) -> Poll<Self::Item, Self::Error> {
|
||||
let (parts, _) = try_ready!(self.inner.poll_response()).into_parts();
|
||||
|
||||
let body = Body {
|
||||
inner: ReleaseCapacity { inner: self.inner.clone() },
|
||||
};
|
||||
|
||||
Ok(Response::from_parts(parts, body).into())
|
||||
}
|
||||
}
|
||||
|
||||
// ===== impl Stream =====
|
||||
|
||||
impl<B: IntoBuf> Stream<B> {
|
||||
/// Request capacity to send data
|
||||
pub fn reserve_capacity(&mut self, capacity: usize) {
|
||||
// TODO: Check for overflow
|
||||
@@ -381,15 +400,6 @@ impl<B: IntoBuf> Stream<B> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<B: IntoBuf> Future for Stream<B> {
|
||||
type Item = Response<Body<B>>;
|
||||
type Error = ::Error;
|
||||
|
||||
fn poll(&mut self) -> Poll<Self::Item, Self::Error> {
|
||||
self.poll_response()
|
||||
}
|
||||
}
|
||||
|
||||
// ===== impl Body =====
|
||||
|
||||
impl<B: IntoBuf> Body<B> {
|
||||
|
||||
Reference in New Issue
Block a user