From f8189462c68c4490f7f407796db831f9e03373e5 Mon Sep 17 00:00:00 2001 From: fakeshadow <24548779@qq.com> Date: Wed, 4 Nov 2020 22:31:35 +0800 Subject: [PATCH] fix compat layer on trust-dns --- actix-codec/src/framed.rs | 29 ++++++-------------------- actix-codec/src/lib.rs | 40 ++++++++++++++++++++++++++++++++++++ actix-connect/Cargo.toml | 4 +++- actix-connect/src/lib.rs | 39 +++++++++++++++-------------------- actix-connect/src/resolve.rs | 4 +++- actix-server/src/lib.rs | 2 ++ 6 files changed, 71 insertions(+), 47 deletions(-) diff --git a/actix-codec/src/framed.rs b/actix-codec/src/framed.rs index 7bfc2d9a..2eb33b99 100644 --- a/actix-codec/src/framed.rs +++ b/actix-codec/src/framed.rs @@ -2,13 +2,12 @@ use std::pin::Pin; use std::task::{Context, Poll}; use std::{fmt, io}; -use bytes::{Buf, BufMut, BytesMut}; +use bytes::{Buf, BytesMut}; use futures_core::{ready, Stream}; use futures_sink::Sink; use pin_project::pin_project; -use crate::{AsyncRead, AsyncWrite, Decoder, Encoder, ReadBuf}; -use std::mem::MaybeUninit; +use crate::{AsyncRead, AsyncWrite, Decoder, Encoder}; /// Low-water mark const LW: usize = 1024; @@ -222,29 +221,13 @@ impl Framed { this.read_buf.reserve(HW - remaining) } - // FIXME: Is this the right way to do it for now? (line 225 - 244) - let dst = this.read_buf.bytes_mut(); - // SAFETY: `BufMut::bytes_mut` only return an empty slice when remaining is 0. - let dst = unsafe { &mut *(dst as *mut _ as *mut [MaybeUninit]) }; - let mut buf = ReadBuf::uninit(dst); - - let cnt = match this.io.poll_read(cx, &mut buf) { + // FIXME: Use poll_read_buf from tokio_util + match crate::util::poll_read_buf(this.io, cx, this.read_buf) { Poll::Pending => return Poll::Pending, Poll::Ready(Err(e)) => return Poll::Ready(Some(Err(e.into()))), - Poll::Ready(Ok(())) => buf.filled().len(), - }; - - if cnt == 0 { - this.flags.insert(Flags::EOF); - } else { - // SAFETY: This is guaranteed to be the number of initialized (and read) - // bytes due to the invariants provided by `ReadBuf::filled`. - unsafe { - this.read_buf.advance_mut(cnt); - } + Poll::Ready(Ok(cnt)) if cnt == 0 => this.flags.insert(Flags::EOF), + _ => this.flags.insert(Flags::READABLE), } - - this.flags.insert(Flags::READABLE); } } diff --git a/actix-codec/src/lib.rs b/actix-codec/src/lib.rs index b5f32066..9318ae5c 100644 --- a/actix-codec/src/lib.rs +++ b/actix-codec/src/lib.rs @@ -20,3 +20,43 @@ pub use self::framed::{Framed, FramedParts}; pub use tokio::io::{AsyncRead, AsyncWrite, ReadBuf}; pub use tokio_util::codec::{Decoder, Encoder}; + +// FIXME: Remove this +/// temporary mod +pub mod util { + use super::*; + + use std::pin::Pin; + use std::task::{Context, Poll}; + + /// temporary poll_read_buf function until it lands in tokio_util + pub fn poll_read_buf( + io: Pin<&mut T>, + cx: &mut Context<'_>, + buf: &mut B, + ) -> Poll> { + if !buf.has_remaining_mut() { + return Poll::Ready(Ok(0)); + } + + let n = { + let dst = buf.bytes_mut(); + let dst = unsafe { &mut *(dst as *mut _ as *mut [std::mem::MaybeUninit]) }; + let mut buf = ReadBuf::uninit(dst); + let ptr = buf.filled().as_ptr(); + futures_core::ready!(io.poll_read(cx, &mut buf)?); + + // Ensure the pointer does not change from under us + assert_eq!(ptr, buf.filled().as_ptr()); + buf.filled().len() + }; + + // Safety: This is guaranteed to be the number of initialized (and read) + // bytes due to the invariants provided by `ReadBuf::filled`. + unsafe { + buf.advance_mut(n); + } + + Poll::Ready(Ok(n)) + } +} diff --git a/actix-connect/Cargo.toml b/actix-connect/Cargo.toml index 7fad76d5..210bc75e 100644 --- a/actix-connect/Cargo.toml +++ b/actix-connect/Cargo.toml @@ -39,7 +39,9 @@ actix-rt = "1.1.1" derive_more = "0.99.2" either = "1.5.3" futures-util = { version = "0.3.4", default-features = false } -http = { version = "0.2.0", optional = true } +# FIXME: Use release version +http = { git = "https://github.com/paolobarbolini/http.git", branch = "bytes06", optional = true } +#http = { version = "0.2.0", optional = true } log = "0.4" tokio-compat-02 = "0.1.2" trust-dns-proto = { version = "0.19", default-features = false, features = ["tokio-runtime"] } diff --git a/actix-connect/src/lib.rs b/actix-connect/src/lib.rs index d5fde318..119027f9 100644 --- a/actix-connect/src/lib.rs +++ b/actix-connect/src/lib.rs @@ -45,35 +45,30 @@ pub async fn start_resolver( ) -> Result { // FIXME: remove compat layer use tokio_compat_02::FutureExt; - async { - Ok(AsyncResolver::tokio(cfg, opts).await?) - }.compat().await + Ok(AsyncResolver::tokio(cfg, opts).compat().await?) } struct DefaultResolver(AsyncResolver); pub(crate) async fn get_default_resolver() -> Result { - // FIXME: remove compat layer - use tokio_compat_02::FutureExt; - async { + if Arbiter::contains_item::() { + Ok(Arbiter::get_item(|item: &DefaultResolver| item.0.clone())) + } else { + let (cfg, opts) = match read_system_conf() { + Ok((cfg, opts)) => (cfg, opts), + Err(e) => { + log::error!("TRust-DNS can not load system config: {}", e); + (ResolverConfig::default(), ResolverOpts::default()) + } + }; - if Arbiter::contains_item::() { - Ok(Arbiter::get_item(|item: &DefaultResolver| item.0.clone())) - } else { - let (cfg, opts) = match read_system_conf() { - Ok((cfg, opts)) => (cfg, opts), - Err(e) => { - log::error!("TRust-DNS can not load system config: {}", e); - (ResolverConfig::default(), ResolverOpts::default()) - } - }; + // FIXME: remove compat layer + use tokio_compat_02::FutureExt; + let resolver = AsyncResolver::tokio(cfg, opts).compat().await?; - let resolver = AsyncResolver::tokio(cfg, opts).await?; - - Arbiter::set_item(DefaultResolver(resolver.clone())); - Ok(resolver) - } - }.compat().await + Arbiter::set_item(DefaultResolver(resolver.clone())); + Ok(resolver) + } } pub async fn start_default_resolver() -> Result { diff --git a/actix-connect/src/resolve.rs b/actix-connect/src/resolve.rs index bfb1482f..201c38ea 100644 --- a/actix-connect/src/resolve.rs +++ b/actix-connect/src/resolve.rs @@ -163,7 +163,9 @@ impl ResolverFuture { ResolverFuture { lookup: Box::pin(async move { let resolver = resolver_clone; - resolver.lookup_ip(host_clone).await + // FIXME: Remove compat layer + use tokio_compat_02::FutureExt; + resolver.lookup_ip(host_clone).compat().await }), req: Some(req), } diff --git a/actix-server/src/lib.rs b/actix-server/src/lib.rs index eea63cd2..c696baff 100644 --- a/actix-server/src/lib.rs +++ b/actix-server/src/lib.rs @@ -1,5 +1,7 @@ //! General purpose TCP server. +#![deny(rust_2018_idioms)] + mod accept; mod builder; mod config;