From 857e50120bbada79555dec94dd219145df11d5f3 Mon Sep 17 00:00:00 2001 From: Yuki Okushi Date: Fri, 6 Mar 2020 13:45:21 +0900 Subject: [PATCH 01/44] Unpin quote version --- actix-macros/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/actix-macros/Cargo.toml b/actix-macros/Cargo.toml index 8691f041..eb72e52c 100644 --- a/actix-macros/Cargo.toml +++ b/actix-macros/Cargo.toml @@ -14,7 +14,7 @@ workspace = ".." proc-macro = true [dependencies] -quote = "=1.0.2" +quote = "1.0.3" syn = { version = "^1", features = ["full"] } [dev-dependencies] From 59902cb3a3131a47665cdca94f54d230e429983e Mon Sep 17 00:00:00 2001 From: Yuki Okushi Date: Fri, 6 Mar 2020 13:48:55 +0900 Subject: [PATCH 02/44] Disable windows-mingw builder temporarily --- .github/workflows/windows-mingw.yml | 54 ----------------------------- 1 file changed, 54 deletions(-) delete mode 100644 .github/workflows/windows-mingw.yml diff --git a/.github/workflows/windows-mingw.yml b/.github/workflows/windows-mingw.yml deleted file mode 100644 index c036d9b5..00000000 --- a/.github/workflows/windows-mingw.yml +++ /dev/null @@ -1,54 +0,0 @@ -name: CI (Windows-mingw) - -on: [push, pull_request] - -env: - OPENSSL_DIR: d:\a\_temp\msys\msys64\usr - -jobs: - build_and_test: - strategy: - fail-fast: false - matrix: - version: - - stable - - nightly - - name: ${{ matrix.version }} - x86_64-pc-windows-gnu - runs-on: windows-latest - - steps: - - uses: actions/checkout@master - - - name: Install ${{ matrix.version }} - uses: actions-rs/toolchain@v1 - with: - toolchain: ${{ matrix.version }}-x86_64-pc-windows-gnu - profile: minimal - override: true - - - name: Install MSYS2 - uses: numworks/setup-msys2@v1 - - - name: Install OpenSSL - run: | - msys2do pacman --noconfirm -S openssl-devel pkg-config - - - name: Copy and check libs - run: | - Copy-Item d:\a\_temp\msys\msys64\usr\lib\libssl.dll.a d:\a\_temp\msys\msys64\usr\lib\libssl.dll - Copy-Item d:\a\_temp\msys\msys64\usr\lib\libcrypto.dll.a d:\a\_temp\msys\msys64\usr\lib\libcrypto.dll - Get-ChildItem d:\a\_temp\msys\msys64\usr\lib - Get-ChildItem d:\a\_temp\msys\msys64\usr - - - name: check build - uses: actions-rs/cargo@v1 - with: - command: check - args: --all --bins --examples --tests - - - name: tests - uses: actions-rs/cargo@v1 - with: - command: test - args: --all --all-features --no-fail-fast -- --nocapture From cb30f9e86a37ba134e926d628535cfff8841e54d Mon Sep 17 00:00:00 2001 From: Jonathas-Conceicao Date: Sat, 7 Mar 2020 14:37:39 -0300 Subject: [PATCH 03/44] actix-connect: Run cargo fmt Signed-off-by: Jonathas-Conceicao --- actix-connect/tests/test_connect.rs | 60 ++++++++++++----------------- 1 file changed, 24 insertions(+), 36 deletions(-) diff --git a/actix-connect/tests/test_connect.rs b/actix-connect/tests/test_connect.rs index 4e9fb40a..b22352ca 100644 --- a/actix-connect/tests/test_connect.rs +++ b/actix-connect/tests/test_connect.rs @@ -14,12 +14,10 @@ use actix_connect::Connect; #[actix_rt::test] async fn test_string() { let srv = TestServer::with(|| { - fn_service(|io: TcpStream| { - async { - let mut framed = Framed::new(io, BytesCodec); - framed.send(Bytes::from_static(b"test")).await?; - Ok::<_, io::Error>(()) - } + fn_service(|io: TcpStream| async { + let mut framed = Framed::new(io, BytesCodec); + framed.send(Bytes::from_static(b"test")).await?; + Ok::<_, io::Error>(()) }) }); @@ -33,12 +31,10 @@ async fn test_string() { #[actix_rt::test] async fn test_rustls_string() { let srv = TestServer::with(|| { - fn_service(|io: TcpStream| { - async { - let mut framed = Framed::new(io, BytesCodec); - framed.send(Bytes::from_static(b"test")).await?; - Ok::<_, io::Error>(()) - } + fn_service(|io: TcpStream| async { + let mut framed = Framed::new(io, BytesCodec); + framed.send(Bytes::from_static(b"test")).await?; + Ok::<_, io::Error>(()) }) }); @@ -51,12 +47,10 @@ async fn test_rustls_string() { #[actix_rt::test] async fn test_static_str() { let srv = TestServer::with(|| { - fn_service(|io: TcpStream| { - async { - let mut framed = Framed::new(io, BytesCodec); - framed.send(Bytes::from_static(b"test")).await?; - Ok::<_, io::Error>(()) - } + fn_service(|io: TcpStream| async { + let mut framed = Framed::new(io, BytesCodec); + framed.send(Bytes::from_static(b"test")).await?; + Ok::<_, io::Error>(()) }) }); @@ -75,12 +69,10 @@ async fn test_static_str() { #[actix_rt::test] async fn test_new_service() { let srv = TestServer::with(|| { - fn_service(|io: TcpStream| { - async { - let mut framed = Framed::new(io, BytesCodec); - framed.send(Bytes::from_static(b"test")).await?; - Ok::<_, io::Error>(()) - } + fn_service(|io: TcpStream| async { + let mut framed = Framed::new(io, BytesCodec); + framed.send(Bytes::from_static(b"test")).await?; + Ok::<_, io::Error>(()) }) }); @@ -100,12 +92,10 @@ async fn test_uri() { use std::convert::TryFrom; let srv = TestServer::with(|| { - fn_service(|io: TcpStream| { - async { - let mut framed = Framed::new(io, BytesCodec); - framed.send(Bytes::from_static(b"test")).await?; - Ok::<_, io::Error>(()) - } + fn_service(|io: TcpStream| async { + let mut framed = Framed::new(io, BytesCodec); + framed.send(Bytes::from_static(b"test")).await?; + Ok::<_, io::Error>(()) }) }); @@ -121,12 +111,10 @@ async fn test_rustls_uri() { use std::convert::TryFrom; let srv = TestServer::with(|| { - fn_service(|io: TcpStream| { - async { - let mut framed = Framed::new(io, BytesCodec); - framed.send(Bytes::from_static(b"test")).await?; - Ok::<_, io::Error>(()) - } + fn_service(|io: TcpStream| async { + let mut framed = Framed::new(io, BytesCodec); + framed.send(Bytes::from_static(b"test")).await?; + Ok::<_, io::Error>(()) }) }); From 7fdd4a1118cac838254bbd6d77fec5d7ff5f97cc Mon Sep 17 00:00:00 2001 From: Jonathas-Conceicao Date: Tue, 25 Feb 2020 23:44:59 -0300 Subject: [PATCH 04/44] actix-connect: Upgrade versions of trust-dns - `Address` trait is now required to have static lifetime; - `start_resolver` and `start_default_resolver` are now `async` and may return a `ConnectError`; Signed-off-by: Jonathas-Conceicao --- actix-connect/CHANGES.md | 9 ++++++ actix-connect/Cargo.toml | 4 +-- actix-connect/src/connect.rs | 2 +- actix-connect/src/lib.rs | 24 +++++++-------- actix-connect/src/resolve.rs | 45 ++++++++++++++++++++--------- actix-connect/src/service.rs | 2 +- actix-connect/src/ssl/openssl.rs | 2 +- actix-connect/tests/test_connect.rs | 6 ++-- 8 files changed, 62 insertions(+), 32 deletions(-) diff --git a/actix-connect/CHANGES.md b/actix-connect/CHANGES.md index 90d6667b..9df80434 100644 --- a/actix-connect/CHANGES.md +++ b/actix-connect/CHANGES.md @@ -1,5 +1,14 @@ # Changes +## [TBD] - TBD + +### Changed + +* Update `trust-dns-proto` dependency to 0.19 [#116] +* Update `trust-dns-resolver` dependency to 0.19 [#116] +* `Address` trait is now required to have static lifetime [#116] +* `start_resolver` and `start_default_resolver` are now `async` and may return a `ConnectError` [#116] + ## [2.0.0-alpha.1] - 2020-03-03 ### Changed diff --git a/actix-connect/Cargo.toml b/actix-connect/Cargo.toml index 6beee4e7..d76e92c3 100644 --- a/actix-connect/Cargo.toml +++ b/actix-connect/Cargo.toml @@ -40,8 +40,8 @@ either = "1.5.3" futures = "0.3.1" http = { version = "0.2.0", optional = true } log = "0.4" -trust-dns-proto = "=0.18.0-alpha.2" -trust-dns-resolver = "=0.18.0-alpha.2" +trust-dns-proto = { version = "0.19", default-features = false, features = ["tokio-runtime"] } +trust-dns-resolver = { version = "0.19", default-features = false, features = ["tokio-runtime", "system-config"] } # openssl open-ssl = { version="0.10", package = "openssl", optional = true } diff --git a/actix-connect/src/connect.rs b/actix-connect/src/connect.rs index 1a4c51c5..f4f7f6b7 100644 --- a/actix-connect/src/connect.rs +++ b/actix-connect/src/connect.rs @@ -6,7 +6,7 @@ use std::net::SocketAddr; use either::Either; /// Connect request -pub trait Address: Unpin { +pub trait Address: Unpin + 'static { /// Host name of the request fn host(&self) -> &str; diff --git a/actix-connect/src/lib.rs b/actix-connect/src/lib.rs index 5de0b153..85dcf99e 100644 --- a/actix-connect/src/lib.rs +++ b/actix-connect/src/lib.rs @@ -25,7 +25,7 @@ use actix_rt::{net::TcpStream, Arbiter}; use actix_service::{pipeline, pipeline_factory, Service, ServiceFactory}; use trust_dns_resolver::config::{ResolverConfig, ResolverOpts}; use trust_dns_resolver::system_conf::read_system_conf; -use trust_dns_resolver::AsyncResolver; +use trust_dns_resolver::TokioAsyncResolver as AsyncResolver; pub mod resolver { pub use trust_dns_resolver::config::{ResolverConfig, ResolverOpts}; @@ -39,17 +39,18 @@ pub use self::error::ConnectError; pub use self::resolve::{Resolver, ResolverFactory}; pub use self::service::{ConnectService, ConnectServiceFactory, TcpConnectService}; -pub fn start_resolver(cfg: ResolverConfig, opts: ResolverOpts) -> AsyncResolver { - let (resolver, bg) = AsyncResolver::new(cfg, opts); - actix_rt::spawn(bg); - resolver +pub async fn start_resolver( + cfg: ResolverConfig, + opts: ResolverOpts, +) -> Result { + Ok(AsyncResolver::tokio(cfg, opts).await?) } struct DefaultResolver(AsyncResolver); -pub(crate) fn get_default_resolver() -> AsyncResolver { +pub(crate) async fn get_default_resolver() -> Result { if Arbiter::contains_item::() { - Arbiter::get_item(|item: &DefaultResolver| item.0.clone()) + Ok(Arbiter::get_item(|item: &DefaultResolver| item.0.clone())) } else { let (cfg, opts) = match read_system_conf() { Ok((cfg, opts)) => (cfg, opts), @@ -59,16 +60,15 @@ pub(crate) fn get_default_resolver() -> AsyncResolver { } }; - let (resolver, bg) = AsyncResolver::new(cfg, opts); - actix_rt::spawn(bg); + let resolver = AsyncResolver::tokio(cfg, opts).await?; Arbiter::set_item(DefaultResolver(resolver.clone())); - resolver + Ok(resolver) } } -pub fn start_default_resolver() -> AsyncResolver { - get_default_resolver() +pub async fn start_default_resolver() -> Result { + get_default_resolver().await } /// Create tcp connector service diff --git a/actix-connect/src/resolve.rs b/actix-connect/src/resolve.rs index 31ee05d0..70dd511a 100644 --- a/actix-connect/src/resolve.rs +++ b/actix-connect/src/resolve.rs @@ -6,8 +6,8 @@ use std::task::{Context, Poll}; use actix_service::{Service, ServiceFactory}; use futures::future::{ok, Either, Ready}; -use trust_dns_resolver::lookup_ip::LookupIpFuture; -use trust_dns_resolver::{AsyncResolver, Background}; +use trust_dns_resolver::TokioAsyncResolver as AsyncResolver; +use trust_dns_resolver::{error::ResolveError, lookup_ip::LookupIp}; use crate::connect::{Address, Connect}; use crate::error::ConnectError; @@ -106,7 +106,10 @@ impl Service for Resolver { type Request = Connect; type Response = Connect; type Error = ConnectError; - type Future = Either, Ready, Self::Error>>>; + type Future = Either< + Pin>>>, + Ready, Self::Error>>, + >; fn poll_ready(&mut self, _: &mut Context<'_>) -> Poll> { Poll::Ready(Ok(())) @@ -119,32 +122,48 @@ impl Service for Resolver { req.addr = Some(either::Either::Left(SocketAddr::new(ip, req.port()))); Either::Right(ok(req)) } else { - trace!("DNS resolver: resolving host {:?}", req.host()); - if self.resolver.is_none() { - self.resolver = Some(get_default_resolver()); - } - Either::Left(ResolverFuture::new(req, self.resolver.as_ref().unwrap())) + let resolver = self.resolver.as_ref().map(AsyncResolver::clone); + Either::Left(Box::pin(async move { + trace!("DNS resolver: resolving host {:?}", req.host()); + let resolver = if let Some(resolver) = resolver { + resolver + } else { + get_default_resolver() + .await + .expect("Failed to get default resolver") + }; + ResolverFuture::new(req, &resolver).await + })) } } } +type LookupIpFuture = Pin>>>; + #[doc(hidden)] /// Resolver future pub struct ResolverFuture { req: Option>, - lookup: Background, + lookup: LookupIpFuture, } impl ResolverFuture { pub fn new(req: Connect, resolver: &AsyncResolver) -> Self { - let lookup = if let Some(host) = req.host().splitn(2, ':').next() { - resolver.lookup_ip(host) + let host = if let Some(host) = req.host().splitn(2, ':').next() { + host } else { - resolver.lookup_ip(req.host()) + req.host() }; + // Clone data to be moved to the lookup future + let host_clone = host.to_owned(); + let resolver_clone = resolver.clone(); + ResolverFuture { - lookup, + lookup: Box::pin(async move { + let resolver = resolver_clone; + resolver.lookup_ip(host_clone).await + }), req: Some(req), } } diff --git a/actix-connect/src/service.rs b/actix-connect/src/service.rs index 6a290929..dcd03d2c 100644 --- a/actix-connect/src/service.rs +++ b/actix-connect/src/service.rs @@ -6,7 +6,7 @@ use actix_rt::net::TcpStream; use actix_service::{Service, ServiceFactory}; use either::Either; use futures::future::{ok, Ready}; -use trust_dns_resolver::AsyncResolver; +use trust_dns_resolver::TokioAsyncResolver as AsyncResolver; use crate::connect::{Address, Connect, Connection}; use crate::connector::{TcpConnector, TcpConnectorFactory}; diff --git a/actix-connect/src/ssl/openssl.rs b/actix-connect/src/ssl/openssl.rs index f2fa1943..c9cf666e 100644 --- a/actix-connect/src/ssl/openssl.rs +++ b/actix-connect/src/ssl/openssl.rs @@ -11,7 +11,7 @@ use actix_codec::{AsyncRead, AsyncWrite}; use actix_rt::net::TcpStream; use actix_service::{Service, ServiceFactory}; use futures::future::{err, ok, Either, FutureExt, LocalBoxFuture, Ready}; -use trust_dns_resolver::AsyncResolver; +use trust_dns_resolver::TokioAsyncResolver as AsyncResolver; use crate::{ Address, Connect, ConnectError, ConnectService, ConnectServiceFactory, Connection, diff --git a/actix-connect/tests/test_connect.rs b/actix-connect/tests/test_connect.rs index b22352ca..1712bf49 100644 --- a/actix-connect/tests/test_connect.rs +++ b/actix-connect/tests/test_connect.rs @@ -54,7 +54,7 @@ async fn test_static_str() { }) }); - let resolver = actix_connect::start_default_resolver(); + let resolver = actix_connect::start_default_resolver().await.unwrap(); let mut conn = actix_connect::new_connector(resolver.clone()); let con = conn.call(Connect::with("10", srv.addr())).await.unwrap(); @@ -77,7 +77,9 @@ async fn test_new_service() { }); let resolver = - actix_connect::start_resolver(ResolverConfig::default(), ResolverOpts::default()); + actix_connect::start_resolver(ResolverConfig::default(), ResolverOpts::default()) + .await + .unwrap(); let factory = actix_connect::new_connector_factory(resolver); From 2bf50826b0736db8852096b4d311f2842ba22d53 Mon Sep 17 00:00:00 2001 From: Yuki Okushi Date: Sun, 8 Mar 2020 14:37:33 +0900 Subject: [PATCH 05/44] Bump up to 2.0.0-alpha.2 --- actix-connect/CHANGES.md | 12 +++++++----- actix-connect/Cargo.toml | 2 +- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/actix-connect/CHANGES.md b/actix-connect/CHANGES.md index 9df80434..cd1dc373 100644 --- a/actix-connect/CHANGES.md +++ b/actix-connect/CHANGES.md @@ -1,13 +1,15 @@ # Changes -## [TBD] - TBD +## [2.0.0-alpha.2] - 2020-03-08 ### Changed -* Update `trust-dns-proto` dependency to 0.19 [#116] -* Update `trust-dns-resolver` dependency to 0.19 [#116] -* `Address` trait is now required to have static lifetime [#116] -* `start_resolver` and `start_default_resolver` are now `async` and may return a `ConnectError` [#116] +* Update `trust-dns-proto` dependency to 0.19. [#116] +* Update `trust-dns-resolver` dependency to 0.19. [#116] +* `Address` trait is now required to have static lifetime. [#116] +* `start_resolver` and `start_default_resolver` are now `async` and may return a `ConnectError`. [#116] + +[#116]: https://github.com/actix/actix-net/pull/116 ## [2.0.0-alpha.1] - 2020-03-03 diff --git a/actix-connect/Cargo.toml b/actix-connect/Cargo.toml index d76e92c3..fb1674e5 100644 --- a/actix-connect/Cargo.toml +++ b/actix-connect/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "actix-connect" -version = "2.0.0-alpha.1" +version = "2.0.0-alpha.2" authors = ["Nikolay Kim "] description = "Actix connect - tcp connector service" keywords = ["network", "framework", "async", "futures"] From baba533407f36315ab4395e84e6a73a971681107 Mon Sep 17 00:00:00 2001 From: Yuki Okushi Date: Sun, 8 Mar 2020 14:38:07 +0900 Subject: [PATCH 06/44] Update `actix-http` dependency --- actix-ioframe/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/actix-ioframe/Cargo.toml b/actix-ioframe/Cargo.toml index 13a7eeed..555efada 100644 --- a/actix-ioframe/Cargo.toml +++ b/actix-ioframe/Cargo.toml @@ -27,5 +27,5 @@ pin-project = "0.4.6" log = "0.4" [dev-dependencies] -actix-connect = "2.0.0-alpha.1" +actix-connect = "2.0.0-alpha.2" actix-testing = "1.0.0" From f955e499301ffadffecb0669e5c76ad2dff3b1ae Mon Sep 17 00:00:00 2001 From: Yuki Okushi Date: Thu, 12 Mar 2020 04:22:38 +0900 Subject: [PATCH 07/44] actix-connect: Minimize `futures-*` dependencies --- actix-connect/Cargo.toml | 2 +- actix-connect/src/connector.rs | 2 +- actix-connect/src/resolve.rs | 2 +- actix-connect/src/service.rs | 2 +- actix-connect/src/ssl/openssl.rs | 6 +++--- actix-connect/src/ssl/rustls.rs | 4 ++-- actix-connect/tests/test_connect.rs | 2 +- 7 files changed, 10 insertions(+), 10 deletions(-) diff --git a/actix-connect/Cargo.toml b/actix-connect/Cargo.toml index fb1674e5..739dfee8 100644 --- a/actix-connect/Cargo.toml +++ b/actix-connect/Cargo.toml @@ -37,7 +37,7 @@ actix-utils = "1.0.6" actix-rt = "1.0.0" derive_more = "0.99.2" either = "1.5.3" -futures = "0.3.1" +futures-util = { version = "0.3.4", default-features = false } http = { version = "0.2.0", optional = true } log = "0.4" trust-dns-proto = { version = "0.19", default-features = false, features = ["tokio-runtime"] } diff --git a/actix-connect/src/connector.rs b/actix-connect/src/connector.rs index e2ed8e2b..d631d684 100644 --- a/actix-connect/src/connector.rs +++ b/actix-connect/src/connector.rs @@ -8,7 +8,7 @@ use std::task::{Context, Poll}; use actix_rt::net::TcpStream; use actix_service::{Service, ServiceFactory}; -use futures::future::{err, ok, BoxFuture, Either, FutureExt, Ready}; +use futures_util::future::{err, ok, BoxFuture, Either, FutureExt, Ready}; use super::connect::{Address, Connect, Connection}; use super::error::ConnectError; diff --git a/actix-connect/src/resolve.rs b/actix-connect/src/resolve.rs index 70dd511a..faf68a19 100644 --- a/actix-connect/src/resolve.rs +++ b/actix-connect/src/resolve.rs @@ -5,7 +5,7 @@ use std::pin::Pin; use std::task::{Context, Poll}; use actix_service::{Service, ServiceFactory}; -use futures::future::{ok, Either, Ready}; +use futures_util::future::{ok, Either, Ready}; use trust_dns_resolver::TokioAsyncResolver as AsyncResolver; use trust_dns_resolver::{error::ResolveError, lookup_ip::LookupIp}; diff --git a/actix-connect/src/service.rs b/actix-connect/src/service.rs index dcd03d2c..f337382b 100644 --- a/actix-connect/src/service.rs +++ b/actix-connect/src/service.rs @@ -5,7 +5,7 @@ use std::task::{Context, Poll}; use actix_rt::net::TcpStream; use actix_service::{Service, ServiceFactory}; use either::Either; -use futures::future::{ok, Ready}; +use futures_util::future::{ok, Ready}; use trust_dns_resolver::TokioAsyncResolver as AsyncResolver; use crate::connect::{Address, Connect, Connection}; diff --git a/actix-connect/src/ssl/openssl.rs b/actix-connect/src/ssl/openssl.rs index c9cf666e..6858adbe 100644 --- a/actix-connect/src/ssl/openssl.rs +++ b/actix-connect/src/ssl/openssl.rs @@ -10,7 +10,7 @@ pub use tokio_openssl::{HandshakeError, SslStream}; use actix_codec::{AsyncRead, AsyncWrite}; use actix_rt::net::TcpStream; use actix_service::{Service, ServiceFactory}; -use futures::future::{err, ok, Either, FutureExt, LocalBoxFuture, Ready}; +use futures_util::future::{err, ok, Either, FutureExt, LocalBoxFuture, Ready}; use trust_dns_resolver::TokioAsyncResolver as AsyncResolver; use crate::{ @@ -243,7 +243,7 @@ impl Future for OpensslConnectServiceResponse { fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { if let Some(ref mut fut) = self.fut1 { - match futures::ready!(Pin::new(fut).poll(cx)) { + match futures_util::ready!(Pin::new(fut).poll(cx)) { Ok(res) => { let _ = self.fut1.take(); self.fut2 = Some(self.openssl.call(res)); @@ -253,7 +253,7 @@ impl Future for OpensslConnectServiceResponse { } if let Some(ref mut fut) = self.fut2 { - match futures::ready!(Pin::new(fut).poll(cx)) { + match futures_util::ready!(Pin::new(fut).poll(cx)) { Ok(connect) => Poll::Ready(Ok(connect.into_parts().0)), Err(e) => Poll::Ready(Err(ConnectError::Io(io::Error::new( io::ErrorKind::Other, diff --git a/actix-connect/src/ssl/rustls.rs b/actix-connect/src/ssl/rustls.rs index 1964b3aa..3e646082 100644 --- a/actix-connect/src/ssl/rustls.rs +++ b/actix-connect/src/ssl/rustls.rs @@ -10,7 +10,7 @@ pub use tokio_rustls::{client::TlsStream, rustls::ClientConfig}; use actix_codec::{AsyncRead, AsyncWrite}; use actix_service::{Service, ServiceFactory}; -use futures::future::{ok, Ready}; +use futures_util::future::{ok, Ready}; use tokio_rustls::{Connect, TlsConnector}; use webpki::DNSNameRef; @@ -126,7 +126,7 @@ where fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { let this = self.get_mut(); Poll::Ready( - futures::ready!(Pin::new(&mut this.fut).poll(cx)).map(|stream| { + futures_util::ready!(Pin::new(&mut this.fut).poll(cx)).map(|stream| { let s = this.stream.take().unwrap(); trace!("SSL Handshake success: {:?}", s.host()); s.replace(stream).1 diff --git a/actix-connect/tests/test_connect.rs b/actix-connect/tests/test_connect.rs index 1712bf49..549d559f 100644 --- a/actix-connect/tests/test_connect.rs +++ b/actix-connect/tests/test_connect.rs @@ -5,7 +5,7 @@ use actix_rt::net::TcpStream; use actix_service::{fn_service, Service, ServiceFactory}; use actix_testing::TestServer; use bytes::Bytes; -use futures::SinkExt; +use futures_util::sink::SinkExt; use actix_connect::resolver::{ResolverConfig, ResolverOpts}; use actix_connect::Connect; From dd3bec83bfdfdc9e7917024f0670db67dcbcce67 Mon Sep 17 00:00:00 2001 From: Yuki Okushi Date: Thu, 12 Mar 2020 04:23:04 +0900 Subject: [PATCH 08/44] actix-ioframe: Minimize `futures-*` dependencies --- actix-ioframe/Cargo.toml | 4 +++- actix-ioframe/src/connect.rs | 4 ++-- actix-ioframe/src/dispatcher.rs | 2 +- actix-ioframe/src/service.rs | 2 +- actix-ioframe/tests/test_server.rs | 2 +- 5 files changed, 8 insertions(+), 6 deletions(-) diff --git a/actix-ioframe/Cargo.toml b/actix-ioframe/Cargo.toml index 555efada..f9c144a7 100644 --- a/actix-ioframe/Cargo.toml +++ b/actix-ioframe/Cargo.toml @@ -22,10 +22,12 @@ actix-utils = "1.0.4" actix-rt = "1.0.0" bytes = "0.5.3" either = "1.5.3" -futures = "0.3.1" +futures-sink = { version = "0.3.4", default-features = false } +futures-core = { version = "0.3.4", default-features = false } pin-project = "0.4.6" log = "0.4" [dev-dependencies] actix-connect = "2.0.0-alpha.2" actix-testing = "1.0.0" +futures-util = { version = "0.3.4", default-features = false } diff --git a/actix-ioframe/src/connect.rs b/actix-ioframe/src/connect.rs index 85248fe4..4e2980d1 100644 --- a/actix-ioframe/src/connect.rs +++ b/actix-ioframe/src/connect.rs @@ -4,7 +4,7 @@ use std::task::{Context, Poll}; use actix_codec::{AsyncRead, AsyncWrite, Decoder, Encoder, Framed}; use actix_utils::mpsc::Receiver; -use futures::Stream; +use futures_core::stream::Stream; pub struct Connect where @@ -90,7 +90,7 @@ where } } -impl futures::Sink<::Item> +impl futures_sink::Sink<::Item> for ConnectResult where Io: AsyncRead + AsyncWrite, diff --git a/actix-ioframe/src/dispatcher.rs b/actix-ioframe/src/dispatcher.rs index 3be8963a..b7d5dd9f 100644 --- a/actix-ioframe/src/dispatcher.rs +++ b/actix-ioframe/src/dispatcher.rs @@ -5,7 +5,7 @@ use std::task::{Context, Poll}; use actix_codec::{AsyncRead, AsyncWrite, Decoder, Encoder, Framed}; use actix_service::Service; use actix_utils::mpsc; -use futures::Stream; +use futures_core::stream::Stream; use pin_project::pin_project; use log::debug; diff --git a/actix-ioframe/src/service.rs b/actix-ioframe/src/service.rs index d679b45b..a562fbb5 100644 --- a/actix-ioframe/src/service.rs +++ b/actix-ioframe/src/service.rs @@ -7,7 +7,7 @@ use std::task::{Context, Poll}; use actix_codec::{AsyncRead, AsyncWrite, Decoder, Encoder, Framed}; use actix_service::{IntoService, IntoServiceFactory, Service, ServiceFactory}; use either::Either; -use futures::{ready, Stream}; +use futures_core::{ready, stream::Stream}; use pin_project::project; use crate::connect::{Connect, ConnectResult}; diff --git a/actix-ioframe/tests/test_server.rs b/actix-ioframe/tests/test_server.rs index b1f7f301..9d3775b3 100644 --- a/actix-ioframe/tests/test_server.rs +++ b/actix-ioframe/tests/test_server.rs @@ -6,7 +6,7 @@ use actix_service::{fn_factory_with_config, fn_service, IntoService, Service}; use actix_testing::TestServer; use actix_utils::mpsc; use bytes::{Bytes, BytesMut}; -use futures::future::ok; +use futures_util::future::ok; use actix_ioframe::{Builder, Connect, FactoryBuilder}; From f5b07053fc1d58a335f3dbc36c6375249dda73b0 Mon Sep 17 00:00:00 2001 From: Yuki Okushi Date: Thu, 12 Mar 2020 04:27:26 +0900 Subject: [PATCH 09/44] actix-server: Minimize `futures-*` dependencies --- actix-server/Cargo.toml | 5 +++-- actix-server/src/builder.rs | 10 +++++----- actix-server/src/config.rs | 2 +- actix-server/src/server.rs | 6 +++--- actix-server/src/service.rs | 4 ++-- actix-server/src/signals.rs | 2 +- actix-server/src/worker.rs | 8 ++++---- actix-server/tests/test_server.rs | 4 ++-- 8 files changed, 21 insertions(+), 20 deletions(-) diff --git a/actix-server/Cargo.toml b/actix-server/Cargo.toml index eef518e6..bf9ee344 100644 --- a/actix-server/Cargo.toml +++ b/actix-server/Cargo.toml @@ -30,7 +30,8 @@ log = "0.4" num_cpus = "1.11" mio = "0.6.19" net2 = "0.2" -futures = "0.3.1" +futures-channel = { version = "0.3.4", default-features = false } +futures-util = { version = "0.3.4", default-features = false, features = ["sink"] } slab = "0.4" # unix domain sockets @@ -40,4 +41,4 @@ mio-uds = { version = "0.6.7" } [dev-dependencies] bytes = "0.5" env_logger = "0.7" -actix-testing = "1.0.0" \ No newline at end of file +actix-testing = "1.0.0" diff --git a/actix-server/src/builder.rs b/actix-server/src/builder.rs index ecc3e4e7..27475cfc 100644 --- a/actix-server/src/builder.rs +++ b/actix-server/src/builder.rs @@ -6,11 +6,11 @@ use std::{io, mem, net}; use actix_rt::net::TcpStream; use actix_rt::time::{delay_until, Instant}; use actix_rt::{spawn, System}; -use futures::channel::mpsc::{unbounded, UnboundedReceiver}; -use futures::channel::oneshot; -use futures::future::ready; -use futures::stream::FuturesUnordered; -use futures::{ready, Future, FutureExt, Stream, StreamExt}; +use futures_channel::mpsc::{unbounded, UnboundedReceiver}; +use futures_channel::oneshot; +use futures_util::future::ready; +use futures_util::stream::FuturesUnordered; +use futures_util::{ready, future::Future, FutureExt, stream::Stream, StreamExt}; use log::{error, info}; use net2::TcpBuilder; diff --git a/actix-server/src/config.rs b/actix-server/src/config.rs index 464635b1..e09a567b 100644 --- a/actix-server/src/config.rs +++ b/actix-server/src/config.rs @@ -4,7 +4,7 @@ use std::{fmt, io, net}; use actix_rt::net::TcpStream; use actix_service as actix; use actix_utils::counter::CounterGuard; -use futures::future::{ok, Future, FutureExt, LocalBoxFuture}; +use futures_util::future::{ok, Future, FutureExt, LocalBoxFuture}; use log::error; use super::builder::bind_addr; diff --git a/actix-server/src/server.rs b/actix-server/src/server.rs index 6ba2547f..b29a9e02 100644 --- a/actix-server/src/server.rs +++ b/actix-server/src/server.rs @@ -3,9 +3,9 @@ use std::io; use std::pin::Pin; use std::task::{Context, Poll}; -use futures::channel::mpsc::UnboundedSender; -use futures::channel::oneshot; -use futures::FutureExt; +use futures_channel::mpsc::UnboundedSender; +use futures_channel::oneshot; +use futures_util::FutureExt; use crate::builder::ServerBuilder; use crate::signals::Signal; diff --git a/actix-server/src/service.rs b/actix-server/src/service.rs index c46126a8..bf429185 100644 --- a/actix-server/src/service.rs +++ b/actix-server/src/service.rs @@ -6,8 +6,8 @@ use std::time::Duration; use actix_rt::spawn; use actix_service::{self as actix, Service, ServiceFactory as ActixServiceFactory}; use actix_utils::counter::CounterGuard; -use futures::future::{err, ok, LocalBoxFuture, Ready}; -use futures::{FutureExt, TryFutureExt}; +use futures_util::future::{err, ok, LocalBoxFuture, Ready}; +use futures_util::{FutureExt, TryFutureExt}; use log::error; use super::Token; diff --git a/actix-server/src/signals.rs b/actix-server/src/signals.rs index db226585..b6339621 100644 --- a/actix-server/src/signals.rs +++ b/actix-server/src/signals.rs @@ -3,7 +3,7 @@ use std::io; use std::pin::Pin; use std::task::{Context, Poll}; -use futures::future::lazy; +use futures_util::future::lazy; use crate::server::Server; diff --git a/actix-server/src/worker.rs b/actix-server/src/worker.rs index f51fd310..820a79bf 100644 --- a/actix-server/src/worker.rs +++ b/actix-server/src/worker.rs @@ -7,10 +7,10 @@ use std::time; use actix_rt::time::{delay_until, Delay, Instant}; use actix_rt::{spawn, Arbiter}; use actix_utils::counter::Counter; -use futures::channel::mpsc::{unbounded, UnboundedReceiver, UnboundedSender}; -use futures::channel::oneshot; -use futures::future::{join_all, LocalBoxFuture, MapOk}; -use futures::{Future, FutureExt, Stream, TryFutureExt}; +use futures_channel::mpsc::{unbounded, UnboundedReceiver, UnboundedSender}; +use futures_channel::oneshot; +use futures_util::future::{join_all, LocalBoxFuture, MapOk}; +use futures_util::{future::Future, FutureExt, stream::Stream, TryFutureExt}; use log::{error, info, trace}; use crate::accept::AcceptNotify; diff --git a/actix-server/tests/test_server.rs b/actix-server/tests/test_server.rs index c5aa70bc..e150f56b 100644 --- a/actix-server/tests/test_server.rs +++ b/actix-server/tests/test_server.rs @@ -4,7 +4,7 @@ use std::{net, thread, time}; use actix_server::Server; use actix_service::fn_service; -use futures::future::{lazy, ok}; +use futures_util::future::{lazy, ok}; use net2::TcpBuilder; fn unused_addr() -> net::SocketAddr { @@ -71,7 +71,7 @@ fn test_start() { use actix_codec::{BytesCodec, Framed}; use actix_rt::net::TcpStream; use bytes::Bytes; - use futures::SinkExt; + use futures_util::sink::SinkExt; use std::io::Read; let addr = unused_addr(); From 4e806b3e3f7e3bc33581b80f3ebb41ceb98aac64 Mon Sep 17 00:00:00 2001 From: Yuki Okushi Date: Thu, 12 Mar 2020 04:30:32 +0900 Subject: [PATCH 10/44] actix-tls: Minimize `futures-*` dependencies --- actix-tls/Cargo.toml | 2 +- actix-tls/src/nativetls.rs | 2 +- actix-tls/src/openssl.rs | 4 ++-- actix-tls/src/rustls.rs | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/actix-tls/Cargo.toml b/actix-tls/Cargo.toml index 58baadc1..0d235e22 100644 --- a/actix-tls/Cargo.toml +++ b/actix-tls/Cargo.toml @@ -38,7 +38,7 @@ actix-utils = "1.0.0" actix-rt = "1.0.0" derive_more = "0.99.2" either = "1.5.2" -futures = "0.3.1" +futures-util = { version = "0.3.4", default-features = false } log = "0.4" # openssl diff --git a/actix-tls/src/nativetls.rs b/actix-tls/src/nativetls.rs index 8b2c7cee..a4780db1 100644 --- a/actix-tls/src/nativetls.rs +++ b/actix-tls/src/nativetls.rs @@ -4,7 +4,7 @@ use std::task::{Context, Poll}; use actix_codec::{AsyncRead, AsyncWrite}; use actix_service::{Service, ServiceFactory}; use actix_utils::counter::Counter; -use futures::future::{self, FutureExt, LocalBoxFuture, TryFutureExt}; +use futures_util::future::{self, FutureExt, LocalBoxFuture, TryFutureExt}; pub use native_tls::Error; pub use tokio_tls::{TlsAcceptor, TlsStream}; diff --git a/actix-tls/src/openssl.rs b/actix-tls/src/openssl.rs index 3da8bfc6..3b98e2fe 100644 --- a/actix-tls/src/openssl.rs +++ b/actix-tls/src/openssl.rs @@ -9,7 +9,7 @@ pub use tokio_openssl::{HandshakeError, SslStream}; use actix_codec::{AsyncRead, AsyncWrite}; use actix_service::{Service, ServiceFactory}; use actix_utils::counter::{Counter, CounterGuard}; -use futures::future::{ok, FutureExt, LocalBoxFuture, Ready}; +use futures_util::future::{ok, FutureExt, LocalBoxFuture, Ready}; use crate::MAX_CONN_COUNTER; @@ -105,7 +105,7 @@ impl Future for AcceptorServiceResponse { type Output = Result, HandshakeError>; fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { - let io = futures::ready!(Pin::new(&mut self.fut).poll(cx))?; + let io = futures_util::ready!(Pin::new(&mut self.fut).poll(cx))?; Poll::Ready(Ok(io)) } } diff --git a/actix-tls/src/rustls.rs b/actix-tls/src/rustls.rs index b71e22a1..4546c24b 100644 --- a/actix-tls/src/rustls.rs +++ b/actix-tls/src/rustls.rs @@ -8,7 +8,7 @@ use std::task::{Context, Poll}; use actix_codec::{AsyncRead, AsyncWrite}; use actix_service::{Service, ServiceFactory}; use actix_utils::counter::{Counter, CounterGuard}; -use futures::future::{ok, Ready}; +use futures_util::future::{ok, Ready}; use tokio_rustls::{Accept, TlsAcceptor}; pub use rust_tls::{ServerConfig, Session}; @@ -108,7 +108,7 @@ impl Future for AcceptorServiceFut { fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { let this = self.get_mut(); - let res = futures::ready!(Pin::new(&mut this.fut).poll(cx)); + let res = futures_util::ready!(Pin::new(&mut this.fut).poll(cx)); match res { Ok(io) => Poll::Ready(Ok(io)), Err(e) => Poll::Ready(Err(e)), From e6b6f08369c06795bcfe77c2ac356acf0b88ce4a Mon Sep 17 00:00:00 2001 From: Yuki Okushi Date: Thu, 12 Mar 2020 04:35:29 +0900 Subject: [PATCH 11/44] actix-utils: Minimize `futures-*` dependencies --- actix-utils/Cargo.toml | 4 +++- actix-utils/src/condition.rs | 2 +- actix-utils/src/either.rs | 2 +- actix-utils/src/framed.rs | 2 +- actix-utils/src/inflight.rs | 4 ++-- actix-utils/src/keepalive.rs | 2 +- actix-utils/src/mpsc.rs | 7 ++++--- actix-utils/src/oneshot.rs | 4 ++-- actix-utils/src/order.rs | 6 +++--- actix-utils/src/stream.rs | 2 +- actix-utils/src/time.rs | 2 +- actix-utils/src/timeout.rs | 4 ++-- 12 files changed, 22 insertions(+), 19 deletions(-) diff --git a/actix-utils/Cargo.toml b/actix-utils/Cargo.toml index 62207b36..4c55da05 100644 --- a/actix-utils/Cargo.toml +++ b/actix-utils/Cargo.toml @@ -22,7 +22,9 @@ actix-codec = "0.2.0" bitflags = "1.2" bytes = "0.5.3" either = "1.5.3" -futures = "0.3.1" +futures-channel = { version = "0.3.4", default-features = false } +futures-sink = { version = "0.3.4", default-features = false } +futures-util = { version = "0.3.4", default-features = false } pin-project = "0.4.6" log = "0.4" slab = "0.4" diff --git a/actix-utils/src/condition.rs b/actix-utils/src/condition.rs index 097034da..fe459cf7 100644 --- a/actix-utils/src/condition.rs +++ b/actix-utils/src/condition.rs @@ -96,7 +96,7 @@ impl Drop for Waiter { #[cfg(test)] mod tests { use super::*; - use futures::future::lazy; + use futures_util::future::lazy; #[actix_rt::test] async fn test_condition() { diff --git a/actix-utils/src/either.rs b/actix-utils/src/either.rs index 0aeecf89..53d6e86e 100644 --- a/actix-utils/src/either.rs +++ b/actix-utils/src/either.rs @@ -3,7 +3,7 @@ use std::pin::Pin; use std::task::{Context, Poll}; use actix_service::{Service, ServiceFactory}; -use futures::{future, ready, Future}; +use futures_util::{future, ready, future::Future}; /// Combine two different service types into a single type. /// diff --git a/actix-utils/src/framed.rs b/actix-utils/src/framed.rs index 9def5992..1663db9d 100644 --- a/actix-utils/src/framed.rs +++ b/actix-utils/src/framed.rs @@ -6,7 +6,7 @@ use std::{fmt, mem}; use actix_codec::{AsyncRead, AsyncWrite, Decoder, Encoder, Framed}; use actix_service::{IntoService, Service}; -use futures::{Future, FutureExt, Stream}; +use futures_util::{future::Future, FutureExt, stream::Stream}; use log::debug; use crate::mpsc; diff --git a/actix-utils/src/inflight.rs b/actix-utils/src/inflight.rs index 3f547db2..f07e4592 100644 --- a/actix-utils/src/inflight.rs +++ b/actix-utils/src/inflight.rs @@ -4,7 +4,7 @@ use std::pin::Pin; use std::task::{Context, Poll}; use actix_service::{IntoService, Service, Transform}; -use futures::future::{ok, Ready}; +use futures_util::future::{ok, Ready}; use super::counter::{Counter, CounterGuard}; @@ -116,7 +116,7 @@ mod tests { use super::*; use actix_service::{apply, fn_factory, Service, ServiceFactory}; - use futures::future::{lazy, ok, FutureExt, LocalBoxFuture}; + use futures_util::future::{lazy, ok, FutureExt, LocalBoxFuture}; struct SleepService(Duration); diff --git a/actix-utils/src/keepalive.rs b/actix-utils/src/keepalive.rs index 9d4f8712..4413dcd5 100644 --- a/actix-utils/src/keepalive.rs +++ b/actix-utils/src/keepalive.rs @@ -7,7 +7,7 @@ use std::time::Duration; use actix_rt::time::{delay_until, Delay, Instant}; use actix_service::{Service, ServiceFactory}; -use futures::future::{ok, Ready}; +use futures_util::future::{ok, Ready}; use super::time::{LowResTime, LowResTimeService}; diff --git a/actix-utils/src/mpsc.rs b/actix-utils/src/mpsc.rs index 07014835..531c9684 100644 --- a/actix-utils/src/mpsc.rs +++ b/actix-utils/src/mpsc.rs @@ -6,7 +6,8 @@ use std::fmt; use std::pin::Pin; use std::task::{Context, Poll}; -use futures::{Sink, Stream}; +use futures_sink::Sink; +use futures_util::stream::Stream; use crate::cell::Cell; use crate::task::LocalWaker; @@ -180,8 +181,8 @@ impl SendError { #[cfg(test)] mod tests { use super::*; - use futures::future::lazy; - use futures::{Stream, StreamExt}; + use futures_util::future::lazy; + use futures_util::{stream::Stream, StreamExt}; #[actix_rt::test] async fn test_mpsc() { diff --git a/actix-utils/src/oneshot.rs b/actix-utils/src/oneshot.rs index 533167c9..9945e5d3 100644 --- a/actix-utils/src/oneshot.rs +++ b/actix-utils/src/oneshot.rs @@ -3,7 +3,7 @@ use std::future::Future; use std::pin::Pin; use std::task::{Context, Poll}; -pub use futures::channel::oneshot::Canceled; +pub use futures_channel::oneshot::Canceled; use slab::Slab; use crate::cell::Cell; @@ -253,7 +253,7 @@ impl Future for PReceiver { #[cfg(test)] mod tests { use super::*; - use futures::future::lazy; + use futures_util::future::lazy; #[actix_rt::test] async fn test_oneshot() { diff --git a/actix-utils/src/order.rs b/actix-utils/src/order.rs index 7dd4e2fc..ba589f30 100644 --- a/actix-utils/src/order.rs +++ b/actix-utils/src/order.rs @@ -8,7 +8,7 @@ use std::rc::Rc; use std::task::{Context, Poll}; use actix_service::{IntoService, Service, Transform}; -use futures::future::{ok, Ready}; +use futures_util::future::{ok, Ready}; use crate::oneshot; use crate::task::LocalWaker; @@ -210,8 +210,8 @@ mod tests { use super::*; use actix_service::Service; - use futures::channel::oneshot; - use futures::future::{lazy, poll_fn, FutureExt, LocalBoxFuture}; + use futures_channel::oneshot; + use futures_util::future::{lazy, poll_fn, FutureExt, LocalBoxFuture}; struct Srv; diff --git a/actix-utils/src/stream.rs b/actix-utils/src/stream.rs index b7f008e4..90df8c2f 100644 --- a/actix-utils/src/stream.rs +++ b/actix-utils/src/stream.rs @@ -3,7 +3,7 @@ use std::pin::Pin; use std::task::{Context, Poll}; use actix_service::{IntoService, Service}; -use futures::{FutureExt, Stream}; +use futures_util::{FutureExt, stream::Stream}; use crate::mpsc; diff --git a/actix-utils/src/time.rs b/actix-utils/src/time.rs index 49d6283a..c7bfa922 100644 --- a/actix-utils/src/time.rs +++ b/actix-utils/src/time.rs @@ -4,7 +4,7 @@ use std::time::{self, Duration, Instant}; use actix_rt::time::delay_for; use actix_service::{Service, ServiceFactory}; -use futures::future::{ok, ready, FutureExt, Ready}; +use futures_util::future::{ok, ready, FutureExt, Ready}; use super::cell::Cell; diff --git a/actix-utils/src/timeout.rs b/actix-utils/src/timeout.rs index cb8c24b4..83fbb84f 100644 --- a/actix-utils/src/timeout.rs +++ b/actix-utils/src/timeout.rs @@ -10,7 +10,7 @@ use std::{fmt, time}; use actix_rt::time::{delay_for, Delay}; use actix_service::{IntoService, Service, Transform}; -use futures::future::{ok, Ready}; +use futures_util::future::{ok, Ready}; /// Applies a timeout to requests. #[derive(Debug)] @@ -183,7 +183,7 @@ mod tests { use super::*; use actix_service::{apply, fn_factory, Service, ServiceFactory}; - use futures::future::{ok, FutureExt, LocalBoxFuture}; + use futures_util::future::{ok, FutureExt, LocalBoxFuture}; struct SleepService(Duration); From fbf7d6ef3371d2a837a97685f9e2417251d96b14 Mon Sep 17 00:00:00 2001 From: Yuki Okushi Date: Thu, 12 Mar 2020 04:35:41 +0900 Subject: [PATCH 12/44] Update examples --- examples/basic.rs | 2 +- examples/ssl.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/basic.rs b/examples/basic.rs index 5ff109d2..3de6d212 100644 --- a/examples/basic.rs +++ b/examples/basic.rs @@ -11,7 +11,7 @@ use actix_codec::{AsyncRead, AsyncWrite}; use actix_rt::System; use actix_server::{Io, Server}; use actix_service::{service_fn, NewService}; -use futures::{future, Future}; +use futures_util::{future, Future}; use openssl::ssl::{SslAcceptor, SslFiletype, SslMethod}; use tokio_openssl::SslAcceptorExt; diff --git a/examples/ssl.rs b/examples/ssl.rs index b7b70f1d..d15ed77a 100644 --- a/examples/ssl.rs +++ b/examples/ssl.rs @@ -7,7 +7,7 @@ use std::sync::{ use actix_rt::System; use actix_server::{ssl, Server}; use actix_service::NewService; -use futures::future; +use futures_util::future; use openssl::ssl::{SslAcceptor, SslFiletype, SslMethod}; #[derive(Debug)] From 3d125c5381e1a77606ac4357cab57962e95fb51f Mon Sep 17 00:00:00 2001 From: Yuki Okushi Date: Thu, 12 Mar 2020 04:37:21 +0900 Subject: [PATCH 13/44] actix-testing: Remove unused deps --- actix-testing/Cargo.toml | 1 - 1 file changed, 1 deletion(-) diff --git a/actix-testing/Cargo.toml b/actix-testing/Cargo.toml index 6c0f96c7..4c1891c9 100644 --- a/actix-testing/Cargo.toml +++ b/actix-testing/Cargo.toml @@ -24,4 +24,3 @@ actix-service = "1.0.0" log = "0.4" net2 = "0.2" -futures = "0.3.1" From 437a7b05c67cb8de64ed9e1ee8ed1ca3927ff93b Mon Sep 17 00:00:00 2001 From: Yuki Okushi Date: Thu, 12 Mar 2020 05:00:41 +0900 Subject: [PATCH 14/44] actix-rt: Fix build --- actix-rt/Cargo.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/actix-rt/Cargo.toml b/actix-rt/Cargo.toml index a7918a99..3f7b50b3 100644 --- a/actix-rt/Cargo.toml +++ b/actix-rt/Cargo.toml @@ -18,7 +18,7 @@ path = "src/lib.rs" [dependencies] actix-macros = "0.1.0" actix-threadpool = "0.3" -futures-channel = { version = "0.3.1", default-features = false } -futures-util = { version = "0.3.1", default-features = false } +futures-channel = { version = "0.3.4", default-features = false } +futures-util = { version = "0.3.4", default-features = false, features = ["alloc"] } copyless = "0.1.4" tokio = { version = "0.2.6", default-features = false, features = ["rt-core", "rt-util", "io-driver", "tcp", "uds", "udp", "time", "signal", "stream"] } From 2792433ad6d77b218fa85d027e00947eb912f8f1 Mon Sep 17 00:00:00 2001 From: Yuki Okushi Date: Thu, 12 Mar 2020 05:02:03 +0900 Subject: [PATCH 15/44] actix-codec: Minimize `futures-*` dependencies --- actix-codec/Cargo.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/actix-codec/Cargo.toml b/actix-codec/Cargo.toml index d647ab70..cab79a9e 100644 --- a/actix-codec/Cargo.toml +++ b/actix-codec/Cargo.toml @@ -19,8 +19,8 @@ path = "src/lib.rs" [dependencies] bitflags = "1.2.1" bytes = "0.5.2" -futures-core = "0.3.1" -futures-sink = "0.3.1" +futures-core = { version = "0.3.4", default-features = false } +futures-sink = { version = "0.3.4", default-features = false } tokio = { version = "0.2.4", default-features=false } tokio-util = { version = "0.2.0", default-features=false, features=["codec"] } log = "0.4" From 08959dfc211040f781a8fe9a95c74f9f2a745266 Mon Sep 17 00:00:00 2001 From: Yuki Okushi Date: Thu, 12 Mar 2020 05:10:08 +0900 Subject: [PATCH 16/44] actix-tracing: Minimize `futures-util` dependencies --- actix-tracing/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/actix-tracing/Cargo.toml b/actix-tracing/Cargo.toml index 055cd11c..a8782361 100644 --- a/actix-tracing/Cargo.toml +++ b/actix-tracing/Cargo.toml @@ -17,7 +17,7 @@ path = "src/lib.rs" [dependencies] actix-service = "1.0.4" -futures-util = "0.3.1" +futures-util = { version = "0.3.4", default-features = false } tracing = "0.1" tracing-futures = "0.2" From 0dd5a7ce1dbfed17c461e7616569072eb79d99d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kornel=20Lesin=CC=81ski?= Date: Fri, 13 Mar 2020 12:35:20 +0000 Subject: [PATCH 17/44] std Error for BlockingError #93 --- actix-threadpool/src/lib.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/actix-threadpool/src/lib.rs b/actix-threadpool/src/lib.rs index beead547..08b563ef 100644 --- a/actix-threadpool/src/lib.rs +++ b/actix-threadpool/src/lib.rs @@ -48,6 +48,8 @@ pub enum BlockingError { Canceled, } +impl std::error::Error for BlockingError {} + /// Execute blocking function on a thread pool, returns future that resolves /// to result of the function execution. pub fn run(f: F) -> CpuFuture From 950c73077c1b9d80431fe282a17d36e755088c22 Mon Sep 17 00:00:00 2001 From: Yuki Okushi Date: Mon, 16 Mar 2020 17:31:10 +0900 Subject: [PATCH 18/44] Revert "Disable windows-mingw builder temporarily" --- .github/workflows/windows-mingw.yml | 54 +++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 .github/workflows/windows-mingw.yml diff --git a/.github/workflows/windows-mingw.yml b/.github/workflows/windows-mingw.yml new file mode 100644 index 00000000..c036d9b5 --- /dev/null +++ b/.github/workflows/windows-mingw.yml @@ -0,0 +1,54 @@ +name: CI (Windows-mingw) + +on: [push, pull_request] + +env: + OPENSSL_DIR: d:\a\_temp\msys\msys64\usr + +jobs: + build_and_test: + strategy: + fail-fast: false + matrix: + version: + - stable + - nightly + + name: ${{ matrix.version }} - x86_64-pc-windows-gnu + runs-on: windows-latest + + steps: + - uses: actions/checkout@master + + - name: Install ${{ matrix.version }} + uses: actions-rs/toolchain@v1 + with: + toolchain: ${{ matrix.version }}-x86_64-pc-windows-gnu + profile: minimal + override: true + + - name: Install MSYS2 + uses: numworks/setup-msys2@v1 + + - name: Install OpenSSL + run: | + msys2do pacman --noconfirm -S openssl-devel pkg-config + + - name: Copy and check libs + run: | + Copy-Item d:\a\_temp\msys\msys64\usr\lib\libssl.dll.a d:\a\_temp\msys\msys64\usr\lib\libssl.dll + Copy-Item d:\a\_temp\msys\msys64\usr\lib\libcrypto.dll.a d:\a\_temp\msys\msys64\usr\lib\libcrypto.dll + Get-ChildItem d:\a\_temp\msys\msys64\usr\lib + Get-ChildItem d:\a\_temp\msys\msys64\usr + + - name: check build + uses: actions-rs/cargo@v1 + with: + command: check + args: --all --bins --examples --tests + + - name: tests + uses: actions-rs/cargo@v1 + with: + command: test + args: --all --all-features --no-fail-fast -- --nocapture From d5f95b54b7862dd95f1cf6a5f3346fec71a5a865 Mon Sep 17 00:00:00 2001 From: Yuki Okushi Date: Wed, 18 Mar 2020 05:03:37 +0900 Subject: [PATCH 19/44] Upload coverage on PRs --- .github/workflows/linux.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/linux.yml b/.github/workflows/linux.yml index b0ee627d..7971e590 100644 --- a/.github/workflows/linux.yml +++ b/.github/workflows/linux.yml @@ -59,16 +59,15 @@ jobs: args: --all --all-features --no-fail-fast -- --nocapture - name: Generate coverage file - if: matrix.version == 'stable' && github.ref == 'refs/heads/master' + if: matrix.version == 'stable' && (github.ref == 'refs/heads/master' || github.event_name == 'pull_request') run: | cargo install cargo-tarpaulin cargo tarpaulin --out Xml --workspace --all-features - name: Upload to Codecov - if: matrix.version == 'stable' && github.ref == 'refs/heads/master' + if: matrix.version == 'stable' && (github.ref == 'refs/heads/master' || github.event_name == 'pull_request') uses: codecov/codecov-action@v1 with: - token: ${{ secrets.CODECOV_TOKEN }} file: cobertura.xml - name: Clear the cargo caches From 30aa0b7bb6c45ce5fa4305168ec4f5708fd133fc Mon Sep 17 00:00:00 2001 From: Nikolay Kim Date: Mon, 30 Mar 2020 11:54:40 +0600 Subject: [PATCH 20/44] add serde support to bytestring --- string/CHANGES.md | 4 ++++ string/Cargo.toml | 6 +++++- string/src/lib.rs | 42 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 51 insertions(+), 1 deletion(-) diff --git a/string/CHANGES.md b/string/CHANGES.md index 53ab9c7a..030c3cd5 100644 --- a/string/CHANGES.md +++ b/string/CHANGES.md @@ -1,5 +1,9 @@ # Changes +## [0.1.5] - 2020-03-30 + +* Serde support + ## [0.1.4] - 2020-01-14 * Fix `AsRef` impl diff --git a/string/Cargo.toml b/string/Cargo.toml index 0031ea5b..cafbaf80 100644 --- a/string/Cargo.toml +++ b/string/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "bytestring" -version = "0.1.4" +version = "0.1.5" authors = ["Nikolay Kim "] description = "A UTF-8 encoded string with Bytes as a storage" keywords = ["actix"] @@ -16,3 +16,7 @@ path = "src/lib.rs" [dependencies] bytes = "0.5.3" +serde = { version = "1.0", optional = true } + +[dev-dependencies] +serde_json = "1.0" \ No newline at end of file diff --git a/string/src/lib.rs b/string/src/lib.rs index 2b600bde..fbc1bf4c 100644 --- a/string/src/lib.rs +++ b/string/src/lib.rs @@ -159,6 +159,34 @@ impl fmt::Display for ByteString { } } +#[cfg(feature = "serde")] +mod serde { + use serde::de::{Deserialize, Deserializer}; + use serde::ser::{Serialize, Serializer}; + + use super::ByteString; + + impl Serialize for ByteString { + #[inline] + fn serialize(&self, serializer: S) -> Result + where + S: Serializer, + { + serializer.serialize_str(self.as_ref()) + } + } + + impl<'de> Deserialize<'de> for ByteString { + #[inline] + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + String::deserialize(deserializer).map(ByteString::from) + } + } +} + #[cfg(test)] mod test { use super::*; @@ -222,4 +250,18 @@ mod test { fn test_try_from_bytesmut() { let _ = ByteString::try_from(bytes::BytesMut::from(&b"nice bytes"[..])).unwrap(); } + + #[cfg(feature = "serde")] + #[test] + fn test_serialize() { + let s: ByteString = serde_json::from_str(r#""nice bytes""#).unwrap(); + assert_eq!(s, "nice bytes"); + } + + #[cfg(feature = "serde")] + #[test] + fn test_deserialize() { + let s = serde_json::to_string(&ByteString::from_static("nice bytes")).unwrap(); + assert_eq!(s, r#""nice bytes""#); + } } From 187a58472dbe2a8ad256c03a92186f7bcf44a4a7 Mon Sep 17 00:00:00 2001 From: Rob Ede Date: Sat, 4 Apr 2020 23:57:52 +0100 Subject: [PATCH 21/44] fix noisy check warning --- router/src/url.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/router/src/url.rs b/router/src/url.rs index 1c068199..189a9e80 100644 --- a/router/src/url.rs +++ b/router/src/url.rs @@ -31,7 +31,7 @@ fn set_bit(array: &mut [u8], ch: u8) { } thread_local! { - static DEFAULT_QUOTER: Quoter = { Quoter::new(b"@:", b"/+") }; + static DEFAULT_QUOTER: Quoter = Quoter::new(b"@:", b"/+"); } #[derive(Default, Clone, Debug)] From 69e8df9d6214f1b66d04bebd6588558c11bacce2 Mon Sep 17 00:00:00 2001 From: Jonathas-Conceicao Date: Sat, 4 Apr 2020 19:03:53 -0300 Subject: [PATCH 22/44] actix-rt: Run rustfmt Signed-off-by: Jonathas-Conceicao --- actix-rt/src/arbiter.rs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/actix-rt/src/arbiter.rs b/actix-rt/src/arbiter.rs index c8c49775..b9fbc51a 100644 --- a/actix-rt/src/arbiter.rs +++ b/actix-rt/src/arbiter.rs @@ -8,7 +8,10 @@ use std::{fmt, thread}; use futures_channel::mpsc::{unbounded, UnboundedReceiver, UnboundedSender}; use futures_channel::oneshot::{channel, Canceled, Sender}; -use futures_util::{future::{self, Future, FutureExt}, stream::Stream}; +use futures_util::{ + future::{self, Future, FutureExt}, + stream::Stream, +}; use crate::runtime::Runtime; use crate::system::System; @@ -180,8 +183,7 @@ impl Arbiter { // Box the future and push it to the queue, this results in double boxing // because the executor boxes the future again, but works for now Q.with(move |cell| { - cell.borrow_mut() - .push(Pin::from(Box::alloc().init(future))) + cell.borrow_mut().push(Pin::from(Box::alloc().init(future))) }); } }); From 783880bb0a053515864dcecf593f1564f8c0c1b2 Mon Sep 17 00:00:00 2001 From: Jonathas-Conceicao Date: Sat, 4 Apr 2020 19:05:08 -0300 Subject: [PATCH 23/44] actix-rt: Add Arbiter::is_running helper and fix System::is_set doc `Arbiter::is_running` can be used to check if the current even-loop is currently running; which should also work after the system has stopped. `System::is_set` was updated to reflect what it actually does, it tells if the event loop has started, which alone can't tell if it has stopped. Signed-off-by: Jonathas-Conceicao --- actix-rt/CHANGES.md | 6 +++++- actix-rt/src/arbiter.rs | 5 +++++ actix-rt/src/system.rs | 2 +- .../{wait_spawned.rs => integration_tests.rs} | 14 ++++++++++++++ 4 files changed, 25 insertions(+), 2 deletions(-) rename actix-rt/tests/{wait_spawned.rs => integration_tests.rs} (90%) diff --git a/actix-rt/CHANGES.md b/actix-rt/CHANGES.md index a95057c2..08497c97 100644 --- a/actix-rt/CHANGES.md +++ b/actix-rt/CHANGES.md @@ -2,7 +2,11 @@ ## [TBD] - [TBD] -- Expose `System::is_set` to check if current system is running +Added + +- Expose `System::is_set` to check if current system has ben started + +- Add `Arbiter::is_running` to check if event loop is running - Add `Arbiter::local_join` associated function to get be able to `await` for spawned futures diff --git a/actix-rt/src/arbiter.rs b/actix-rt/src/arbiter.rs index b9fbc51a..124a5580 100644 --- a/actix-rt/src/arbiter.rs +++ b/actix-rt/src/arbiter.rs @@ -89,6 +89,11 @@ impl Arbiter { }) } + /// Check if current arbiter is running. + pub fn is_running() -> bool { + RUNNING.with(|cell| cell.get()) + } + /// Stop arbiter from continuing it's event loop. pub fn stop(&self) { let _ = self.sender.unbounded_send(ArbiterCommand::Stop); diff --git a/actix-rt/src/system.rs b/actix-rt/src/system.rs index f89fe9f3..21264669 100644 --- a/actix-rt/src/system.rs +++ b/actix-rt/src/system.rs @@ -79,7 +79,7 @@ impl System { }) } - /// Check if current system is running. + /// Check if current system is set, i.e., as already been started. pub fn is_set() -> bool { CURRENT.with(|cell| cell.borrow().is_some()) } diff --git a/actix-rt/tests/wait_spawned.rs b/actix-rt/tests/integration_tests.rs similarity index 90% rename from actix-rt/tests/wait_spawned.rs rename to actix-rt/tests/integration_tests.rs index af5d0224..8e775bab 100644 --- a/actix-rt/tests/wait_spawned.rs +++ b/actix-rt/tests/integration_tests.rs @@ -1,5 +1,19 @@ use std::time::{Duration, Instant}; +#[test] +fn start_and_stop() { + actix_rt::System::new("start_and_stop").block_on(async move { + assert!( + actix_rt::Arbiter::is_running(), + "System doesn't seem to have started" + ); + }); + assert!( + !actix_rt::Arbiter::is_running(), + "System doesn't seem to have stopped" + ); +} + #[test] fn await_for_timer() { let time = Duration::from_secs(2); From 65e2e8052e28b8d67a60673355a8e3decc8c68c1 Mon Sep 17 00:00:00 2001 From: Yuki Okushi Date: Wed, 8 Apr 2020 16:34:07 +0900 Subject: [PATCH 24/44] Release actix-rt 1.1.0 (#126) * Release actix-rt 1.1.0 * Update actix-rt/CHANGES.md --- actix-rt/CHANGES.md | 15 +++++++++------ actix-rt/Cargo.toml | 2 +- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/actix-rt/CHANGES.md b/actix-rt/CHANGES.md index 08497c97..8b80a69d 100644 --- a/actix-rt/CHANGES.md +++ b/actix-rt/CHANGES.md @@ -1,14 +1,17 @@ # Changes -## [TBD] - [TBD] +## [1.1.0] - 2020-04-08 -Added +### Added -- Expose `System::is_set` to check if current system has ben started +* Expose `System::is_set` to check if current system has ben started [#99] +* Add `Arbiter::is_running` to check if event loop is running [#124] +* Add `Arbiter::local_join` associated function + to get be able to `await` for spawned futures [#94] -- Add `Arbiter::is_running` to check if event loop is running - -- Add `Arbiter::local_join` associated function to get be able to `await` for spawned futures +[#94]: https://github.com/actix/actix-net/pull/94 +[#99]: https://github.com/actix/actix-net/pull/99 +[#124]: https://github.com/actix/actix-net/pull/124 ## [1.0.0] - 2019-12-11 diff --git a/actix-rt/Cargo.toml b/actix-rt/Cargo.toml index 3f7b50b3..eb9965e0 100644 --- a/actix-rt/Cargo.toml +++ b/actix-rt/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "actix-rt" -version = "1.0.0" +version = "1.1.0" authors = ["Nikolay Kim "] description = "Actix runtime" keywords = ["network", "framework", "async", "futures"] From aae52a80ab2df410538e62f8bcc0bccc5d9dcd0f Mon Sep 17 00:00:00 2001 From: Ruben De Smet Date: Wed, 8 Apr 2020 16:48:10 +0200 Subject: [PATCH 25/44] Forward actix_rt::test arguments to test function. Previously, ```rust async fn foo(_a: u32) {} ``` would compile to ```rust fn foo() {/* something */} ``` This patches changes this behaviour to ```rust fn foo(_a: u32) {/* something */} ``` by simply forwarding the input arguments. This allows any test fixture library (e.g. `rstest`, cfr. https://github.com/la10736/rstest/issues/85) to integrate with actix::test. --- actix-macros/src/lib.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/actix-macros/src/lib.rs b/actix-macros/src/lib.rs index b6a57b9d..ffd81475 100644 --- a/actix-macros/src/lib.rs +++ b/actix-macros/src/lib.rs @@ -58,6 +58,7 @@ pub fn test(_: TokenStream, item: TokenStream) -> TokenStream { let input = syn::parse_macro_input!(item as syn::ItemFn); let ret = &input.sig.output; + let inputs = &input.sig.inputs; let name = &input.sig.ident; let body = &input.block; let attrs = &input.attrs; @@ -81,7 +82,7 @@ pub fn test(_: TokenStream, item: TokenStream) -> TokenStream { let result = if has_test_attr { quote! { #(#attrs)* - fn #name() #ret { + fn #name(#inputs) #ret { actix_rt::System::new("test") .block_on(async { #body }) } @@ -90,7 +91,7 @@ pub fn test(_: TokenStream, item: TokenStream) -> TokenStream { quote! { #[test] #(#attrs)* - fn #name() #ret { + fn #name(#inputs) #ret { actix_rt::System::new("test") .block_on(async { #body }) } From 06bca19524b73a0bd71b12b752acd35c8916964c Mon Sep 17 00:00:00 2001 From: Jonathas-Conceicao Date: Thu, 9 Apr 2020 20:36:35 -0300 Subject: [PATCH 26/44] actix-rt: Spawn future to cleanup pending JoinHandles Signed-off-by: Jonathas-Conceicao --- actix-rt/src/arbiter.rs | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/actix-rt/src/arbiter.rs b/actix-rt/src/arbiter.rs index 124a5580..cf24ad8e 100644 --- a/actix-rt/src/arbiter.rs +++ b/actix-rt/src/arbiter.rs @@ -183,7 +183,8 @@ impl Arbiter { // Spawn the future on running executor PENDING.with(move |cell| { cell.borrow_mut().push(tokio::task::spawn_local(future)); - }) + }); + tokio::task::spawn_local(CleanupPending); } else { // Box the future and push it to the queue, this results in double boxing // because the executor boxes the future again, but works for now @@ -317,6 +318,30 @@ impl Arbiter { } } +/// Future used for cleaning-up already finished `JoinHandle`s +/// from the `PENDING` list so the vector doesn't grow indefinitely +struct CleanupPending; + +impl Future for CleanupPending { + type Output = (); + + fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { + PENDING.with(move |cell| { + let mut pending = cell.borrow_mut(); + let mut i = 0; + while i != pending.len() { + if let Poll::Ready(_) = Pin::new(&mut pending[i]).poll(cx) { + pending.remove(i); + } else { + i += 1; + } + } + }); + + Poll::Ready(()) + } +} + struct ArbiterController { stop: Option>, rx: UnboundedReceiver, From 6906f25e014ec76869b8e7ebffb1b38590edda3d Mon Sep 17 00:00:00 2001 From: Jonathas-Conceicao Date: Thu, 16 Apr 2020 03:12:00 -0300 Subject: [PATCH 27/44] actix-rt: Set threshold size for arbiter's pending futures list Signed-off-by: Jonathas-Conceicao --- actix-rt/Cargo.toml | 1 + actix-rt/src/arbiter.rs | 26 +++++++++++++++++++------- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/actix-rt/Cargo.toml b/actix-rt/Cargo.toml index eb9965e0..2c0c1b50 100644 --- a/actix-rt/Cargo.toml +++ b/actix-rt/Cargo.toml @@ -21,4 +21,5 @@ actix-threadpool = "0.3" futures-channel = { version = "0.3.4", default-features = false } futures-util = { version = "0.3.4", default-features = false, features = ["alloc"] } copyless = "0.1.4" +smallvec = "1" tokio = { version = "0.2.6", default-features = false, features = ["rt-core", "rt-util", "io-driver", "tcp", "uds", "udp", "time", "signal", "stream"] } diff --git a/actix-rt/src/arbiter.rs b/actix-rt/src/arbiter.rs index cf24ad8e..eff10ca3 100644 --- a/actix-rt/src/arbiter.rs +++ b/actix-rt/src/arbiter.rs @@ -18,13 +18,14 @@ use crate::system::System; use copyless::BoxHelper; +use smallvec::SmallVec; pub use tokio::task::JoinHandle; thread_local!( static ADDR: RefCell> = RefCell::new(None); static RUNNING: Cell = Cell::new(false); static Q: RefCell>>>> = RefCell::new(Vec::new()); - static PENDING: RefCell>> = RefCell::new(Vec::new()); + static PENDING: RefCell; 8]>> = RefCell::new(SmallVec::new()); static STORAGE: RefCell>> = RefCell::new(HashMap::new()); ); @@ -181,10 +182,15 @@ impl Arbiter { RUNNING.with(move |cell| { if cell.get() { // Spawn the future on running executor - PENDING.with(move |cell| { - cell.borrow_mut().push(tokio::task::spawn_local(future)); + let len = PENDING.with(move |cell| { + let mut p = cell.borrow_mut(); + p.push(tokio::task::spawn_local(future)); + p.len() }); - tokio::task::spawn_local(CleanupPending); + if len > 7 { + // Before reaching the inline size + tokio::task::spawn_local(CleanupPending); + } } else { // Box the future and push it to the queue, this results in double boxing // because the executor boxes the future again, but works for now @@ -312,7 +318,7 @@ impl Arbiter { /// have completed. pub fn local_join() -> impl Future { PENDING.with(move |cell| { - let current = cell.replace(Vec::new()); + let current = cell.replace(SmallVec::new()); future::join_all(current).map(|_| ()) }) } @@ -375,9 +381,15 @@ impl Future for ArbiterController { return Poll::Ready(()); } ArbiterCommand::Execute(fut) => { - PENDING.with(move |cell| { - cell.borrow_mut().push(tokio::task::spawn_local(fut)); + let len = PENDING.with(move |cell| { + let mut p = cell.borrow_mut(); + p.push(tokio::task::spawn_local(fut)); + p.len() }); + if len > 7 { + // Before reaching the inline size + tokio::task::spawn_local(CleanupPending); + } } ArbiterCommand::ExecuteFn(f) => { f.call_box(); From c0482e25322bcd372a6e5c6fe7c9a51df638e7d0 Mon Sep 17 00:00:00 2001 From: Yuki Okushi Date: Mon, 20 Apr 2020 08:02:08 +0900 Subject: [PATCH 28/44] Remove unnecessary clone usage --- actix-server/src/config.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/actix-server/src/config.rs b/actix-server/src/config.rs index e09a567b..65f19884 100644 --- a/actix-server/src/config.rs +++ b/actix-server/src/config.rs @@ -218,7 +218,7 @@ impl ServiceRuntime { // let name = name.to_owned(); if let Some(token) = self.names.get(name) { self.services.insert( - token.clone(), + *token, Box::new(ServiceFactory { inner: service.into_factory(), }), From e35c261c9fe609bbb779ad5ca4298b101575ac77 Mon Sep 17 00:00:00 2001 From: Daniel Pintara Date: Wed, 22 Apr 2020 00:11:48 +0700 Subject: [PATCH 29/44] actix-macros: test: Simplify by using #sig instead of #name(#inputs) #ret --- actix-macros/src/lib.rs | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/actix-macros/src/lib.rs b/actix-macros/src/lib.rs index ffd81475..04c374a5 100644 --- a/actix-macros/src/lib.rs +++ b/actix-macros/src/lib.rs @@ -55,13 +55,11 @@ pub fn main(_: TokenStream, item: TokenStream) -> TokenStream { /// ``` #[proc_macro_attribute] pub fn test(_: TokenStream, item: TokenStream) -> TokenStream { - let input = syn::parse_macro_input!(item as syn::ItemFn); - - let ret = &input.sig.output; - let inputs = &input.sig.inputs; - let name = &input.sig.ident; - let body = &input.block; + let mut input = syn::parse_macro_input!(item as syn::ItemFn); let attrs = &input.attrs; + let vis = &input.vis; + let sig = &mut input.sig; + let body = &input.block; let mut has_test_attr = false; for attr in attrs { @@ -70,7 +68,7 @@ pub fn test(_: TokenStream, item: TokenStream) -> TokenStream { } } - if input.sig.asyncness.is_none() { + if sig.asyncness.is_none() { return syn::Error::new_spanned( input.sig.fn_token, format!("only async fn is supported, {}", input.sig.ident), @@ -79,10 +77,12 @@ pub fn test(_: TokenStream, item: TokenStream) -> TokenStream { .into(); } + sig.asyncness = None; + let result = if has_test_attr { quote! { #(#attrs)* - fn #name(#inputs) #ret { + #vis #sig { actix_rt::System::new("test") .block_on(async { #body }) } @@ -91,7 +91,7 @@ pub fn test(_: TokenStream, item: TokenStream) -> TokenStream { quote! { #[test] #(#attrs)* - fn #name(#inputs) #ret { + #vis #sig { actix_rt::System::new("test") .block_on(async { #body }) } From 4c5568ed70a54de94e4a41be8054d96fc053ff70 Mon Sep 17 00:00:00 2001 From: Rob Ede Date: Sun, 26 Apr 2020 20:11:16 +0100 Subject: [PATCH 30/44] add trybuild compile tests --- actix-macros/.gitignore | 1 + actix-macros/Cargo.toml | 6 ++++-- actix-macros/tests/trybuild.rs | 9 +++++++++ actix-macros/tests/trybuild/main-01-basic.rs | 4 ++++ actix-macros/tests/trybuild/main-02-only-async.rs | 4 ++++ .../tests/trybuild/main-02-only-async.stderr | 14 ++++++++++++++ actix-macros/tests/trybuild/test-01-basic.rs | 6 ++++++ actix-macros/tests/trybuild/test-02-keep-attrs.rs | 7 +++++++ string/src/lib.rs | 5 +++-- 9 files changed, 52 insertions(+), 4 deletions(-) create mode 100644 actix-macros/.gitignore create mode 100644 actix-macros/tests/trybuild.rs create mode 100644 actix-macros/tests/trybuild/main-01-basic.rs create mode 100644 actix-macros/tests/trybuild/main-02-only-async.rs create mode 100644 actix-macros/tests/trybuild/main-02-only-async.stderr create mode 100644 actix-macros/tests/trybuild/test-01-basic.rs create mode 100644 actix-macros/tests/trybuild/test-02-keep-attrs.rs diff --git a/actix-macros/.gitignore b/actix-macros/.gitignore new file mode 100644 index 00000000..b619655b --- /dev/null +++ b/actix-macros/.gitignore @@ -0,0 +1 @@ +/wip diff --git a/actix-macros/Cargo.toml b/actix-macros/Cargo.toml index eb72e52c..16f35527 100644 --- a/actix-macros/Cargo.toml +++ b/actix-macros/Cargo.toml @@ -8,7 +8,6 @@ documentation = "https://docs.rs/actix-macros/" categories = ["network-programming", "asynchronous"] license = "MIT/Apache-2.0" edition = "2018" -workspace = ".." [lib] proc-macro = true @@ -18,4 +17,7 @@ quote = "1.0.3" syn = { version = "^1", features = ["full"] } [dev-dependencies] -actix-rt = { version = "1.0.0" } +actix-rt = "1.0" + +futures = "0.3" +trybuild = "1" diff --git a/actix-macros/tests/trybuild.rs b/actix-macros/tests/trybuild.rs new file mode 100644 index 00000000..d944e3a2 --- /dev/null +++ b/actix-macros/tests/trybuild.rs @@ -0,0 +1,9 @@ +#[test] +fn compile_macros() { + let t = trybuild::TestCases::new(); + t.pass("tests/trybuild/main-01-basic.rs"); + t.compile_fail("tests/trybuild/main-02-only-async.rs"); + + t.pass("tests/trybuild/test-01-basic.rs"); + t.pass("tests/trybuild/test-02-keep-attrs.rs"); +} diff --git a/actix-macros/tests/trybuild/main-01-basic.rs b/actix-macros/tests/trybuild/main-01-basic.rs new file mode 100644 index 00000000..8bb86a81 --- /dev/null +++ b/actix-macros/tests/trybuild/main-01-basic.rs @@ -0,0 +1,4 @@ +#[actix_rt::main] +async fn main() { + println!("Hello world"); +} diff --git a/actix-macros/tests/trybuild/main-02-only-async.rs b/actix-macros/tests/trybuild/main-02-only-async.rs new file mode 100644 index 00000000..2c60c259 --- /dev/null +++ b/actix-macros/tests/trybuild/main-02-only-async.rs @@ -0,0 +1,4 @@ +#[actix_rt::main] +fn main() { + futures::future::ready(()).await +} diff --git a/actix-macros/tests/trybuild/main-02-only-async.stderr b/actix-macros/tests/trybuild/main-02-only-async.stderr new file mode 100644 index 00000000..6f71caef --- /dev/null +++ b/actix-macros/tests/trybuild/main-02-only-async.stderr @@ -0,0 +1,14 @@ +error: only async fn is supported + --> $DIR/main-02-only-async.rs:2:1 + | +2 | fn main() { + | ^^ + +error[E0601]: `main` function not found in crate `$CRATE` + --> $DIR/main-02-only-async.rs:1:1 + | +1 | / #[actix_rt::main] +2 | | fn main() { +3 | | futures::future::ready(()).await +4 | | } + | |_^ consider adding a `main` function to `$DIR/tests/trybuild/main-02-only-async.rs` diff --git a/actix-macros/tests/trybuild/test-01-basic.rs b/actix-macros/tests/trybuild/test-01-basic.rs new file mode 100644 index 00000000..8339a969 --- /dev/null +++ b/actix-macros/tests/trybuild/test-01-basic.rs @@ -0,0 +1,6 @@ +#[actix_rt::test] +async fn my_test() { + assert!(true); +} + +fn main() {} diff --git a/actix-macros/tests/trybuild/test-02-keep-attrs.rs b/actix-macros/tests/trybuild/test-02-keep-attrs.rs new file mode 100644 index 00000000..22c98d55 --- /dev/null +++ b/actix-macros/tests/trybuild/test-02-keep-attrs.rs @@ -0,0 +1,7 @@ +#[actix_rt::test] +#[should_panic] +async fn my_test() { + todo!() +} + +fn main() {} diff --git a/string/src/lib.rs b/string/src/lib.rs index fbc1bf4c..7695c6fc 100644 --- a/string/src/lib.rs +++ b/string/src/lib.rs @@ -1,10 +1,11 @@ -//! A utl-8 encoded read-only string with Bytes as a storage. +//! A UTF-8 encoded read-only string using Bytes as storage. + use std::convert::TryFrom; use std::{borrow, fmt, hash, ops, str}; use bytes::Bytes; -/// A utf-8 encoded string with [`Bytes`] as a storage. +/// A UTF-8 encoded string with [`Bytes`] as a storage. /// /// [`Bytes`]: https://docs.rs/bytes/0.5.3/bytes/struct.Bytes.html #[derive(Clone, Eq, Ord, PartialOrd, Default)] From 8a10580663eb521e4971fce90d5612b4a2206bc3 Mon Sep 17 00:00:00 2001 From: Yuki Okushi Date: Thu, 30 Apr 2020 03:07:12 +0900 Subject: [PATCH 31/44] Bump up `actix-rt` to 1.1.1 --- actix-rt/CHANGES.md | 10 ++++++++++ actix-rt/Cargo.toml | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/actix-rt/CHANGES.md b/actix-rt/CHANGES.md index 8b80a69d..518a68ac 100644 --- a/actix-rt/CHANGES.md +++ b/actix-rt/CHANGES.md @@ -1,7 +1,17 @@ # Changes +## [1.1.1] - 2020-04-30 + +### Fixed + +* Fix memory leak due to [#94] (see [#129] for more detail) + +[#129]: https://github.com/actix/actix-net/issues/129 + ## [1.1.0] - 2020-04-08 +**This version has been yanked.** + ### Added * Expose `System::is_set` to check if current system has ben started [#99] diff --git a/actix-rt/Cargo.toml b/actix-rt/Cargo.toml index 2c0c1b50..9b1cd53f 100644 --- a/actix-rt/Cargo.toml +++ b/actix-rt/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "actix-rt" -version = "1.1.0" +version = "1.1.1" authors = ["Nikolay Kim "] description = "Actix runtime" keywords = ["network", "framework", "async", "futures"] From 523cee0351a5e1d9a5390789c6d54aaa6585830d Mon Sep 17 00:00:00 2001 From: Rob Ede Date: Sun, 3 May 2020 23:14:22 +0100 Subject: [PATCH 32/44] correct spelling of ConnectError::Unresolved --- actix-connect/CHANGES.md | 6 ++++++ actix-connect/src/connector.rs | 2 +- actix-connect/src/error.rs | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/actix-connect/CHANGES.md b/actix-connect/CHANGES.md index cd1dc373..647658ae 100644 --- a/actix-connect/CHANGES.md +++ b/actix-connect/CHANGES.md @@ -1,5 +1,11 @@ # Changes +## [Unreleased] + +### Fixed + +* Corrected spelling of `ConnectError::Unresolverd` to `ConnectError::Unresolved` + ## [2.0.0-alpha.2] - 2020-03-08 ### Changed diff --git a/actix-connect/src/connector.rs b/actix-connect/src/connector.rs index d631d684..e9fb1525 100644 --- a/actix-connect/src/connector.rs +++ b/actix-connect/src/connector.rs @@ -88,7 +88,7 @@ impl Service for TcpConnector { Either::Left(TcpConnectorResponse::new(req, port, addr)) } else { error!("TCP connector: got unresolved address"); - Either::Right(err(ConnectError::Unresolverd)) + Either::Right(err(ConnectError::Unresolved)) } } } diff --git a/actix-connect/src/error.rs b/actix-connect/src/error.rs index 30946459..3c56f072 100644 --- a/actix-connect/src/error.rs +++ b/actix-connect/src/error.rs @@ -18,7 +18,7 @@ pub enum ConnectError { /// Unresolved host name #[display(fmt = "Connector received `Connect` method with unresolved host")] - Unresolverd, + Unresolved, /// Connection io error #[display(fmt = "{}", _0)] From b125e2bdce60584d34972aabd4af5291b4139735 Mon Sep 17 00:00:00 2001 From: Yuki Okushi Date: Fri, 8 May 2020 01:07:57 +0900 Subject: [PATCH 33/44] actix-connect: Bump up to 2.0.0-alpha.3 --- actix-connect/CHANGES.md | 2 +- actix-connect/Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/actix-connect/CHANGES.md b/actix-connect/CHANGES.md index 647658ae..7a230fe9 100644 --- a/actix-connect/CHANGES.md +++ b/actix-connect/CHANGES.md @@ -1,6 +1,6 @@ # Changes -## [Unreleased] +## [2.0.0-alpha.3] - 2020-05-08 ### Fixed diff --git a/actix-connect/Cargo.toml b/actix-connect/Cargo.toml index 739dfee8..bd72b22e 100644 --- a/actix-connect/Cargo.toml +++ b/actix-connect/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "actix-connect" -version = "2.0.0-alpha.2" +version = "2.0.0-alpha.3" authors = ["Nikolay Kim "] description = "Actix connect - tcp connector service" keywords = ["network", "framework", "async", "futures"] From f59ff8239517d8ef29b87c2f982e1782d6912703 Mon Sep 17 00:00:00 2001 From: Yuki Okushi Date: Mon, 18 May 2020 15:36:23 +0900 Subject: [PATCH 34/44] macros: Bump up to 0.1.2 --- actix-macros/CHANGES.md | 9 +++++++++ actix-macros/Cargo.toml | 4 ++-- actix-macros/tests/trybuild/main-02-only-async.rs | 2 +- actix-macros/tests/trybuild/main-02-only-async.stderr | 2 +- 4 files changed, 13 insertions(+), 4 deletions(-) create mode 100644 actix-macros/CHANGES.md diff --git a/actix-macros/CHANGES.md b/actix-macros/CHANGES.md new file mode 100644 index 00000000..7b89882e --- /dev/null +++ b/actix-macros/CHANGES.md @@ -0,0 +1,9 @@ +# CHANGES + +## 0.1.2 - 2020-05-18 + +### Changed + +* Forward actix_rt::test arguments to test function [#127] + +[#127]: https://github.com/actix/actix-net/pull/127 diff --git a/actix-macros/Cargo.toml b/actix-macros/Cargo.toml index 16f35527..a8527673 100644 --- a/actix-macros/Cargo.toml +++ b/actix-macros/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "actix-macros" -version = "0.1.1" +version = "0.1.2" authors = ["Nikolay Kim "] description = "Actix runtime macros" repository = "https://github.com/actix/actix-net" @@ -19,5 +19,5 @@ syn = { version = "^1", features = ["full"] } [dev-dependencies] actix-rt = "1.0" -futures = "0.3" +futures-util = { version = "0.3", default-features = false } trybuild = "1" diff --git a/actix-macros/tests/trybuild/main-02-only-async.rs b/actix-macros/tests/trybuild/main-02-only-async.rs index 2c60c259..63c1b788 100644 --- a/actix-macros/tests/trybuild/main-02-only-async.rs +++ b/actix-macros/tests/trybuild/main-02-only-async.rs @@ -1,4 +1,4 @@ #[actix_rt::main] fn main() { - futures::future::ready(()).await + futures_util::future::ready(()).await } diff --git a/actix-macros/tests/trybuild/main-02-only-async.stderr b/actix-macros/tests/trybuild/main-02-only-async.stderr index 6f71caef..e5e44492 100644 --- a/actix-macros/tests/trybuild/main-02-only-async.stderr +++ b/actix-macros/tests/trybuild/main-02-only-async.stderr @@ -9,6 +9,6 @@ error[E0601]: `main` function not found in crate `$CRATE` | 1 | / #[actix_rt::main] 2 | | fn main() { -3 | | futures::future::ready(()).await +3 | | futures_util::future::ready(()).await 4 | | } | |_^ consider adding a `main` function to `$DIR/tests/trybuild/main-02-only-async.rs` From 8218a098e8fc4d7bded7e38218b74345ee60d3f3 Mon Sep 17 00:00:00 2001 From: Yuki Okushi Date: Tue, 19 May 2020 08:17:44 +0900 Subject: [PATCH 35/44] server: Replace `net2` crate with `socket2` --- actix-server/CHANGES.md | 6 ++++++ actix-server/Cargo.toml | 2 +- actix-server/src/builder.rs | 16 +++++++++------- actix-server/tests/test_server.rs | 10 +++++----- 4 files changed, 21 insertions(+), 13 deletions(-) diff --git a/actix-server/CHANGES.md b/actix-server/CHANGES.md index 127e7262..7ec1c1b3 100644 --- a/actix-server/CHANGES.md +++ b/actix-server/CHANGES.md @@ -1,5 +1,11 @@ # Changes +## [Unreleased] + +### Changed + +* Replace deprecated `net2` crate with `socket2` + ## [1.0.2] - 2020-02-26 ### Fixed diff --git a/actix-server/Cargo.toml b/actix-server/Cargo.toml index bf9ee344..f6dd8b61 100644 --- a/actix-server/Cargo.toml +++ b/actix-server/Cargo.toml @@ -29,7 +29,7 @@ actix-utils = "1.0.4" log = "0.4" num_cpus = "1.11" mio = "0.6.19" -net2 = "0.2" +socket2 = "0.3" futures-channel = { version = "0.3.4", default-features = false } futures-util = { version = "0.3.4", default-features = false, features = ["sink"] } slab = "0.4" diff --git a/actix-server/src/builder.rs b/actix-server/src/builder.rs index 27475cfc..d43657f2 100644 --- a/actix-server/src/builder.rs +++ b/actix-server/src/builder.rs @@ -12,7 +12,7 @@ use futures_util::future::ready; use futures_util::stream::FuturesUnordered; use futures_util::{ready, future::Future, FutureExt, stream::Stream, StreamExt}; use log::{error, info}; -use net2::TcpBuilder; +use socket2::{Domain, Protocol, Socket, Type}; use crate::accept::{AcceptLoop, AcceptNotify, Command}; use crate::config::{ConfiguredService, ServiceConfig}; @@ -487,11 +487,13 @@ pub(super) fn bind_addr( } fn create_tcp_listener(addr: net::SocketAddr, backlog: i32) -> io::Result { - let builder = match addr { - net::SocketAddr::V4(_) => TcpBuilder::new_v4()?, - net::SocketAddr::V6(_) => TcpBuilder::new_v6()?, + let domain = match addr { + net::SocketAddr::V4(_) => Domain::ipv4(), + net::SocketAddr::V6(_) => Domain::ipv6(), }; - builder.reuse_address(true)?; - builder.bind(addr)?; - Ok(builder.listen(backlog)?) + let socket = Socket::new(domain, Type::stream(), Some(Protocol::tcp()))?; + socket.set_reuse_address(true)?; + socket.bind(&addr.into())?; + socket.listen(backlog)?; + Ok(socket.into_tcp_listener()) } diff --git a/actix-server/tests/test_server.rs b/actix-server/tests/test_server.rs index e150f56b..0e9f7b6d 100644 --- a/actix-server/tests/test_server.rs +++ b/actix-server/tests/test_server.rs @@ -5,14 +5,14 @@ use std::{net, thread, time}; use actix_server::Server; use actix_service::fn_service; use futures_util::future::{lazy, ok}; -use net2::TcpBuilder; +use socket2::{Domain, Protocol, Socket, Type}; fn unused_addr() -> net::SocketAddr { let addr: net::SocketAddr = "127.0.0.1:0".parse().unwrap(); - let socket = TcpBuilder::new_v4().unwrap(); - socket.bind(&addr).unwrap(); - socket.reuse_address(true).unwrap(); - let tcp = socket.to_tcp_listener().unwrap(); + let socket = Socket::new(Domain::ipv4(), Type::stream(), Some(Protocol::tcp())).unwrap(); + socket.bind(&addr.into()).unwrap(); + socket.set_reuse_address(true).unwrap(); + let tcp = socket.into_tcp_listener(); tcp.local_addr().unwrap() } From ac6c78c476f4cd8a8f670bf6ee9b14d313e56a47 Mon Sep 17 00:00:00 2001 From: Yuki Okushi Date: Tue, 19 May 2020 08:21:40 +0900 Subject: [PATCH 36/44] testing: Replace `net2` crate with `socket2` --- actix-testing/CHANGES.md | 4 ++++ actix-testing/Cargo.toml | 2 +- actix-testing/src/lib.rs | 10 +++++----- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/actix-testing/CHANGES.md b/actix-testing/CHANGES.md index cc37a085..96328c16 100644 --- a/actix-testing/CHANGES.md +++ b/actix-testing/CHANGES.md @@ -1,5 +1,9 @@ # Changes +## [Unreleased] + +* Replace deprecated `net2` crate with `socket2` + ## [1.0.0] - 2019-12-11 * Update actix-server to 1.0.0 diff --git a/actix-testing/Cargo.toml b/actix-testing/Cargo.toml index 4c1891c9..f30f973b 100644 --- a/actix-testing/Cargo.toml +++ b/actix-testing/Cargo.toml @@ -23,4 +23,4 @@ actix-server = "1.0.0" actix-service = "1.0.0" log = "0.4" -net2 = "0.2" +socket2 = "0.3" diff --git a/actix-testing/src/lib.rs b/actix-testing/src/lib.rs index c1e192e1..c9f6799f 100644 --- a/actix-testing/src/lib.rs +++ b/actix-testing/src/lib.rs @@ -7,7 +7,7 @@ use std::{net, thread}; use actix_rt::{net::TcpStream, System}; use actix_server::{Server, ServerBuilder, ServiceFactory}; -use net2::TcpBuilder; +use socket2::{Domain, Protocol, Socket, Type}; #[cfg(not(test))] // Work around for rust-lang/rust#62127 pub use actix_macros::test; @@ -110,10 +110,10 @@ impl TestServer { /// Get firat available unused local address pub fn unused_addr() -> net::SocketAddr { let addr: net::SocketAddr = "127.0.0.1:0".parse().unwrap(); - let socket = TcpBuilder::new_v4().unwrap(); - socket.bind(&addr).unwrap(); - socket.reuse_address(true).unwrap(); - let tcp = socket.to_tcp_listener().unwrap(); + let socket = Socket::new(Domain::ipv4(), Type::stream(), Some(Protocol::tcp())).unwrap(); + socket.bind(&addr.into()).unwrap(); + socket.set_reuse_address(true).unwrap(); + let tcp = socket.into_tcp_listener(); tcp.local_addr().unwrap() } } From 2395b28c5ef7546222cfce9b4c328102ee71ca1a Mon Sep 17 00:00:00 2001 From: Yuki Okushi Date: Tue, 19 May 2020 08:42:56 +0900 Subject: [PATCH 37/44] Only check compilation on mingw CI Disabled to run tests since somehow linking with OpenSSL is broken. --- .github/workflows/windows-mingw.yml | 21 +++------------------ 1 file changed, 3 insertions(+), 18 deletions(-) diff --git a/.github/workflows/windows-mingw.yml b/.github/workflows/windows-mingw.yml index c036d9b5..9f6ea51d 100644 --- a/.github/workflows/windows-mingw.yml +++ b/.github/workflows/windows-mingw.yml @@ -2,9 +2,6 @@ name: CI (Windows-mingw) on: [push, pull_request] -env: - OPENSSL_DIR: d:\a\_temp\msys\msys64\usr - jobs: build_and_test: strategy: @@ -30,25 +27,13 @@ jobs: - name: Install MSYS2 uses: numworks/setup-msys2@v1 - - name: Install OpenSSL + - name: Install packages run: | - msys2do pacman --noconfirm -S openssl-devel pkg-config - - - name: Copy and check libs - run: | - Copy-Item d:\a\_temp\msys\msys64\usr\lib\libssl.dll.a d:\a\_temp\msys\msys64\usr\lib\libssl.dll - Copy-Item d:\a\_temp\msys\msys64\usr\lib\libcrypto.dll.a d:\a\_temp\msys\msys64\usr\lib\libcrypto.dll - Get-ChildItem d:\a\_temp\msys\msys64\usr\lib - Get-ChildItem d:\a\_temp\msys\msys64\usr + msys2do pacman -Sy --noconfirm pacman + msys2do pacman --noconfirm -S base-devel pkg-config - name: check build uses: actions-rs/cargo@v1 with: command: check args: --all --bins --examples --tests - - - name: tests - uses: actions-rs/cargo@v1 - with: - command: test - args: --all --all-features --no-fail-fast -- --nocapture From abbc5f715fa576c74fe00c0d8ea3fe746b1d7757 Mon Sep 17 00:00:00 2001 From: Yuki Okushi Date: Tue, 19 May 2020 10:20:32 +0900 Subject: [PATCH 38/44] server: Bump up to 1.0.3 --- actix-server/CHANGES.md | 6 ++++-- actix-server/Cargo.toml | 4 ++-- actix-server/src/builder.rs | 4 ++-- actix-server/src/worker.rs | 2 +- actix-server/tests/test_server.rs | 10 ++++------ 5 files changed, 13 insertions(+), 13 deletions(-) diff --git a/actix-server/CHANGES.md b/actix-server/CHANGES.md index 7ec1c1b3..067adcd6 100644 --- a/actix-server/CHANGES.md +++ b/actix-server/CHANGES.md @@ -1,10 +1,12 @@ # Changes -## [Unreleased] +## [1.0.3] - 2020-05-19 ### Changed -* Replace deprecated `net2` crate with `socket2` +* Replace deprecated `net2` crate with `socket2` [#140] + +[#140]: https://github.com/actix/actix-net/pull/140 ## [1.0.2] - 2020-02-26 diff --git a/actix-server/Cargo.toml b/actix-server/Cargo.toml index f6dd8b61..7d584aba 100644 --- a/actix-server/Cargo.toml +++ b/actix-server/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "actix-server" -version = "1.0.2" +version = "1.0.3" authors = ["Nikolay Kim "] description = "Actix server - General purpose tcp server" keywords = ["network", "framework", "async", "futures"] @@ -9,7 +9,7 @@ repository = "https://github.com/actix/actix-net.git" documentation = "https://docs.rs/actix-server/" categories = ["network-programming", "asynchronous"] license = "MIT/Apache-2.0" -exclude = [".gitignore", ".travis.yml", ".cargo/config", "appveyor.yml"] +exclude = [".gitignore", ".cargo/config"] edition = "2018" workspace = ".." diff --git a/actix-server/src/builder.rs b/actix-server/src/builder.rs index d43657f2..2e8ae30e 100644 --- a/actix-server/src/builder.rs +++ b/actix-server/src/builder.rs @@ -10,7 +10,7 @@ use futures_channel::mpsc::{unbounded, UnboundedReceiver}; use futures_channel::oneshot; use futures_util::future::ready; use futures_util::stream::FuturesUnordered; -use futures_util::{ready, future::Future, FutureExt, stream::Stream, StreamExt}; +use futures_util::{future::Future, ready, stream::Stream, FutureExt, StreamExt}; use log::{error, info}; use socket2::{Domain, Protocol, Socket, Type}; @@ -381,7 +381,7 @@ impl ServerBuilder { .await; System::current().stop(); } - .boxed(), + .boxed(), ); } ready(()) diff --git a/actix-server/src/worker.rs b/actix-server/src/worker.rs index 820a79bf..4ae3e4f3 100644 --- a/actix-server/src/worker.rs +++ b/actix-server/src/worker.rs @@ -10,7 +10,7 @@ use actix_utils::counter::Counter; use futures_channel::mpsc::{unbounded, UnboundedReceiver, UnboundedSender}; use futures_channel::oneshot; use futures_util::future::{join_all, LocalBoxFuture, MapOk}; -use futures_util::{future::Future, FutureExt, stream::Stream, TryFutureExt}; +use futures_util::{future::Future, stream::Stream, FutureExt, TryFutureExt}; use log::{error, info, trace}; use crate::accept::AcceptNotify; diff --git a/actix-server/tests/test_server.rs b/actix-server/tests/test_server.rs index 0e9f7b6d..ce309c94 100644 --- a/actix-server/tests/test_server.rs +++ b/actix-server/tests/test_server.rs @@ -83,12 +83,10 @@ fn test_start() { .backlog(100) .disable_signals() .bind("test", addr, move || { - fn_service(|io: TcpStream| { - async move { - let mut f = Framed::new(io, BytesCodec); - f.send(Bytes::from_static(b"test")).await.unwrap(); - Ok::<_, ()>(()) - } + fn_service(|io: TcpStream| async move { + let mut f = Framed::new(io, BytesCodec); + f.send(Bytes::from_static(b"test")).await.unwrap(); + Ok::<_, ()>(()) }) }) .unwrap() From d0b27ee7e6d9ff336d2a1d83bfd3b38db8051c79 Mon Sep 17 00:00:00 2001 From: Yuki Okushi Date: Tue, 19 May 2020 14:08:08 +0900 Subject: [PATCH 39/44] testing: Bump up to 1.0.1 --- actix-testing/CHANGES.md | 4 +++- actix-testing/Cargo.toml | 3 ++- actix-testing/src/lib.rs | 3 ++- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/actix-testing/CHANGES.md b/actix-testing/CHANGES.md index 96328c16..86a79ed7 100644 --- a/actix-testing/CHANGES.md +++ b/actix-testing/CHANGES.md @@ -1,9 +1,11 @@ # Changes -## [Unreleased] +## [1.0.1] - 2020-05-19 * Replace deprecated `net2` crate with `socket2` +* Remove unused `futures` dependency + ## [1.0.0] - 2019-12-11 * Update actix-server to 1.0.0 diff --git a/actix-testing/Cargo.toml b/actix-testing/Cargo.toml index f30f973b..8646440d 100644 --- a/actix-testing/Cargo.toml +++ b/actix-testing/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "actix-testing" -version = "1.0.0" +version = "1.0.1" authors = ["Nikolay Kim "] description = "Actix testing utils" keywords = ["network", "framework", "async", "futures"] @@ -11,6 +11,7 @@ categories = ["network-programming", "asynchronous"] license = "MIT/Apache-2.0" edition = "2018" workspace = ".." +readme = "README.md" [lib] name = "actix_testing" diff --git a/actix-testing/src/lib.rs b/actix-testing/src/lib.rs index c9f6799f..5b0113e1 100644 --- a/actix-testing/src/lib.rs +++ b/actix-testing/src/lib.rs @@ -110,7 +110,8 @@ impl TestServer { /// Get firat available unused local address pub fn unused_addr() -> net::SocketAddr { let addr: net::SocketAddr = "127.0.0.1:0".parse().unwrap(); - let socket = Socket::new(Domain::ipv4(), Type::stream(), Some(Protocol::tcp())).unwrap(); + let socket = + Socket::new(Domain::ipv4(), Type::stream(), Some(Protocol::tcp())).unwrap(); socket.bind(&addr.into()).unwrap(); socket.set_reuse_address(true).unwrap(); let tcp = socket.into_tcp_listener(); From f7e8a912b39752bd18799c1c374c9c1c58cadf56 Mon Sep 17 00:00:00 2001 From: Yuki Okushi Date: Tue, 19 May 2020 14:45:39 +0900 Subject: [PATCH 40/44] Add codecov config --- codecov.yml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 codecov.yml diff --git a/codecov.yml b/codecov.yml new file mode 100644 index 00000000..d54a4f9a --- /dev/null +++ b/codecov.yml @@ -0,0 +1,14 @@ +coverage: + status: + project: + default: + threshold: 10% # make CI green + patch: + default: + threshold: 10% # make CI green + +ignore: # ignore codecoverage on following paths + - "examples" + - ".github" + - "**/*.md" + - "**/*.toml" From 134e76b8b4ff49b594d62d921f43548083750c50 Mon Sep 17 00:00:00 2001 From: Yuki Okushi Date: Wed, 20 May 2020 14:19:16 +0900 Subject: [PATCH 41/44] threadpool: Bump up to 0.3.2 --- actix-threadpool/CHANGES.md | 8 ++++++++ actix-threadpool/Cargo.toml | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/actix-threadpool/CHANGES.md b/actix-threadpool/CHANGES.md index dd10210f..6b4cd429 100644 --- a/actix-threadpool/CHANGES.md +++ b/actix-threadpool/CHANGES.md @@ -1,5 +1,13 @@ # Changes +## [0.3.2] - 2020-05-20 + +## Added + +* Implement `std::error::Error` for `BlockingError` [#120] + +[#120]: https://github.com/actix/actix-net/pull/120 + ## [0.3.1] - 2019-12-12 ### Changed diff --git a/actix-threadpool/Cargo.toml b/actix-threadpool/Cargo.toml index 36f9acfb..5b21ba45 100644 --- a/actix-threadpool/Cargo.toml +++ b/actix-threadpool/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "actix-threadpool" -version = "0.3.1" +version = "0.3.2" authors = ["Nikolay Kim "] description = "Actix thread pool for sync code" keywords = ["actix", "network", "framework", "async", "futures"] From 87b857705c1e6ddfcb7c6d3ae63b992f3452591d Mon Sep 17 00:00:00 2001 From: Yuki Okushi Date: Thu, 28 May 2020 02:32:29 +0900 Subject: [PATCH 42/44] Update `actions/cache` to v2 --- .github/workflows/linux.yml | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/.github/workflows/linux.yml b/.github/workflows/linux.yml index 7971e590..d55ce1c1 100644 --- a/.github/workflows/linux.yml +++ b/.github/workflows/linux.yml @@ -29,18 +29,16 @@ jobs: uses: actions-rs/cargo@v1 with: command: generate-lockfile - - name: Cache cargo registry - uses: actions/cache@v1 + - name: Cache cargo dirs + uses: actions/cache@v2 with: - path: ~/.cargo/registry - key: ${{ matrix.version }}-x86_64-unknown-linux-gnu-cargo-registry-trimmed-${{ hashFiles('**/Cargo.lock') }} - - name: Cache cargo index - uses: actions/cache@v1 - with: - path: ~/.cargo/git - key: ${{ matrix.version }}-x86_64-unknown-linux-gnu-cargo-index-trimmed-${{ hashFiles('**/Cargo.lock') }} + path: + ~/.cargo/registry + ~/.cargo/git + ~/.cargo/bin + key: ${{ matrix.version }}-x86_64-unknown-linux-gnu-cargo-trimmed-${{ hashFiles('**/Cargo.lock') }} - name: Cache cargo build - uses: actions/cache@v1 + uses: actions/cache@v2 with: path: target key: ${{ matrix.version }}-x86_64-unknown-linux-gnu-cargo-build-trimmed-${{ hashFiles('**/Cargo.lock') }} @@ -61,7 +59,7 @@ jobs: - name: Generate coverage file if: matrix.version == 'stable' && (github.ref == 'refs/heads/master' || github.event_name == 'pull_request') run: | - cargo install cargo-tarpaulin + which cargo-tarpaulin || cargo install cargo-tarpaulin cargo tarpaulin --out Xml --workspace --all-features - name: Upload to Codecov @@ -72,5 +70,5 @@ jobs: - name: Clear the cargo caches run: | - cargo install cargo-cache --no-default-features --features ci-autoclean + which cargo-cache || cargo install cargo-cache --no-default-features --features ci-autoclean cargo-cache From 755a8bb9d16bf5c43ae57109fef2af393d006ddc Mon Sep 17 00:00:00 2001 From: Pen Tree Date: Wed, 3 Jun 2020 01:05:39 +0800 Subject: [PATCH 43/44] fix codec doc links (#148) --- actix-codec/src/lib.rs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/actix-codec/src/lib.rs b/actix-codec/src/lib.rs index fc53b688..7c38bdf7 100644 --- a/actix-codec/src/lib.rs +++ b/actix-codec/src/lib.rs @@ -2,10 +2,12 @@ //! //! Contains adapters to go from streams of bytes, [`AsyncRead`] and //! [`AsyncWrite`], to framed streams implementing [`Sink`] and [`Stream`]. -//! Framed streams are also known as [transports]. +//! Framed streams are also known as `transports`. //! -//! [`AsyncRead`]: # -//! [`AsyncWrite`]: # +//! [`AsyncRead`]: AsyncRead +//! [`AsyncWrite`]: AsyncWrite +//! [`Sink`]: futures_sink::Sink +//! [`Stream`]: futures_core::Stream #![deny(rust_2018_idioms, warnings)] mod bcodec; From 9528df4486eb9e028676456491a20badb9ea4acd Mon Sep 17 00:00:00 2001 From: Taiki Endo Date: Sat, 6 Jun 2020 06:42:45 +0900 Subject: [PATCH 44/44] Remove uses of pin_project::project attribute pin-project will deprecate the project attribute due to some unfixable limitations. Refs: https://github.com/taiki-e/pin-project/issues/225 --- actix-codec/Cargo.toml | 2 +- actix-ioframe/Cargo.toml | 2 +- actix-ioframe/src/service.rs | 11 ++++------- actix-service/Cargo.toml | 2 +- actix-service/benches/and_then.rs | 24 ++++++++++-------------- actix-service/src/and_then.rs | 10 ++++------ actix-service/src/and_then_apply_fn.rs | 10 ++++------ actix-service/src/apply_cfg.rs | 10 ++++------ actix-service/src/then.rs | 10 ++++------ actix-service/src/transform.rs | 8 +++----- actix-utils/Cargo.toml | 2 +- 11 files changed, 37 insertions(+), 54 deletions(-) diff --git a/actix-codec/Cargo.toml b/actix-codec/Cargo.toml index cab79a9e..3c7a93bc 100644 --- a/actix-codec/Cargo.toml +++ b/actix-codec/Cargo.toml @@ -24,4 +24,4 @@ futures-sink = { version = "0.3.4", default-features = false } tokio = { version = "0.2.4", default-features=false } tokio-util = { version = "0.2.0", default-features=false, features=["codec"] } log = "0.4" -pin-project = "0.4.8" +pin-project = "0.4.17" diff --git a/actix-ioframe/Cargo.toml b/actix-ioframe/Cargo.toml index f9c144a7..efc81740 100644 --- a/actix-ioframe/Cargo.toml +++ b/actix-ioframe/Cargo.toml @@ -24,7 +24,7 @@ bytes = "0.5.3" either = "1.5.3" futures-sink = { version = "0.3.4", default-features = false } futures-core = { version = "0.3.4", default-features = false } -pin-project = "0.4.6" +pin-project = "0.4.17" log = "0.4" [dev-dependencies] diff --git a/actix-ioframe/src/service.rs b/actix-ioframe/src/service.rs index a562fbb5..f3b5ab85 100644 --- a/actix-ioframe/src/service.rs +++ b/actix-ioframe/src/service.rs @@ -8,7 +8,6 @@ use actix_codec::{AsyncRead, AsyncWrite, Decoder, Encoder, Framed}; use actix_service::{IntoService, IntoServiceFactory, Service, ServiceFactory}; use either::Either; use futures_core::{ready, stream::Stream}; -use pin_project::project; use crate::connect::{Connect, ConnectResult}; use crate::dispatcher::Dispatcher; @@ -336,7 +335,7 @@ where } } -#[pin_project::pin_project] +#[pin_project::pin_project(project = FramedServiceImplResponseInnerProj)] enum FramedServiceImplResponseInner where C: Service, Response = ConnectResult>, @@ -378,7 +377,6 @@ where ::Error: std::fmt::Debug, Out: Stream::Item> + Unpin, { - #[project] fn poll( self: Pin<&mut Self>, cx: &mut Context<'_>, @@ -386,9 +384,8 @@ where FramedServiceImplResponseInner, Poll>>, > { - #[project] match self.project() { - FramedServiceImplResponseInner::Connect(fut, handler) => match fut.poll(cx) { + FramedServiceImplResponseInnerProj::Connect(fut, handler) => match fut.poll(cx) { Poll::Ready(Ok(res)) => Either::Left(FramedServiceImplResponseInner::Handler( handler.new_service(res.state), Some(res.framed), @@ -397,7 +394,7 @@ where Poll::Pending => Either::Right(Poll::Pending), Poll::Ready(Err(e)) => Either::Right(Poll::Ready(Err(e.into()))), }, - FramedServiceImplResponseInner::Handler(fut, framed, out) => { + FramedServiceImplResponseInnerProj::Handler(fut, framed, out) => { match fut.poll(cx) { Poll::Ready(Ok(handler)) => { Either::Left(FramedServiceImplResponseInner::Dispatcher( @@ -408,7 +405,7 @@ where Poll::Ready(Err(e)) => Either::Right(Poll::Ready(Err(e.into()))), } } - FramedServiceImplResponseInner::Dispatcher(fut) => { + FramedServiceImplResponseInnerProj::Dispatcher(fut) => { Either::Right(fut.poll(cx)) } } diff --git a/actix-service/Cargo.toml b/actix-service/Cargo.toml index 939ed178..cb2b2cdb 100644 --- a/actix-service/Cargo.toml +++ b/actix-service/Cargo.toml @@ -17,7 +17,7 @@ path = "src/lib.rs" [dependencies] futures-util = "0.3.1" -pin-project = "0.4.6" +pin-project = "0.4.17" [dev-dependencies] actix-rt = "1.0.0" diff --git a/actix-service/benches/and_then.rs b/actix-service/benches/and_then.rs index 1094fdaf..0b78a9c0 100644 --- a/actix-service/benches/and_then.rs +++ b/actix-service/benches/and_then.rs @@ -81,7 +81,7 @@ where state: State, } -#[pin_project::pin_project] +#[pin_project::pin_project(project = StateProj)] enum State where A: Service, @@ -99,13 +99,11 @@ where { type Output = Result; - #[pin_project::project] fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { let mut this = self.as_mut().project(); - #[project] match this.state.as_mut().project() { - State::A(fut, b) => match fut.poll(cx)? { + StateProj::A(fut, b) => match fut.poll(cx)? { Poll::Ready(res) => { let b = b.take().unwrap(); this.state.set(State::Empty); // drop fut A @@ -115,11 +113,11 @@ where } Poll::Pending => Poll::Pending, }, - State::B(fut) => fut.poll(cx).map(|r| { + StateProj::B(fut) => fut.poll(cx).map(|r| { this.state.set(State::Empty); r }), - State::Empty => panic!("future must not be polled after it returned `Poll::Ready`"), + StateProj::Empty => panic!("future must not be polled after it returned `Poll::Ready`"), } } } @@ -179,7 +177,7 @@ where state: StateRC, } - #[pin_project::pin_project] + #[pin_project::pin_project(project = StateRCProj)] enum StateRC where A: Service, @@ -196,14 +194,12 @@ where B: Service, { type Output = Result; - - #[pin_project::project] + fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { let mut this = self.as_mut().project(); - - #[project] + match this.state.as_mut().project() { - StateRC::A(fut, b) => match fut.poll(cx)? { + StateRCProj::A(fut, b) => match fut.poll(cx)? { Poll::Ready(res) => { let b = b.take().unwrap(); this.state.set(StateRC::Empty); // drop fut A @@ -213,11 +209,11 @@ where } Poll::Pending => Poll::Pending, }, - StateRC::B(fut) => fut.poll(cx).map(|r| { + StateRCProj::B(fut) => fut.poll(cx).map(|r| { this.state.set(StateRC::Empty); r }), - StateRC::Empty => panic!("future must not be polled after it returned `Poll::Ready`"), + StateRCProj::Empty => panic!("future must not be polled after it returned `Poll::Ready`"), } } } diff --git a/actix-service/src/and_then.rs b/actix-service/src/and_then.rs index 76ed35e9..74b64b38 100644 --- a/actix-service/src/and_then.rs +++ b/actix-service/src/and_then.rs @@ -66,7 +66,7 @@ where state: State, } -#[pin_project::pin_project] +#[pin_project::pin_project(project = StateProj)] enum State where A: Service, @@ -84,13 +84,11 @@ where { type Output = Result; - #[pin_project::project] fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { let mut this = self.as_mut().project(); - #[project] match this.state.as_mut().project() { - State::A(fut, b) => match fut.poll(cx)? { + StateProj::A(fut, b) => match fut.poll(cx)? { Poll::Ready(res) => { let mut b = b.take().unwrap(); this.state.set(State::Empty); // drop fut A @@ -100,11 +98,11 @@ where } Poll::Pending => Poll::Pending, }, - State::B(fut) => fut.poll(cx).map(|r| { + StateProj::B(fut) => fut.poll(cx).map(|r| { this.state.set(State::Empty); r }), - State::Empty => panic!("future must not be polled after it returned `Poll::Ready`"), + StateProj::Empty => panic!("future must not be polled after it returned `Poll::Ready`"), } } } diff --git a/actix-service/src/and_then_apply_fn.rs b/actix-service/src/and_then_apply_fn.rs index 07f3b50d..de0cfac9 100644 --- a/actix-service/src/and_then_apply_fn.rs +++ b/actix-service/src/and_then_apply_fn.rs @@ -98,7 +98,7 @@ where state: State, } -#[pin_project::pin_project] +#[pin_project::pin_project(project = StateProj)] enum State where A: Service, @@ -123,13 +123,11 @@ where { type Output = Result; - #[pin_project::project] fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { let mut this = self.as_mut().project(); - #[project] match this.state.as_mut().project() { - State::A(fut, b) => match fut.poll(cx)? { + StateProj::A(fut, b) => match fut.poll(cx)? { Poll::Ready(res) => { let mut b = b.take().unwrap(); this.state.set(State::Empty); @@ -140,11 +138,11 @@ where } Poll::Pending => Poll::Pending, }, - State::B(fut) => fut.poll(cx).map(|r| { + StateProj::B(fut) => fut.poll(cx).map(|r| { this.state.set(State::Empty); r }), - State::Empty => panic!("future must not be polled after it returned `Poll::Ready`"), + StateProj::Empty => panic!("future must not be polled after it returned `Poll::Ready`"), } } } diff --git a/actix-service/src/apply_cfg.rs b/actix-service/src/apply_cfg.rs index 5c69b813..cee7b8c7 100644 --- a/actix-service/src/apply_cfg.rs +++ b/actix-service/src/apply_cfg.rs @@ -177,7 +177,7 @@ where state: State, } -#[pin_project::pin_project] +#[pin_project::pin_project(project = StateProj)] enum State where T: ServiceFactory, @@ -200,20 +200,18 @@ where { type Output = Result; - #[pin_project::project] fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { let mut this = self.as_mut().project(); - #[project] match this.state.as_mut().project() { - State::A(fut) => match fut.poll(cx)? { + StateProj::A(fut) => match fut.poll(cx)? { Poll::Pending => Poll::Pending, Poll::Ready(srv) => { this.state.set(State::B(srv)); self.poll(cx) } }, - State::B(srv) => match srv.poll_ready(cx)? { + StateProj::B(srv) => match srv.poll_ready(cx)? { Poll::Ready(_) => { let fut = (this.store.get_mut().1)(this.cfg.take().unwrap(), srv); this.state.set(State::C(fut)); @@ -221,7 +219,7 @@ where } Poll::Pending => Poll::Pending, }, - State::C(fut) => fut.poll(cx), + StateProj::C(fut) => fut.poll(cx), } } } diff --git a/actix-service/src/then.rs b/actix-service/src/then.rs index 53ff1753..1286e742 100644 --- a/actix-service/src/then.rs +++ b/actix-service/src/then.rs @@ -66,7 +66,7 @@ where state: State, } -#[pin_project::pin_project] +#[pin_project::pin_project(project = StateProj)] enum State where A: Service, @@ -84,13 +84,11 @@ where { type Output = Result; - #[pin_project::project] fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { let mut this = self.as_mut().project(); - #[project] match this.state.as_mut().project() { - State::A(fut, b) => match fut.poll(cx) { + StateProj::A(fut, b) => match fut.poll(cx) { Poll::Ready(res) => { let mut b = b.take().unwrap(); this.state.set(State::Empty); // drop fut A @@ -100,11 +98,11 @@ where } Poll::Pending => Poll::Pending, }, - State::B(fut) => fut.poll(cx).map(|r| { + StateProj::B(fut) => fut.poll(cx).map(|r| { this.state.set(State::Empty); r }), - State::Empty => panic!("future must not be polled after it returned `Poll::Ready`"), + StateProj::Empty => panic!("future must not be polled after it returned `Poll::Ready`"), } } } diff --git a/actix-service/src/transform.rs b/actix-service/src/transform.rs index 27704986..dc55f533 100644 --- a/actix-service/src/transform.rs +++ b/actix-service/src/transform.rs @@ -211,7 +211,7 @@ where state: ApplyTransformFutureState, } -#[pin_project::pin_project] +#[pin_project::pin_project(project = ApplyTransformFutureStateProj)] pub enum ApplyTransformFutureState where S: ServiceFactory, @@ -228,13 +228,11 @@ where { type Output = Result; - #[pin_project::project] fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { let mut this = self.as_mut().project(); - #[project] match this.state.as_mut().project() { - ApplyTransformFutureState::A(fut) => match fut.poll(cx)? { + ApplyTransformFutureStateProj::A(fut) => match fut.poll(cx)? { Poll::Ready(srv) => { let fut = this.store.0.new_transform(srv); this.state.set(ApplyTransformFutureState::B(fut)); @@ -242,7 +240,7 @@ where } Poll::Pending => Poll::Pending, }, - ApplyTransformFutureState::B(fut) => fut.poll(cx), + ApplyTransformFutureStateProj::B(fut) => fut.poll(cx), } } } diff --git a/actix-utils/Cargo.toml b/actix-utils/Cargo.toml index 4c55da05..f32ad5b5 100644 --- a/actix-utils/Cargo.toml +++ b/actix-utils/Cargo.toml @@ -25,6 +25,6 @@ either = "1.5.3" futures-channel = { version = "0.3.4", default-features = false } futures-sink = { version = "0.3.4", default-features = false } futures-util = { version = "0.3.4", default-features = false } -pin-project = "0.4.6" +pin-project = "0.4.17" log = "0.4" slab = "0.4"