feat(lib): update Tokio, bytes, http, h2, and http-body
This commit is contained in:
@@ -1,34 +0,0 @@
|
||||
use bytes::Buf;
|
||||
use iovec::IoVec;
|
||||
|
||||
/// A `Buf` wrapping a static byte slice.
|
||||
#[derive(Debug)]
|
||||
pub(crate) struct StaticBuf(pub(crate) &'static [u8]);
|
||||
|
||||
impl Buf for StaticBuf {
|
||||
#[inline]
|
||||
fn remaining(&self) -> usize {
|
||||
self.0.len()
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn bytes(&self) -> &[u8] {
|
||||
self.0
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn advance(&mut self, cnt: usize) {
|
||||
self.0 = &self.0[cnt..];
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn bytes_vec<'t>(&'t self, dst: &mut [&'t IoVec]) -> usize {
|
||||
if dst.is_empty() || self.0.is_empty() {
|
||||
0
|
||||
} else {
|
||||
dst[0] = self.0.into();
|
||||
1
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
use std::mem;
|
||||
|
||||
use futures_util::FutureExt as _;
|
||||
use tokio_sync::{mpsc, watch};
|
||||
use tokio::sync::{mpsc, watch};
|
||||
use pin_project::pin_project;
|
||||
|
||||
use super::{Future, Never, Poll, Pin, task};
|
||||
|
||||
// Sentinel value signaling that the watch is still open
|
||||
#[derive(Clone, Copy)]
|
||||
enum Action {
|
||||
Open,
|
||||
// Closed isn't sent via the `Action` type, but rather once
|
||||
@@ -103,10 +103,7 @@ where
|
||||
loop {
|
||||
match mem::replace(me.state, State::Draining) {
|
||||
State::Watch(on_drain) => {
|
||||
let recv = me.watch.rx.recv_ref();
|
||||
futures_util::pin_mut!(recv);
|
||||
|
||||
match recv.poll_unpin(cx) {
|
||||
match me.watch.rx.poll_recv_ref(cx) {
|
||||
Poll::Ready(None) => {
|
||||
// Drain has been triggered!
|
||||
on_drain(me.future.as_mut());
|
||||
@@ -151,7 +148,8 @@ mod tests {
|
||||
|
||||
#[test]
|
||||
fn watch() {
|
||||
tokio_test::task::mock(|cx| {
|
||||
let mut mock = tokio_test::task::spawn(());
|
||||
mock.enter(|cx, _| {
|
||||
let (tx, rx) = channel();
|
||||
let fut = TestMe {
|
||||
draining: false,
|
||||
@@ -198,7 +196,8 @@ mod tests {
|
||||
|
||||
#[test]
|
||||
fn watch_clones() {
|
||||
tokio_test::task::mock(|cx| {
|
||||
let mut mock = tokio_test::task::spawn(());
|
||||
mock.enter(|cx, _| {
|
||||
let (tx, rx) = channel();
|
||||
|
||||
let fut1 = TestMe {
|
||||
|
||||
@@ -3,48 +3,39 @@ use std::future::Future;
|
||||
use std::pin::Pin;
|
||||
use std::sync::Arc;
|
||||
|
||||
use tokio_executor::{SpawnError, TypedExecutor};
|
||||
|
||||
use crate::body::{Payload, Body};
|
||||
use crate::proto::h2::server::H2Stream;
|
||||
use crate::server::conn::spawn_all::{NewSvcTask, Watcher};
|
||||
use crate::service::HttpService;
|
||||
|
||||
/// An executor of futures.
|
||||
pub trait Executor<Fut> {
|
||||
/// Place the future into the executor to be run.
|
||||
fn execute(&self, fut: Fut);
|
||||
}
|
||||
|
||||
pub trait H2Exec<F, B: Payload>: Clone {
|
||||
fn execute_h2stream(&mut self, fut: H2Stream<F, B>) -> crate::Result<()>;
|
||||
fn execute_h2stream(&mut self, fut: H2Stream<F, B>);
|
||||
}
|
||||
|
||||
pub trait NewSvcExec<I, N, S: HttpService<Body>, E, W: Watcher<I, S, E>>: Clone {
|
||||
fn execute_new_svc(&mut self, fut: NewSvcTask<I, N, S, E, W>) -> crate::Result<()>;
|
||||
fn execute_new_svc(&mut self, fut: NewSvcTask<I, N, S, E, W>);
|
||||
}
|
||||
|
||||
type BoxFuture = Pin<Box<dyn Future<Output=()> + Send>>;
|
||||
|
||||
pub trait SharedExecutor {
|
||||
fn shared_spawn(&self, future: BoxFuture) -> Result<(), SpawnError>;
|
||||
}
|
||||
|
||||
impl<E> SharedExecutor for E
|
||||
where
|
||||
for<'a> &'a E: tokio_executor::Executor,
|
||||
{
|
||||
fn shared_spawn(mut self: &Self, future: BoxFuture) -> Result<(), SpawnError> {
|
||||
tokio_executor::Executor::spawn(&mut self, future)
|
||||
}
|
||||
}
|
||||
pub type BoxSendFuture = Pin<Box<dyn Future<Output=()> + Send>>;
|
||||
|
||||
// Either the user provides an executor for background tasks, or we use
|
||||
// `tokio::spawn`.
|
||||
#[derive(Clone)]
|
||||
pub enum Exec {
|
||||
Default,
|
||||
Executor(Arc<dyn SharedExecutor + Send + Sync>),
|
||||
Executor(Arc<dyn Executor<BoxSendFuture> + Send + Sync>),
|
||||
}
|
||||
|
||||
// ===== impl Exec =====
|
||||
|
||||
impl Exec {
|
||||
pub(crate) fn execute<F>(&self, fut: F) -> crate::Result<()>
|
||||
pub(crate) fn execute<F>(&self, fut: F)
|
||||
where
|
||||
F: Future<Output=()> + Send + 'static,
|
||||
{
|
||||
@@ -52,34 +43,7 @@ impl Exec {
|
||||
Exec::Default => {
|
||||
#[cfg(feature = "tcp")]
|
||||
{
|
||||
use std::error::Error as StdError;
|
||||
|
||||
struct TokioSpawnError;
|
||||
|
||||
impl fmt::Debug for TokioSpawnError {
|
||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
fmt::Debug::fmt("tokio::spawn failed (is a tokio runtime running this future?)", f)
|
||||
}
|
||||
}
|
||||
|
||||
impl fmt::Display for TokioSpawnError {
|
||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
fmt::Display::fmt("tokio::spawn failed (is a tokio runtime running this future?)", f)
|
||||
}
|
||||
}
|
||||
|
||||
impl StdError for TokioSpawnError {
|
||||
fn description(&self) -> &str {
|
||||
"tokio::spawn failed"
|
||||
}
|
||||
}
|
||||
|
||||
::tokio_executor::DefaultExecutor::current()
|
||||
.spawn(Box::pin(fut))
|
||||
.map_err(|err| {
|
||||
warn!("executor error: {:?}", err);
|
||||
crate::Error::new_execute(TokioSpawnError)
|
||||
})
|
||||
tokio::task::spawn(fut);
|
||||
}
|
||||
#[cfg(not(feature = "tcp"))]
|
||||
{
|
||||
@@ -88,11 +52,7 @@ impl Exec {
|
||||
}
|
||||
},
|
||||
Exec::Executor(ref e) => {
|
||||
e.shared_spawn(Box::pin(fut))
|
||||
.map_err(|err| {
|
||||
warn!("executor error: {:?}", err);
|
||||
crate::Error::new_execute("custom executor failed")
|
||||
})
|
||||
e.execute(Box::pin(fut));
|
||||
},
|
||||
}
|
||||
}
|
||||
@@ -111,7 +71,7 @@ where
|
||||
H2Stream<F, B>: Future<Output = ()> + Send + 'static,
|
||||
B: Payload,
|
||||
{
|
||||
fn execute_h2stream(&mut self, fut: H2Stream<F, B>) -> crate::Result<()> {
|
||||
fn execute_h2stream(&mut self, fut: H2Stream<F, B>) {
|
||||
self.execute(fut)
|
||||
}
|
||||
}
|
||||
@@ -122,7 +82,7 @@ where
|
||||
S: HttpService<Body>,
|
||||
W: Watcher<I, S, E>,
|
||||
{
|
||||
fn execute_new_svc(&mut self, fut: NewSvcTask<I, N, S, E, W>) -> crate::Result<()> {
|
||||
fn execute_new_svc(&mut self, fut: NewSvcTask<I, N, S, E, W>) {
|
||||
self.execute(fut)
|
||||
}
|
||||
}
|
||||
@@ -131,34 +91,24 @@ where
|
||||
|
||||
impl<E, F, B> H2Exec<F, B> for E
|
||||
where
|
||||
E: TypedExecutor<H2Stream<F, B>> + Clone,
|
||||
E: Executor<H2Stream<F, B>> + Clone,
|
||||
H2Stream<F, B>: Future<Output=()>,
|
||||
B: Payload,
|
||||
{
|
||||
fn execute_h2stream(&mut self, fut: H2Stream<F, B>) -> crate::Result<()> {
|
||||
self.spawn(fut)
|
||||
.map_err(|err| {
|
||||
warn!("executor error: {:?}", err);
|
||||
crate::Error::new_execute("custom executor failed")
|
||||
})
|
||||
fn execute_h2stream(&mut self, fut: H2Stream<F, B>) {
|
||||
self.execute(fut)
|
||||
}
|
||||
}
|
||||
|
||||
impl<I, N, S, E, W> NewSvcExec<I, N, S, E, W> for E
|
||||
where
|
||||
E: TypedExecutor<NewSvcTask<I, N, S, E, W>> + Clone,
|
||||
E: Executor<NewSvcTask<I, N, S, E, W>> + Clone,
|
||||
NewSvcTask<I, N, S, E, W>: Future<Output=()>,
|
||||
S: HttpService<Body>,
|
||||
W: Watcher<I, S, E>,
|
||||
{
|
||||
fn execute_new_svc(&mut self, fut: NewSvcTask<I, N, S, E, W>) -> crate::Result<()> {
|
||||
self.spawn(fut)
|
||||
.map_err(|err| {
|
||||
warn!("executor error: {:?}", err);
|
||||
crate::Error::new_execute("custom executor failed")
|
||||
})
|
||||
fn execute_new_svc(&mut self, fut: NewSvcTask<I, N, S, E, W>) {
|
||||
self.execute(fut)
|
||||
}
|
||||
}
|
||||
|
||||
// ===== StdError impls =====
|
||||
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
use std::io::{self, Read};
|
||||
use std::{cmp, io};
|
||||
use std::marker::Unpin;
|
||||
|
||||
use bytes::{Buf, Bytes, IntoBuf};
|
||||
use tokio_io::{AsyncRead, AsyncWrite};
|
||||
use bytes::{Buf, Bytes};
|
||||
use tokio::io::{AsyncRead, AsyncWrite};
|
||||
|
||||
use crate::common::{Pin, Poll, task};
|
||||
|
||||
@@ -43,26 +43,22 @@ where
|
||||
T: AsyncRead + Unpin,
|
||||
{
|
||||
#[inline]
|
||||
unsafe fn prepare_uninitialized_buffer(&self, buf: &mut [u8]) -> bool {
|
||||
unsafe fn prepare_uninitialized_buffer(&self, buf: &mut [std::mem::MaybeUninit<u8>]) -> bool {
|
||||
self.inner.prepare_uninitialized_buffer(buf)
|
||||
}
|
||||
|
||||
fn poll_read(mut self: Pin<&mut Self>, cx: &mut task::Context<'_>, buf: &mut [u8]) -> Poll<io::Result<usize>> {
|
||||
if let Some(pre_bs) = self.pre.take() {
|
||||
if let Some(mut prefix) = self.pre.take() {
|
||||
// If there are no remaining bytes, let the bytes get dropped.
|
||||
if pre_bs.len() > 0 {
|
||||
let mut pre_reader = pre_bs.into_buf().reader();
|
||||
let read_cnt = pre_reader.read(buf)?;
|
||||
|
||||
let mut new_pre = pre_reader.into_inner().into_inner();
|
||||
new_pre.advance(read_cnt);
|
||||
|
||||
if prefix.len() > 0 {
|
||||
let copy_len = cmp::min(prefix.len(), buf.len());
|
||||
prefix.copy_to_slice(&mut buf[..copy_len]);
|
||||
// Put back whats left
|
||||
if new_pre.len() > 0 {
|
||||
self.pre = Some(new_pre);
|
||||
if prefix.len() > 0 {
|
||||
self.pre = Some(prefix);
|
||||
}
|
||||
|
||||
return Poll::Ready(Ok(read_cnt));
|
||||
return Poll::Ready(Ok(copy_len));
|
||||
}
|
||||
}
|
||||
Pin::new(&mut self.inner).poll_read(cx, buf)
|
||||
@@ -118,7 +114,7 @@ mod tests {
|
||||
|
||||
|
||||
// Rewind the stream so that it is as if we never read in the first place.
|
||||
stream.rewind(Bytes::from(&buf[..]));
|
||||
stream.rewind(Bytes::copy_from_slice(&buf[..]));
|
||||
|
||||
let mut buf = [0; 5];
|
||||
stream
|
||||
@@ -148,7 +144,7 @@ mod tests {
|
||||
|
||||
|
||||
// Rewind the stream so that it is as if we never read in the first place.
|
||||
stream.rewind(Bytes::from(&buf[..]));
|
||||
stream.rewind(Bytes::copy_from_slice(&buf[..]));
|
||||
|
||||
let mut buf = [0; 5];
|
||||
stream
|
||||
|
||||
@@ -7,7 +7,6 @@ macro_rules! ready {
|
||||
)
|
||||
}
|
||||
|
||||
mod buf;
|
||||
pub(crate) mod drain;
|
||||
pub(crate) mod exec;
|
||||
pub(crate) mod io;
|
||||
@@ -15,8 +14,8 @@ mod lazy;
|
||||
mod never;
|
||||
pub(crate) mod task;
|
||||
|
||||
pub(crate) use self::buf::StaticBuf;
|
||||
pub(crate) use self::exec::Exec;
|
||||
pub(crate) use self::exec::{BoxSendFuture, Exec};
|
||||
pub use self::exec::Executor;
|
||||
pub(crate) use self::lazy::{lazy, Started as Lazy};
|
||||
pub use self::never::Never;
|
||||
pub(crate) use self::task::Poll;
|
||||
|
||||
Reference in New Issue
Block a user