14
Cargo.toml
14
Cargo.toml
@@ -22,20 +22,20 @@ include = [
|
||||
]
|
||||
|
||||
[dependencies]
|
||||
bytes = "0.6"
|
||||
bytes = "1"
|
||||
futures-core = { version = "0.3", default-features = false }
|
||||
futures-channel = "0.3"
|
||||
futures-util = { version = "0.3", default-features = false }
|
||||
http = "0.2"
|
||||
http-body = { git = "https://github.com/hyperium/http-body" }
|
||||
http-body = "0.4"
|
||||
httpdate = "0.3"
|
||||
httparse = "1.0"
|
||||
h2 = { git = "https://github.com/hyperium/h2", optional = true }
|
||||
h2 = { version = "0.3", optional = true }
|
||||
itoa = "0.4.1"
|
||||
tracing = { version = "0.1", default-features = false, features = ["std"] }
|
||||
pin-project = "1.0"
|
||||
tower-service = "0.3"
|
||||
tokio = { version = "0.3.4", features = ["sync", "stream"] }
|
||||
tokio = { version = "1", features = ["sync"] }
|
||||
want = "0.3"
|
||||
|
||||
# Optional
|
||||
@@ -51,7 +51,7 @@ spmc = "0.3"
|
||||
serde = "1.0"
|
||||
serde_derive = "1.0"
|
||||
serde_json = "1.0"
|
||||
tokio = { version = "0.3", features = [
|
||||
tokio = { version = "1", features = [
|
||||
"fs",
|
||||
"macros",
|
||||
"io-std",
|
||||
@@ -62,8 +62,8 @@ tokio = { version = "0.3", features = [
|
||||
"time",
|
||||
"test-util",
|
||||
] }
|
||||
tokio-test = "0.3"
|
||||
tokio-util = { version = "0.5", features = ["codec"] }
|
||||
tokio-test = "0.4"
|
||||
tokio-util = { version = "0.6", features = ["codec"] }
|
||||
tower-util = "0.3"
|
||||
url = "1.0"
|
||||
|
||||
|
||||
@@ -23,7 +23,7 @@ where
|
||||
let second = if let Some(buf) = body.data().await {
|
||||
buf?
|
||||
} else {
|
||||
return Ok(first.copy_to_bytes(first.bytes().len()));
|
||||
return Ok(first.copy_to_bytes(first.remaining()));
|
||||
};
|
||||
|
||||
// With more than 1 buf, we gotta flatten into a Vec first.
|
||||
|
||||
@@ -667,8 +667,11 @@ impl ConnectingTcp<'_> {
|
||||
let fallback_fut = fallback.remote.connect(self.config);
|
||||
futures_util::pin_mut!(fallback_fut);
|
||||
|
||||
let fallback_delay = fallback.delay;
|
||||
futures_util::pin_mut!(fallback_delay);
|
||||
|
||||
let (result, future) =
|
||||
match futures_util::future::select(preferred_fut, fallback.delay).await {
|
||||
match futures_util::future::select(preferred_fut, fallback_delay).await {
|
||||
Either::Left((result, _fallback_delay)) => {
|
||||
(result, Either::Right(fallback_fut))
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#[cfg(feature = "http2")]
|
||||
use std::future::Future;
|
||||
|
||||
use tokio::stream::Stream;
|
||||
use futures_util::FutureExt;
|
||||
use tokio::sync::{mpsc, oneshot};
|
||||
|
||||
use crate::common::{task, Pin, Poll};
|
||||
@@ -150,8 +150,8 @@ impl<T, U> Receiver<T, U> {
|
||||
self: Pin<&mut Self>,
|
||||
cx: &mut task::Context<'_>,
|
||||
) -> Poll<Option<(T, Callback<T, U>)>> {
|
||||
let this = self.project();
|
||||
match this.inner.poll_next(cx) {
|
||||
let mut this = self.project();
|
||||
match this.inner.poll_recv(cx) {
|
||||
Poll::Ready(item) => {
|
||||
Poll::Ready(item.map(|mut env| env.0.take().expect("envelope not dropped")))
|
||||
}
|
||||
@@ -170,9 +170,9 @@ impl<T, U> Receiver<T, U> {
|
||||
|
||||
#[cfg(feature = "http1")]
|
||||
pub(crate) fn try_recv(&mut self) -> Option<(T, Callback<T, U>)> {
|
||||
match self.inner.try_recv() {
|
||||
Ok(mut env) => env.0.take(),
|
||||
Err(_) => None,
|
||||
match self.inner.recv().now_or_never() {
|
||||
Some(Some(mut env)) => env.0.take(),
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -731,7 +731,6 @@ impl<T: Poolable + 'static> Future for IdleTask<T> {
|
||||
type Output = ();
|
||||
|
||||
fn poll(self: Pin<&mut Self>, cx: &mut task::Context<'_>) -> Poll<Self::Output> {
|
||||
use tokio::stream::Stream;
|
||||
let mut this = self.project();
|
||||
loop {
|
||||
match this.pool_drop_notifier.as_mut().poll(cx) {
|
||||
@@ -743,7 +742,7 @@ impl<T: Poolable + 'static> Future for IdleTask<T> {
|
||||
}
|
||||
}
|
||||
|
||||
ready!(this.interval.as_mut().poll_next(cx));
|
||||
ready!(this.interval.as_mut().poll_tick(cx));
|
||||
|
||||
if let Some(inner) = this.pool.upgrade() {
|
||||
if let Ok(mut inner) = inner.lock() {
|
||||
|
||||
@@ -34,8 +34,8 @@ impl<T: Buf> Buf for BufList<T> {
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn bytes(&self) -> &[u8] {
|
||||
self.bufs.front().map(Buf::bytes).unwrap_or_default()
|
||||
fn chunk(&self) -> &[u8] {
|
||||
self.bufs.front().map(Buf::chunk).unwrap_or_default()
|
||||
}
|
||||
|
||||
#[inline]
|
||||
@@ -57,13 +57,13 @@ impl<T: Buf> Buf for BufList<T> {
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn bytes_vectored<'t>(&'t self, dst: &mut [IoSlice<'t>]) -> usize {
|
||||
fn chunks_vectored<'t>(&'t self, dst: &mut [IoSlice<'t>]) -> usize {
|
||||
if dst.is_empty() {
|
||||
return 0;
|
||||
}
|
||||
let mut vecs = 0;
|
||||
for buf in &self.bufs {
|
||||
vecs += buf.bytes_vectored(&mut dst[vecs..]);
|
||||
vecs += buf.chunks_vectored(&mut dst[vecs..]);
|
||||
if vecs == dst.len() {
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
mod rewind;
|
||||
|
||||
pub(crate) use self::rewind::Rewind;
|
||||
pub(crate) const MAX_WRITEV_BUFS: usize = 64;
|
||||
|
||||
@@ -229,12 +229,12 @@ where
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn bytes(&self) -> &[u8] {
|
||||
fn chunk(&self) -> &[u8] {
|
||||
match self.kind {
|
||||
BufKind::Exact(ref b) => b.bytes(),
|
||||
BufKind::Limited(ref b) => b.bytes(),
|
||||
BufKind::Chunked(ref b) => b.bytes(),
|
||||
BufKind::ChunkedEnd(ref b) => b.bytes(),
|
||||
BufKind::Exact(ref b) => b.chunk(),
|
||||
BufKind::Limited(ref b) => b.chunk(),
|
||||
BufKind::Chunked(ref b) => b.chunk(),
|
||||
BufKind::ChunkedEnd(ref b) => b.chunk(),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -249,12 +249,12 @@ where
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn bytes_vectored<'t>(&'t self, dst: &mut [IoSlice<'t>]) -> usize {
|
||||
fn chunks_vectored<'t>(&'t self, dst: &mut [IoSlice<'t>]) -> usize {
|
||||
match self.kind {
|
||||
BufKind::Exact(ref b) => b.bytes_vectored(dst),
|
||||
BufKind::Limited(ref b) => b.bytes_vectored(dst),
|
||||
BufKind::Chunked(ref b) => b.bytes_vectored(dst),
|
||||
BufKind::ChunkedEnd(ref b) => b.bytes_vectored(dst),
|
||||
BufKind::Exact(ref b) => b.chunks_vectored(dst),
|
||||
BufKind::Limited(ref b) => b.chunks_vectored(dst),
|
||||
BufKind::Chunked(ref b) => b.chunks_vectored(dst),
|
||||
BufKind::ChunkedEnd(ref b) => b.chunks_vectored(dst),
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -295,7 +295,7 @@ impl Buf for ChunkSize {
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn bytes(&self) -> &[u8] {
|
||||
fn chunk(&self) -> &[u8] {
|
||||
&self.bytes[self.pos.into()..self.len.into()]
|
||||
}
|
||||
|
||||
|
||||
@@ -186,7 +186,7 @@ where
|
||||
self.read_buf.reserve(next);
|
||||
}
|
||||
|
||||
let dst = self.read_buf.bytes_mut();
|
||||
let dst = self.read_buf.chunk_mut();
|
||||
let dst = unsafe { &mut *(dst as *mut _ as *mut [MaybeUninit<u8>]) };
|
||||
let mut buf = ReadBuf::uninit(dst);
|
||||
match Pin::new(&mut self.io).poll_read(cx, &mut buf) {
|
||||
@@ -231,10 +231,11 @@ where
|
||||
return self.poll_flush_flattened(cx);
|
||||
}
|
||||
|
||||
const MAX_WRITEV_BUFS: usize = 64;
|
||||
loop {
|
||||
let n = {
|
||||
let mut iovs = [IoSlice::new(&[]); crate::common::io::MAX_WRITEV_BUFS];
|
||||
let len = self.write_buf.bytes_vectored(&mut iovs);
|
||||
let mut iovs = [IoSlice::new(&[]); MAX_WRITEV_BUFS];
|
||||
let len = self.write_buf.chunks_vectored(&mut iovs);
|
||||
ready!(Pin::new(&mut self.io).poll_write_vectored(cx, &iovs[..len]))?
|
||||
};
|
||||
// TODO(eliza): we have to do this manually because
|
||||
@@ -262,7 +263,7 @@ where
|
||||
/// that skips some bookkeeping around using multiple buffers.
|
||||
fn poll_flush_flattened(&mut self, cx: &mut task::Context<'_>) -> Poll<io::Result<()>> {
|
||||
loop {
|
||||
let n = ready!(Pin::new(&mut self.io).poll_write(cx, self.write_buf.headers.bytes()))?;
|
||||
let n = ready!(Pin::new(&mut self.io).poll_write(cx, self.write_buf.headers.chunk()))?;
|
||||
debug!("flushed {} bytes", n);
|
||||
self.write_buf.headers.advance(n);
|
||||
if self.write_buf.headers.remaining() == 0 {
|
||||
@@ -433,7 +434,7 @@ impl<T: AsRef<[u8]>> Buf for Cursor<T> {
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn bytes(&self) -> &[u8] {
|
||||
fn chunk(&self) -> &[u8] {
|
||||
&self.bytes.as_ref()[self.pos..]
|
||||
}
|
||||
|
||||
@@ -487,7 +488,7 @@ where
|
||||
//but accomplishes the same result.
|
||||
loop {
|
||||
let adv = {
|
||||
let slice = buf.bytes();
|
||||
let slice = buf.chunk();
|
||||
if slice.is_empty() {
|
||||
return;
|
||||
}
|
||||
@@ -534,12 +535,12 @@ impl<B: Buf> Buf for WriteBuf<B> {
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn bytes(&self) -> &[u8] {
|
||||
let headers = self.headers.bytes();
|
||||
fn chunk(&self) -> &[u8] {
|
||||
let headers = self.headers.chunk();
|
||||
if !headers.is_empty() {
|
||||
headers
|
||||
} else {
|
||||
self.queue.bytes()
|
||||
self.queue.chunk()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -559,9 +560,9 @@ impl<B: Buf> Buf for WriteBuf<B> {
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn bytes_vectored<'t>(&'t self, dst: &mut [IoSlice<'t>]) -> usize {
|
||||
let n = self.headers.bytes_vectored(dst);
|
||||
self.queue.bytes_vectored(&mut dst[n..]) + n
|
||||
fn chunks_vectored<'t>(&'t self, dst: &mut [IoSlice<'t>]) -> usize {
|
||||
let n = self.headers.chunks_vectored(dst);
|
||||
self.queue.chunks_vectored(&mut dst[n..]) + n
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -257,8 +257,8 @@ impl<B: Buf> Buf for SendBuf<B> {
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn bytes(&self) -> &[u8] {
|
||||
self.0.as_ref().map(|b| b.bytes()).unwrap_or(&[])
|
||||
fn chunk(&self) -> &[u8] {
|
||||
self.0.as_ref().map(|b| b.chunk()).unwrap_or(&[])
|
||||
}
|
||||
|
||||
#[inline]
|
||||
@@ -268,7 +268,7 @@ impl<B: Buf> Buf for SendBuf<B> {
|
||||
}
|
||||
}
|
||||
|
||||
fn bytes_vectored<'a>(&'a self, dst: &mut [IoSlice<'a>]) -> usize {
|
||||
self.0.as_ref().map(|b| b.bytes_vectored(dst)).unwrap_or(0)
|
||||
fn chunks_vectored<'a>(&'a self, dst: &mut [IoSlice<'a>]) -> usize {
|
||||
self.0.as_ref().map(|b| b.chunks_vectored(dst)).unwrap_or(0)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -60,7 +60,7 @@ pub(super) fn channel(ping_pong: PingPong, config: Config) -> (Recorder, Ponger)
|
||||
interval,
|
||||
timeout: config.keep_alive_timeout,
|
||||
while_idle: config.keep_alive_while_idle,
|
||||
timer: tokio::time::sleep(interval),
|
||||
timer: Box::pin(tokio::time::sleep(interval)),
|
||||
state: KeepAliveState::Init,
|
||||
});
|
||||
|
||||
@@ -156,7 +156,7 @@ struct KeepAlive {
|
||||
while_idle: bool,
|
||||
|
||||
state: KeepAliveState,
|
||||
timer: Sleep,
|
||||
timer: Pin<Box<Sleep>>,
|
||||
}
|
||||
|
||||
#[cfg(feature = "runtime")]
|
||||
@@ -441,7 +441,7 @@ impl KeepAlive {
|
||||
|
||||
self.state = KeepAliveState::Scheduled;
|
||||
let interval = shared.last_read_at() + self.interval;
|
||||
self.timer.reset(interval);
|
||||
self.timer.as_mut().reset(interval);
|
||||
}
|
||||
KeepAliveState::PingSent => {
|
||||
if shared.is_ping_sent() {
|
||||
@@ -450,7 +450,7 @@ impl KeepAlive {
|
||||
|
||||
self.state = KeepAliveState::Scheduled;
|
||||
let interval = shared.last_read_at() + self.interval;
|
||||
self.timer.reset(interval);
|
||||
self.timer.as_mut().reset(interval);
|
||||
}
|
||||
KeepAliveState::Scheduled => (),
|
||||
}
|
||||
@@ -472,7 +472,7 @@ impl KeepAlive {
|
||||
shared.send_ping();
|
||||
self.state = KeepAliveState::PingSent;
|
||||
let timeout = Instant::now() + self.timeout;
|
||||
self.timer.reset(timeout);
|
||||
self.timer.as_mut().reset(timeout);
|
||||
}
|
||||
KeepAliveState::Init | KeepAliveState::PingSent => (),
|
||||
}
|
||||
|
||||
@@ -19,7 +19,7 @@ pub struct AddrIncoming {
|
||||
sleep_on_errors: bool,
|
||||
tcp_keepalive_timeout: Option<Duration>,
|
||||
tcp_nodelay: bool,
|
||||
timeout: Option<Sleep>,
|
||||
timeout: Option<Pin<Box<Sleep>>>,
|
||||
}
|
||||
|
||||
impl AddrIncoming {
|
||||
@@ -160,9 +160,9 @@ impl AddrIncoming {
|
||||
error!("accept error: {}", e);
|
||||
|
||||
// Sleep 1s.
|
||||
let mut timeout = tokio::time::sleep(Duration::from_secs(1));
|
||||
let mut timeout = Box::pin(tokio::time::sleep(Duration::from_secs(1)));
|
||||
|
||||
match Pin::new(&mut timeout).poll(cx) {
|
||||
match timeout.as_mut().poll(cx) {
|
||||
Poll::Ready(()) => {
|
||||
// Wow, it's been a second already? Ok then...
|
||||
continue;
|
||||
@@ -263,7 +263,7 @@ mod addr_stream {
|
||||
pub fn poll_peek(
|
||||
&mut self,
|
||||
cx: &mut task::Context<'_>,
|
||||
buf: &mut [u8],
|
||||
buf: &mut tokio::io::ReadBuf<'_>,
|
||||
) -> Poll<io::Result<usize>> {
|
||||
self.inner.poll_peek(cx, buf)
|
||||
}
|
||||
|
||||
@@ -11,7 +11,7 @@ use std::fmt;
|
||||
use std::io;
|
||||
use std::marker::Unpin;
|
||||
|
||||
use bytes::{Buf, Bytes};
|
||||
use bytes::Bytes;
|
||||
use tokio::io::{AsyncRead, AsyncWrite, ReadBuf};
|
||||
use tokio::sync::oneshot;
|
||||
|
||||
@@ -82,7 +82,7 @@ impl Upgraded {
|
||||
T: AsyncRead + AsyncWrite + Unpin + Send + 'static,
|
||||
{
|
||||
Upgraded {
|
||||
io: Rewind::new_buffered(Box::new(ForwardsWriteBuf(io)), read_buf),
|
||||
io: Rewind::new_buffered(Box::new(io), read_buf),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -92,9 +92,9 @@ impl Upgraded {
|
||||
/// `Upgraded` back.
|
||||
pub fn downcast<T: AsyncRead + AsyncWrite + Unpin + 'static>(self) -> Result<Parts<T>, Self> {
|
||||
let (io, buf) = self.io.into_inner();
|
||||
match io.__hyper_downcast::<ForwardsWriteBuf<T>>() {
|
||||
match io.__hyper_downcast() {
|
||||
Ok(t) => Ok(Parts {
|
||||
io: t.0,
|
||||
io: *t,
|
||||
read_buf: buf,
|
||||
_inner: (),
|
||||
}),
|
||||
@@ -221,20 +221,14 @@ impl StdError for UpgradeExpected {}
|
||||
|
||||
// ===== impl Io =====
|
||||
|
||||
struct ForwardsWriteBuf<T>(T);
|
||||
|
||||
pub(crate) trait Io: AsyncRead + AsyncWrite + Unpin + 'static {
|
||||
fn poll_write_dyn_buf(
|
||||
&mut self,
|
||||
cx: &mut task::Context<'_>,
|
||||
buf: &mut dyn Buf,
|
||||
) -> Poll<io::Result<usize>>;
|
||||
|
||||
fn __hyper_type_id(&self) -> TypeId {
|
||||
TypeId::of::<Self>()
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: AsyncRead + AsyncWrite + Unpin + 'static> Io for T {}
|
||||
|
||||
impl dyn Io + Send {
|
||||
fn __hyper_is<T: Io>(&self) -> bool {
|
||||
let t = TypeId::of::<T>();
|
||||
@@ -254,61 +248,6 @@ impl dyn Io + Send {
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: AsyncRead + Unpin> AsyncRead for ForwardsWriteBuf<T> {
|
||||
fn poll_read(
|
||||
mut self: Pin<&mut Self>,
|
||||
cx: &mut task::Context<'_>,
|
||||
buf: &mut ReadBuf<'_>,
|
||||
) -> Poll<io::Result<()>> {
|
||||
Pin::new(&mut self.0).poll_read(cx, buf)
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: AsyncWrite + Unpin> AsyncWrite for ForwardsWriteBuf<T> {
|
||||
fn poll_write(
|
||||
mut self: Pin<&mut Self>,
|
||||
cx: &mut task::Context<'_>,
|
||||
buf: &[u8],
|
||||
) -> Poll<io::Result<usize>> {
|
||||
Pin::new(&mut self.0).poll_write(cx, buf)
|
||||
}
|
||||
|
||||
fn poll_write_vectored(
|
||||
mut self: Pin<&mut Self>,
|
||||
cx: &mut task::Context<'_>,
|
||||
bufs: &[io::IoSlice<'_>],
|
||||
) -> Poll<io::Result<usize>> {
|
||||
Pin::new(&mut self.0).poll_write_vectored(cx, bufs)
|
||||
}
|
||||
|
||||
fn poll_flush(mut self: Pin<&mut Self>, cx: &mut task::Context<'_>) -> Poll<io::Result<()>> {
|
||||
Pin::new(&mut self.0).poll_flush(cx)
|
||||
}
|
||||
|
||||
fn poll_shutdown(mut self: Pin<&mut Self>, cx: &mut task::Context<'_>) -> Poll<io::Result<()>> {
|
||||
Pin::new(&mut self.0).poll_shutdown(cx)
|
||||
}
|
||||
|
||||
fn is_write_vectored(&self) -> bool {
|
||||
self.0.is_write_vectored()
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: AsyncRead + AsyncWrite + Unpin + 'static> Io for ForwardsWriteBuf<T> {
|
||||
fn poll_write_dyn_buf(
|
||||
&mut self,
|
||||
cx: &mut task::Context<'_>,
|
||||
buf: &mut dyn Buf,
|
||||
) -> Poll<io::Result<usize>> {
|
||||
if self.0.is_write_vectored() {
|
||||
let mut bufs = [io::IoSlice::new(&[]); crate::common::io::MAX_WRITEV_BUFS];
|
||||
let cnt = buf.bytes_vectored(&mut bufs);
|
||||
return Pin::new(&mut self.0).poll_write_vectored(cx, &bufs[..cnt]);
|
||||
}
|
||||
Pin::new(&mut self.0).poll_write(cx, buf.bytes())
|
||||
}
|
||||
}
|
||||
|
||||
mod sealed {
|
||||
use super::OnUpgrade;
|
||||
|
||||
@@ -352,7 +291,6 @@ mod sealed {
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
use tokio::io::AsyncWriteExt;
|
||||
|
||||
#[test]
|
||||
fn upgraded_downcast() {
|
||||
@@ -363,15 +301,6 @@ mod tests {
|
||||
upgraded.downcast::<Mock>().unwrap();
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn upgraded_forwards_write_buf() {
|
||||
// sanity check that the underlying IO implements write_buf
|
||||
Mock.write_buf(&mut "hello".as_bytes()).await.unwrap();
|
||||
|
||||
let mut upgraded = Upgraded::new(Mock, Bytes::new());
|
||||
upgraded.write_buf(&mut "hello".as_bytes()).await.unwrap();
|
||||
}
|
||||
|
||||
// TODO: replace with tokio_test::io when it can test write_buf
|
||||
struct Mock;
|
||||
|
||||
@@ -395,17 +324,6 @@ mod tests {
|
||||
Poll::Ready(Ok(buf.len()))
|
||||
}
|
||||
|
||||
// TODO(eliza): :(
|
||||
// fn poll_write_buf<B: Buf>(
|
||||
// self: Pin<&mut Self>,
|
||||
// _cx: &mut task::Context<'_>,
|
||||
// buf: &mut B,
|
||||
// ) -> Poll<io::Result<usize>> {
|
||||
// let n = buf.remaining();
|
||||
// buf.advance(n);
|
||||
// Poll::Ready(Ok(n))
|
||||
// }
|
||||
|
||||
fn poll_flush(self: Pin<&mut Self>, _cx: &mut task::Context<'_>) -> Poll<io::Result<()>> {
|
||||
unreachable!("Mock::poll_flush")
|
||||
}
|
||||
|
||||
@@ -1209,6 +1209,7 @@ mod dispatch_impl {
|
||||
|
||||
// and wait a few ticks for the connections to close
|
||||
let t = tokio::time::sleep(Duration::from_millis(100)).map(|_| panic!("time out"));
|
||||
futures_util::pin_mut!(t);
|
||||
let close = closes.into_future().map(|(opt, _)| opt.expect("closes"));
|
||||
future::select(t, close).await;
|
||||
}
|
||||
@@ -1257,6 +1258,7 @@ mod dispatch_impl {
|
||||
|
||||
// res now dropped
|
||||
let t = tokio::time::sleep(Duration::from_millis(100)).map(|_| panic!("time out"));
|
||||
futures_util::pin_mut!(t);
|
||||
let close = closes.into_future().map(|(opt, _)| opt.expect("closes"));
|
||||
future::select(t, close).await;
|
||||
}
|
||||
@@ -1312,6 +1314,7 @@ mod dispatch_impl {
|
||||
|
||||
// and wait a few ticks to see the connection drop
|
||||
let t = tokio::time::sleep(Duration::from_millis(100)).map(|_| panic!("time out"));
|
||||
futures_util::pin_mut!(t);
|
||||
let close = closes.into_future().map(|(opt, _)| opt.expect("closes"));
|
||||
future::select(t, close).await;
|
||||
}
|
||||
@@ -1362,6 +1365,7 @@ mod dispatch_impl {
|
||||
res.unwrap();
|
||||
|
||||
let t = tokio::time::sleep(Duration::from_millis(100)).map(|_| panic!("time out"));
|
||||
futures_util::pin_mut!(t);
|
||||
let close = closes.into_future().map(|(opt, _)| opt.expect("closes"));
|
||||
future::select(t, close).await;
|
||||
}
|
||||
@@ -1408,6 +1412,7 @@ mod dispatch_impl {
|
||||
res.unwrap();
|
||||
|
||||
let t = tokio::time::sleep(Duration::from_millis(100)).map(|_| panic!("time out"));
|
||||
futures_util::pin_mut!(t);
|
||||
let close = closes.into_future().map(|(opt, _)| opt.expect("closes"));
|
||||
future::select(t, close).await;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user