From 7e8ea44d5c7882f47161d248eed8abed1e90ba7d Mon Sep 17 00:00:00 2001 From: Rob Ede Date: Mon, 18 May 2020 00:42:51 +0100 Subject: [PATCH 01/13] remove needless BodySize::Sized64 variant --- MIGRATION.md | 4 ++++ actix-http/CHANGES.md | 3 +++ actix-http/src/body.rs | 20 +++++++++----------- actix-http/src/client/h2proto.rs | 4 ---- actix-http/src/h1/encoder.rs | 27 ++------------------------- actix-http/src/h2/dispatcher.rs | 4 ---- actix-http/src/helpers.rs | 8 ++++---- 7 files changed, 22 insertions(+), 48 deletions(-) diff --git a/MIGRATION.md b/MIGRATION.md index 672aa253e..cb79e664b 100644 --- a/MIGRATION.md +++ b/MIGRATION.md @@ -3,9 +3,13 @@ * Setting a cookie's SameSite property, explicitly, to `SameSite::None` will now result in `SameSite=None` being sent with the response Set-Cookie header. To create a cookie without a SameSite attribute, remove any calls setting same_site. + * actix-http support for Actors messages was moved to actix-http crate and is enabled with feature `actors` +* `BodySize::Sized64` variant has been removed. `BodySize::Sized` now receives a + `u64` instead of a `usize`. + ## 2.0.0 * `HttpServer::start()` renamed to `HttpServer::run()`. It also possible to diff --git a/actix-http/CHANGES.md b/actix-http/CHANGES.md index e96b0451d..a383b6a11 100644 --- a/actix-http/CHANGES.md +++ b/actix-http/CHANGES.md @@ -6,6 +6,9 @@ * Bump minimum supported Rust version to 1.40 +* `BodySize::Sized64` variant has been removed. `BodySize::Sized` now receives a + `u64` instead of a `usize`. + ### Fixed * Support parsing of `SameSite=None` [#1503] diff --git a/actix-http/src/body.rs b/actix-http/src/body.rs index f887b53bb..b821e777f 100644 --- a/actix-http/src/body.rs +++ b/actix-http/src/body.rs @@ -15,8 +15,7 @@ use crate::error::Error; pub enum BodySize { None, Empty, - Sized(usize), - Sized64(u64), + Sized(u64), Stream, } @@ -25,8 +24,7 @@ impl BodySize { match self { BodySize::None | BodySize::Empty - | BodySize::Sized(0) - | BodySize::Sized64(0) => true, + | BodySize::Sized(0) => true, _ => false, } } @@ -170,7 +168,7 @@ impl MessageBody for Body { match self { Body::None => BodySize::None, Body::Empty => BodySize::Empty, - Body::Bytes(ref bin) => BodySize::Sized(bin.len()), + Body::Bytes(ref bin) => BodySize::Sized(bin.len() as u64), Body::Message(ref body) => body.size(), } } @@ -297,7 +295,7 @@ where impl MessageBody for Bytes { fn size(&self) -> BodySize { - BodySize::Sized(self.len()) + BodySize::Sized(self.len() as u64) } fn poll_next( @@ -314,7 +312,7 @@ impl MessageBody for Bytes { impl MessageBody for BytesMut { fn size(&self) -> BodySize { - BodySize::Sized(self.len()) + BodySize::Sized(self.len() as u64) } fn poll_next( @@ -331,7 +329,7 @@ impl MessageBody for BytesMut { impl MessageBody for &'static str { fn size(&self) -> BodySize { - BodySize::Sized(self.len()) + BodySize::Sized(self.len() as u64) } fn poll_next( @@ -350,7 +348,7 @@ impl MessageBody for &'static str { impl MessageBody for Vec { fn size(&self) -> BodySize { - BodySize::Sized(self.len()) + BodySize::Sized(self.len() as u64) } fn poll_next( @@ -367,7 +365,7 @@ impl MessageBody for Vec { impl MessageBody for String { fn size(&self) -> BodySize { - BodySize::Sized(self.len()) + BodySize::Sized(self.len() as u64) } fn poll_next( @@ -458,7 +456,7 @@ where S: Stream> + Unpin, { fn size(&self) -> BodySize { - BodySize::Sized64(self.size) + BodySize::Sized(self.size as u64) } /// Attempts to pull out the next value of the underlying [`Stream`]. diff --git a/actix-http/src/client/h2proto.rs b/actix-http/src/client/h2proto.rs index 2afd2d80b..48ab9fe4a 100644 --- a/actix-http/src/client/h2proto.rs +++ b/actix-http/src/client/h2proto.rs @@ -64,10 +64,6 @@ where CONTENT_LENGTH, HeaderValue::try_from(format!("{}", len)).unwrap(), ), - BodySize::Sized64(len) => req.headers_mut().insert( - CONTENT_LENGTH, - HeaderValue::try_from(format!("{}", len)).unwrap(), - ), }; // Extracting extra headers from RequestHeadType. HeaderMap::new() does not allocate. diff --git a/actix-http/src/h1/encoder.rs b/actix-http/src/h1/encoder.rs index 4689906b4..eb8c337dd 100644 --- a/actix-http/src/h1/encoder.rs +++ b/actix-http/src/h1/encoder.rs @@ -4,7 +4,7 @@ use std::ptr::copy_nonoverlapping; use std::slice::from_raw_parts_mut; use std::{cmp, io}; -use bytes::{buf::BufMutExt, BufMut, BytesMut}; +use bytes::{BufMut, BytesMut}; use crate::body::BodySize; use crate::config::ServiceConfig; @@ -95,15 +95,6 @@ pub(crate) trait MessageType: Sized { } } BodySize::Sized(len) => helpers::write_content_length(len, dst), - BodySize::Sized64(len) => { - if camel_case { - dst.put_slice(b"\r\nContent-Length: "); - } else { - dst.put_slice(b"\r\ncontent-length: "); - } - #[allow(clippy::write_with_newline)] - write!(dst.writer(), "{}\r\n", len)?; - } BodySize::None => dst.put_slice(b"\r\n"), } @@ -338,8 +329,7 @@ impl MessageEncoder { if !head { self.te = match length { BodySize::Empty => TransferEncoding::empty(), - BodySize::Sized(len) => TransferEncoding::length(len as u64), - BodySize::Sized64(len) => TransferEncoding::length(len), + BodySize::Sized(len) => TransferEncoding::length(len), BodySize::Stream => { if message.chunked() && !stream { TransferEncoding::chunked() @@ -582,19 +572,6 @@ mod tests { assert!(data.contains("Content-Type: plain/text\r\n")); assert!(data.contains("Date: date\r\n")); - let _ = head.encode_headers( - &mut bytes, - Version::HTTP_11, - BodySize::Sized64(100), - ConnectionType::KeepAlive, - &ServiceConfig::default(), - ); - let data = - String::from_utf8(Vec::from(bytes.split().freeze().as_ref())).unwrap(); - assert!(data.contains("Content-Length: 100\r\n")); - assert!(data.contains("Content-Type: plain/text\r\n")); - assert!(data.contains("Date: date\r\n")); - let mut head = RequestHead::default(); head.set_camel_case_headers(false); head.headers.insert(DATE, HeaderValue::from_static("date")); diff --git a/actix-http/src/h2/dispatcher.rs b/actix-http/src/h2/dispatcher.rs index b07764a03..a189697a2 100644 --- a/actix-http/src/h2/dispatcher.rs +++ b/actix-http/src/h2/dispatcher.rs @@ -210,10 +210,6 @@ where CONTENT_LENGTH, HeaderValue::try_from(format!("{}", len)).unwrap(), ), - BodySize::Sized64(len) => res.headers_mut().insert( - CONTENT_LENGTH, - HeaderValue::try_from(format!("{}", len)).unwrap(), - ), }; // copy headers diff --git a/actix-http/src/helpers.rs b/actix-http/src/helpers.rs index ff647e72b..5ac6c9be5 100644 --- a/actix-http/src/helpers.rs +++ b/actix-http/src/helpers.rs @@ -30,7 +30,7 @@ pub(crate) fn write_status_line(version: Version, n: u16, bytes: &mut BytesMut) } /// NOTE: bytes object has to contain enough space -pub fn write_content_length(n: usize, bytes: &mut BytesMut) { +pub fn write_content_length(n: u64, bytes: &mut BytesMut) { bytes.put_slice(b"\r\ncontent-length: "); if n < 10 { @@ -96,16 +96,16 @@ pub fn write_content_length(n: usize, bytes: &mut BytesMut) { bytes.put_u8(DIGITS_START + d10); bytes.put_u8(DIGITS_START + d1); } else { - write_usize(n, bytes); + write_u64(n, bytes); } bytes.put_slice(b"\r\n"); } -pub(crate) fn write_usize(n: usize, bytes: &mut BytesMut) { +pub(crate) fn write_u64(n: u64, bytes: &mut BytesMut) { let mut n = n; - // 20 chars is max length of a usize (2^64) + // 20 chars is max length of a u64 (2^64) // digits will be added to the buffer from lsd to msd let mut buf = BytesMut::with_capacity(20); From 32a37b72823fee9ba4664a6f344493eeda9752d4 Mon Sep 17 00:00:00 2001 From: Omid Rad Date: Tue, 19 May 2020 00:46:31 +0200 Subject: [PATCH 02/13] Remove content_length from ResponseBuilder (#1491) * Remove content_length since it'll be overwritten by the response body. FIXES #1439 * Add setting of Content-Length to the no_chunking function * Add changes and migration documentations * Update MIGRATION.md Co-authored-by: Yuki Okushi Co-authored-by: Rob Ede Co-authored-by: Yuki Okushi --- MIGRATION.md | 2 ++ actix-http/CHANGES.md | 4 ++++ actix-http/src/response.rs | 10 +++------- actix-http/tests/test_openssl.rs | 2 +- actix-http/tests/test_rustls.rs | 2 +- actix-http/tests/test_server.rs | 2 +- tests/test_server.rs | 5 ++--- 7 files changed, 14 insertions(+), 13 deletions(-) diff --git a/MIGRATION.md b/MIGRATION.md index cb79e664b..d2e9735fb 100644 --- a/MIGRATION.md +++ b/MIGRATION.md @@ -6,6 +6,8 @@ * actix-http support for Actors messages was moved to actix-http crate and is enabled with feature `actors` +* content_length function is removed from actix-http. + You can set Content-Length by normally setting the response body or calling no_chunking function. * `BodySize::Sized64` variant has been removed. `BodySize::Sized` now receives a `u64` instead of a `usize`. diff --git a/actix-http/CHANGES.md b/actix-http/CHANGES.md index a383b6a11..1a71a0bc0 100644 --- a/actix-http/CHANGES.md +++ b/actix-http/CHANGES.md @@ -5,6 +5,7 @@ ### Changed * Bump minimum supported Rust version to 1.40 +* content_length function is removed, and you can set Content-Length by calling no_chunking function [#1439] * `BodySize::Sized64` variant has been removed. `BodySize::Sized` now receives a `u64` instead of a `usize`. @@ -13,6 +14,9 @@ * Support parsing of `SameSite=None` [#1503] +[#1439]: https://github.com/actix/actix-web/pull/1439 +[#1503]: https://github.com/actix/actix-web/pull/1503 + ## [2.0.0-alpha.3] - 2020-05-08 ### Fixed diff --git a/actix-http/src/response.rs b/actix-http/src/response.rs index 7a9b82df2..9086212f1 100644 --- a/actix-http/src/response.rs +++ b/actix-http/src/response.rs @@ -472,7 +472,9 @@ impl ResponseBuilder { /// Disable chunked transfer encoding for HTTP/1.1 streaming responses. #[inline] - pub fn no_chunking(&mut self) -> &mut Self { + pub fn no_chunking(&mut self, len: u64) -> &mut Self { + self.header(header::CONTENT_LENGTH, len); + if let Some(parts) = parts(&mut self.head, &self.err) { parts.no_chunking(true); } @@ -497,12 +499,6 @@ impl ResponseBuilder { self } - /// Set content length - #[inline] - pub fn content_length(&mut self, len: u64) -> &mut Self { - self.header(header::CONTENT_LENGTH, len) - } - /// Set a cookie /// /// ```rust diff --git a/actix-http/tests/test_openssl.rs b/actix-http/tests/test_openssl.rs index 4af3a0a47..e8aaa7fc4 100644 --- a/actix-http/tests/test_openssl.rs +++ b/actix-http/tests/test_openssl.rs @@ -275,7 +275,7 @@ async fn test_h2_head_binary() { let mut srv = test_server(move || { HttpService::build() .h2(|_| { - ok::<_, ()>(Response::Ok().content_length(STR.len() as u64).body(STR)) + ok::<_, ()>(Response::Ok().body(STR)) }) .openssl(ssl_acceptor()) .map_err(|_| ()) diff --git a/actix-http/tests/test_rustls.rs b/actix-http/tests/test_rustls.rs index 1c5583b08..fff32ac8b 100644 --- a/actix-http/tests/test_rustls.rs +++ b/actix-http/tests/test_rustls.rs @@ -281,7 +281,7 @@ async fn test_h2_head_binary() { let mut srv = test_server(move || { HttpService::build() .h2(|_| { - ok::<_, ()>(Response::Ok().content_length(STR.len() as u64).body(STR)) + ok::<_, ()>(Response::Ok().body(STR)) }) .rustls(ssl_acceptor()) }) diff --git a/actix-http/tests/test_server.rs b/actix-http/tests/test_server.rs index 1ec819434..35c71e37a 100644 --- a/actix-http/tests/test_server.rs +++ b/actix-http/tests/test_server.rs @@ -490,7 +490,7 @@ async fn test_h1_head_binary() { let mut srv = test_server(|| { HttpService::build() .h1(|_| { - ok::<_, ()>(Response::Ok().content_length(STR.len() as u64).body(STR)) + ok::<_, ()>(Response::Ok().body(STR)) }) .tcp() }) diff --git a/tests/test_server.rs b/tests/test_server.rs index 1916b372c..a4dfa65a0 100644 --- a/tests/test_server.rs +++ b/tests/test_server.rs @@ -349,7 +349,7 @@ async fn test_body_br_streaming() { async fn test_head_binary() { let srv = test::start_with(test::config().h1(), || { App::new().service(web::resource("/").route( - web::head().to(move || HttpResponse::Ok().content_length(100).body(STR)), + web::head().to(move || HttpResponse::Ok().body(STR)), )) }); @@ -371,8 +371,7 @@ async fn test_no_chunking() { let srv = test::start_with(test::config().h1(), || { App::new().service(web::resource("/").route(web::to(move || { HttpResponse::Ok() - .no_chunking() - .content_length(STR.len() as u64) + .no_chunking(STR.len() as u64) .streaming(TestBody::new(Bytes::from_static(STR.as_ref()), 24)) }))) }); From 245dd471dd164567c5e44a1b31cbc70419bf0f15 Mon Sep 17 00:00:00 2001 From: Yuki Okushi Date: Mon, 18 May 2020 11:41:07 +0900 Subject: [PATCH 03/13] files: Minimize `futures` dependencies --- actix-files/Cargo.toml | 3 ++- actix-files/src/lib.rs | 4 ++-- actix-files/src/named.rs | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/actix-files/Cargo.toml b/actix-files/Cargo.toml index 60f92c5d9..ead2b51f5 100644 --- a/actix-files/Cargo.toml +++ b/actix-files/Cargo.toml @@ -23,7 +23,8 @@ actix-http = "2.0.0-alpha.3" actix-service = "1.0.1" bitflags = "1" bytes = "0.5.3" -futures = "0.3.1" +futures-core = { version = "0.3.5", default-features = false } +futures-util = { version = "0.3.5", default-features = false } derive_more = "0.99.2" log = "0.4" mime = "0.3" diff --git a/actix-files/src/lib.rs b/actix-files/src/lib.rs index 27ec6c583..76c68ce25 100644 --- a/actix-files/src/lib.rs +++ b/actix-files/src/lib.rs @@ -24,8 +24,8 @@ use actix_web::http::header::{self, DispositionType}; use actix_web::http::Method; use actix_web::{web, FromRequest, HttpRequest, HttpResponse}; use bytes::Bytes; -use futures::future::{ok, ready, Either, FutureExt, LocalBoxFuture, Ready}; -use futures::Stream; +use futures_core::Stream; +use futures_util::future::{ok, ready, Either, FutureExt, LocalBoxFuture, Ready}; use mime; use mime_guess::from_ext; use percent_encoding::{utf8_percent_encode, CONTROLS}; diff --git a/actix-files/src/named.rs b/actix-files/src/named.rs index e05316904..6ee561a4b 100644 --- a/actix-files/src/named.rs +++ b/actix-files/src/named.rs @@ -18,7 +18,7 @@ use actix_web::http::header::{ }; use actix_web::http::{ContentEncoding, StatusCode}; use actix_web::{Error, HttpMessage, HttpRequest, HttpResponse, Responder}; -use futures::future::{ready, Ready}; +use futures_util::future::{ready, Ready}; use crate::range::HttpRange; use crate::ChunkedReadFile; From 9bd640773038431ba8dc8a695a8096c3ad51e530 Mon Sep 17 00:00:00 2001 From: Yuki Okushi Date: Mon, 18 May 2020 11:41:31 +0900 Subject: [PATCH 04/13] framed: Minimize `futures` dependencies --- actix-framed/Cargo.toml | 2 +- actix-framed/src/app.rs | 2 +- actix-framed/src/helpers.rs | 2 +- actix-framed/src/route.rs | 2 +- actix-framed/src/service.rs | 4 ++-- actix-framed/tests/test_server.rs | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/actix-framed/Cargo.toml b/actix-framed/Cargo.toml index 94009db6f..ba7a01e0c 100644 --- a/actix-framed/Cargo.toml +++ b/actix-framed/Cargo.toml @@ -26,7 +26,7 @@ actix-rt = "1.0.0" actix-http = "2.0.0-alpha.3" bytes = "0.5.3" -futures = "0.3.1" +futures-util = { version = "0.3.5", default-features = false } pin-project = "0.4.6" log = "0.4" diff --git a/actix-framed/src/app.rs b/actix-framed/src/app.rs index e4b91e6c4..2fddbc039 100644 --- a/actix-framed/src/app.rs +++ b/actix-framed/src/app.rs @@ -8,7 +8,7 @@ use actix_http::h1::{Codec, SendResponse}; use actix_http::{Error, Request, Response}; use actix_router::{Path, Router, Url}; use actix_service::{IntoServiceFactory, Service, ServiceFactory}; -use futures::future::{ok, FutureExt, LocalBoxFuture}; +use futures_util::future::{ok, FutureExt, LocalBoxFuture}; use crate::helpers::{BoxedHttpNewService, BoxedHttpService, HttpNewService}; use crate::request::FramedRequest; diff --git a/actix-framed/src/helpers.rs b/actix-framed/src/helpers.rs index 29492e45b..d83736a52 100644 --- a/actix-framed/src/helpers.rs +++ b/actix-framed/src/helpers.rs @@ -2,7 +2,7 @@ use std::task::{Context, Poll}; use actix_http::Error; use actix_service::{Service, ServiceFactory}; -use futures::future::{FutureExt, LocalBoxFuture}; +use futures_util::future::{FutureExt, LocalBoxFuture}; pub(crate) type BoxedHttpService = Box< dyn Service< diff --git a/actix-framed/src/route.rs b/actix-framed/src/route.rs index 793f46273..7b9004b64 100644 --- a/actix-framed/src/route.rs +++ b/actix-framed/src/route.rs @@ -6,7 +6,7 @@ use std::task::{Context, Poll}; use actix_codec::{AsyncRead, AsyncWrite}; use actix_http::{http::Method, Error}; use actix_service::{Service, ServiceFactory}; -use futures::future::{ok, FutureExt, LocalBoxFuture, Ready}; +use futures_util::future::{ok, FutureExt, LocalBoxFuture, Ready}; use log::error; use crate::app::HttpServiceFactory; diff --git a/actix-framed/src/service.rs b/actix-framed/src/service.rs index 92393ca75..dd61f298d 100644 --- a/actix-framed/src/service.rs +++ b/actix-framed/src/service.rs @@ -1,3 +1,4 @@ +use std::future::Future; use std::marker::PhantomData; use std::pin::Pin; use std::task::{Context, Poll}; @@ -9,8 +10,7 @@ use actix_http::h1::{Codec, Message}; use actix_http::ws::{verify_handshake, HandshakeError}; use actix_http::{Request, Response}; use actix_service::{Service, ServiceFactory}; -use futures::future::{err, ok, Either, Ready}; -use futures::Future; +use futures_util::future::{err, ok, Either, Ready}; /// Service that verifies incoming request if it is valid websocket /// upgrade request. In case of error returns `HandshakeError` diff --git a/actix-framed/tests/test_server.rs b/actix-framed/tests/test_server.rs index 150fc10f3..ec6897861 100644 --- a/actix-framed/tests/test_server.rs +++ b/actix-framed/tests/test_server.rs @@ -4,7 +4,7 @@ use actix_http_test::test_server; use actix_service::{pipeline_factory, IntoServiceFactory, ServiceFactory}; use actix_utils::framed::Dispatcher; use bytes::Bytes; -use futures::{future, SinkExt, StreamExt}; +use futures_util::{future, SinkExt, StreamExt}; use actix_framed::{FramedApp, FramedRequest, FramedRoute, SendError, VerifyWebSockets}; From 292af145cb3d8df2cd3296666cdde5c1b3be036e Mon Sep 17 00:00:00 2001 From: Yuki Okushi Date: Mon, 18 May 2020 11:45:26 +0900 Subject: [PATCH 05/13] http: Minimize `futures` dependencies --- actix-http/Cargo.toml | 13 ++++++------- actix-http/examples/echo.rs | 2 +- actix-http/examples/echo2.rs | 2 +- actix-http/examples/hello-world.rs | 2 +- actix-http/src/body.rs | 2 +- actix-http/src/client/connection.rs | 3 ++- actix-http/tests/test_client.rs | 2 +- actix-http/tests/test_openssl.rs | 4 ++-- actix-http/tests/test_rustls.rs | 4 ++-- actix-http/tests/test_server.rs | 4 ++-- actix-http/tests/test_ws.rs | 7 ++++--- 11 files changed, 23 insertions(+), 22 deletions(-) diff --git a/actix-http/Cargo.toml b/actix-http/Cargo.toml index 7e398f6fa..894bd44f8 100644 --- a/actix-http/Cargo.toml +++ b/actix-http/Cargo.toml @@ -56,9 +56,9 @@ copyless = "0.1.4" derive_more = "0.99.2" either = "1.5.3" encoding_rs = "0.8" -futures-core = "0.3.1" -futures-util = "0.3.1" -futures-channel = "0.3.1" +futures-channel = { version = "0.3.5", default-features = false } +futures-core = { version = "0.3.5", default-features = false } +futures-util = { version = "0.3.5", default-features = false } fxhash = "0.2.1" h2 = "0.2.1" http = "0.2.0" @@ -88,11 +88,10 @@ flate2 = { version = "1.0.13", optional = true } [dev-dependencies] actix-server = "1.0.1" -actix-connect = { version = "2.0.0-alpha.2", features=["openssl"] } -actix-http-test = { version = "1.0.0", features=["openssl"] } -actix-tls = { version = "2.0.0-alpha.1", features=["openssl"] } +actix-connect = { version = "2.0.0-alpha.2", features = ["openssl"] } +actix-http-test = { version = "1.0.0", features = ["openssl"] } +actix-tls = { version = "2.0.0-alpha.1", features = ["openssl"] } criterion = "0.3" -futures = "0.3.1" env_logger = "0.7" serde_derive = "1.0" open-ssl = { version="0.10", package = "openssl" } diff --git a/actix-http/examples/echo.rs b/actix-http/examples/echo.rs index b2b88a7ea..beb1cce2c 100644 --- a/actix-http/examples/echo.rs +++ b/actix-http/examples/echo.rs @@ -3,7 +3,7 @@ use std::{env, io}; use actix_http::{Error, HttpService, Request, Response}; use actix_server::Server; use bytes::BytesMut; -use futures::StreamExt; +use futures_util::StreamExt; use http::header::HeaderValue; use log::info; diff --git a/actix-http/examples/echo2.rs b/actix-http/examples/echo2.rs index f89ea2dfb..5b7e504d3 100644 --- a/actix-http/examples/echo2.rs +++ b/actix-http/examples/echo2.rs @@ -4,7 +4,7 @@ use actix_http::http::HeaderValue; use actix_http::{Error, HttpService, Request, Response}; use actix_server::Server; use bytes::BytesMut; -use futures::StreamExt; +use futures_util::StreamExt; use log::info; async fn handle_request(mut req: Request) -> Result { diff --git a/actix-http/examples/hello-world.rs b/actix-http/examples/hello-world.rs index 4134ee734..d6477b152 100644 --- a/actix-http/examples/hello-world.rs +++ b/actix-http/examples/hello-world.rs @@ -2,7 +2,7 @@ use std::{env, io}; use actix_http::{HttpService, Response}; use actix_server::Server; -use futures::future; +use futures_util::future; use http::header::HeaderValue; use log::info; diff --git a/actix-http/src/body.rs b/actix-http/src/body.rs index b821e777f..9d6fb26ee 100644 --- a/actix-http/src/body.rs +++ b/actix-http/src/body.rs @@ -482,7 +482,7 @@ where #[cfg(test)] mod tests { use super::*; - use futures::stream; + use futures_util::stream; use futures_util::future::poll_fn; use futures_util::pin_mut; diff --git a/actix-http/src/client/connection.rs b/actix-http/src/client/connection.rs index 0ca788b32..c1362df85 100644 --- a/actix-http/src/client/connection.rs +++ b/actix-http/src/client/connection.rs @@ -1,10 +1,11 @@ +use std::future::Future; use std::pin::Pin; use std::task::{Context, Poll}; use std::{fmt, io, mem, time}; use actix_codec::{AsyncRead, AsyncWrite, Framed}; use bytes::{Buf, Bytes}; -use futures_util::future::{err, Either, Future, FutureExt, LocalBoxFuture, Ready}; +use futures_util::future::{err, Either, FutureExt, LocalBoxFuture, Ready}; use h2::client::SendRequest; use pin_project::{pin_project, project}; diff --git a/actix-http/tests/test_client.rs b/actix-http/tests/test_client.rs index 5347971a6..07104decc 100644 --- a/actix-http/tests/test_client.rs +++ b/actix-http/tests/test_client.rs @@ -1,6 +1,6 @@ use actix_service::ServiceFactory; use bytes::Bytes; -use futures::future::{self, ok}; +use futures_util::future::{self, ok}; use actix_http::{http, HttpService, Request, Response}; use actix_http_test::test_server; diff --git a/actix-http/tests/test_openssl.rs b/actix-http/tests/test_openssl.rs index e8aaa7fc4..3a7bfa409 100644 --- a/actix-http/tests/test_openssl.rs +++ b/actix-http/tests/test_openssl.rs @@ -5,8 +5,8 @@ use actix_http_test::test_server; use actix_service::{fn_service, ServiceFactory}; use bytes::{Bytes, BytesMut}; -use futures::future::{err, ok, ready}; -use futures::stream::{once, Stream, StreamExt}; +use futures_util::future::{err, ok, ready}; +use futures_util::stream::{once, Stream, StreamExt}; use open_ssl::ssl::{AlpnError, SslAcceptor, SslFiletype, SslMethod}; use actix_http::error::{ErrorBadRequest, PayloadError}; diff --git a/actix-http/tests/test_rustls.rs b/actix-http/tests/test_rustls.rs index fff32ac8b..465cba6df 100644 --- a/actix-http/tests/test_rustls.rs +++ b/actix-http/tests/test_rustls.rs @@ -7,8 +7,8 @@ use actix_http_test::test_server; use actix_service::{fn_factory_with_config, fn_service}; use bytes::{Bytes, BytesMut}; -use futures::future::{self, err, ok}; -use futures::stream::{once, Stream, StreamExt}; +use futures_util::future::{self, err, ok}; +use futures_util::stream::{once, Stream, StreamExt}; use rust_tls::{ internal::pemfile::{certs, pkcs8_private_keys}, NoClientAuth, ServerConfig as RustlsServerConfig, diff --git a/actix-http/tests/test_server.rs b/actix-http/tests/test_server.rs index 35c71e37a..bee5ebef2 100644 --- a/actix-http/tests/test_server.rs +++ b/actix-http/tests/test_server.rs @@ -6,8 +6,8 @@ use actix_http_test::test_server; use actix_rt::time::delay_for; use actix_service::fn_service; use bytes::Bytes; -use futures::future::{self, err, ok, ready, FutureExt}; -use futures::stream::{once, StreamExt}; +use futures_util::future::{self, err, ok, ready, FutureExt}; +use futures_util::stream::{once, StreamExt}; use regex::Regex; use actix_http::httpmessage::HttpMessage; diff --git a/actix-http/tests/test_ws.rs b/actix-http/tests/test_ws.rs index 4b4b8f089..ff9def85b 100644 --- a/actix-http/tests/test_ws.rs +++ b/actix-http/tests/test_ws.rs @@ -1,4 +1,5 @@ use std::cell::Cell; +use std::future::Future; use std::marker::PhantomData; use std::pin::Pin; use std::sync::{Arc, Mutex}; @@ -9,9 +10,9 @@ use actix_http_test::test_server; use actix_service::{fn_factory, Service}; use actix_utils::framed::Dispatcher; use bytes::Bytes; -use futures::future; -use futures::task::{Context, Poll}; -use futures::{Future, SinkExt, StreamExt}; +use futures_util::future; +use futures_util::task::{Context, Poll}; +use futures_util::{SinkExt, StreamExt}; struct WsService(Arc, Cell)>>); From ab4d8704f1cfc5d61b456b89db1bda6d66cd94aa Mon Sep 17 00:00:00 2001 From: Yuki Okushi Date: Mon, 18 May 2020 11:45:44 +0900 Subject: [PATCH 06/13] multipart: Minimize `futures` dependencies --- actix-multipart/Cargo.toml | 2 +- actix-multipart/src/extractor.rs | 4 ++-- actix-multipart/src/server.rs | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/actix-multipart/Cargo.toml b/actix-multipart/Cargo.toml index d8421d0eb..2fed60d33 100644 --- a/actix-multipart/Cargo.toml +++ b/actix-multipart/Cargo.toml @@ -22,7 +22,7 @@ actix-utils = "1.0.3" bytes = "0.5.3" derive_more = "0.99.2" httparse = "1.3" -futures = "0.3.1" +futures-util = { version = "0.3.5", default-features = false } log = "0.4" mime = "0.3" twoway = "0.2" diff --git a/actix-multipart/src/extractor.rs b/actix-multipart/src/extractor.rs index 71c815227..4e4caee01 100644 --- a/actix-multipart/src/extractor.rs +++ b/actix-multipart/src/extractor.rs @@ -1,6 +1,6 @@ //! Multipart payload support use actix_web::{dev::Payload, Error, FromRequest, HttpRequest}; -use futures::future::{ok, Ready}; +use futures_util::future::{ok, Ready}; use crate::server::Multipart; @@ -11,7 +11,7 @@ use crate::server::Multipart; /// ## Server example /// /// ```rust -/// use futures::{Stream, StreamExt}; +/// use futures_util::stream::{Stream, StreamExt}; /// use actix_web::{web, HttpResponse, Error}; /// use actix_multipart as mp; /// diff --git a/actix-multipart/src/server.rs b/actix-multipart/src/server.rs index 2555cb7a3..f96a7821a 100644 --- a/actix-multipart/src/server.rs +++ b/actix-multipart/src/server.rs @@ -8,7 +8,7 @@ use std::task::{Context, Poll}; use std::{cmp, fmt}; use bytes::{Bytes, BytesMut}; -use futures::stream::{LocalBoxStream, Stream, StreamExt}; +use futures_util::stream::{LocalBoxStream, Stream, StreamExt}; use httparse; use mime; @@ -814,7 +814,7 @@ mod tests { use actix_utils::mpsc; use actix_web::http::header::{DispositionParam, DispositionType}; use bytes::Bytes; - use futures::future::lazy; + use futures_util::future::lazy; #[actix_rt::test] async fn test_boundary() { From fc8e07b947b40d76dc9d251be9ba4392ee8a4df8 Mon Sep 17 00:00:00 2001 From: Yuki Okushi Date: Mon, 18 May 2020 11:46:02 +0900 Subject: [PATCH 07/13] actors: Minimize `futures` dependencies --- actix-web-actors/Cargo.toml | 4 +++- actix-web-actors/src/context.rs | 5 +++-- actix-web-actors/src/ws.rs | 5 +++-- actix-web-actors/tests/test_ws.rs | 2 +- 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/actix-web-actors/Cargo.toml b/actix-web-actors/Cargo.toml index f9bcc65de..b62616958 100644 --- a/actix-web-actors/Cargo.toml +++ b/actix-web-actors/Cargo.toml @@ -21,9 +21,11 @@ actix-web = "3.0.0-alpha.2" actix-http = "2.0.0-alpha.3" actix-codec = "0.2.0" bytes = "0.5.2" -futures = "0.3.1" +futures-channel = { version = "0.3.5", default-features = false } +futures-core = { version = "0.3.5", default-features = false } pin-project = "0.4.6" [dev-dependencies] actix-rt = "1.0.0" env_logger = "0.7" +futures-util = { version = "0.3.5", default-features = false } diff --git a/actix-web-actors/src/context.rs b/actix-web-actors/src/context.rs index c889092d2..0839a4288 100644 --- a/actix-web-actors/src/context.rs +++ b/actix-web-actors/src/context.rs @@ -1,4 +1,5 @@ use std::collections::VecDeque; +use std::future::Future; use std::pin::Pin; use std::task::{Context, Poll}; @@ -11,8 +12,8 @@ use actix::{ }; use actix_web::error::Error; use bytes::Bytes; -use futures::channel::oneshot::Sender; -use futures::{Future, Stream}; +use futures_channel::oneshot::Sender; +use futures_core::Stream; /// Execution context for http actors pub struct HttpContext diff --git a/actix-web-actors/src/ws.rs b/actix-web-actors/src/ws.rs index b28aeade4..3f5972532 100644 --- a/actix-web-actors/src/ws.rs +++ b/actix-web-actors/src/ws.rs @@ -1,5 +1,6 @@ //! Websocket integration use std::collections::VecDeque; +use std::future::Future; use std::io; use std::pin::Pin; use std::task::{Context, Poll}; @@ -23,8 +24,8 @@ use actix_web::error::{Error, PayloadError}; use actix_web::http::{header, Method, StatusCode}; use actix_web::{HttpRequest, HttpResponse}; use bytes::{Bytes, BytesMut}; -use futures::channel::oneshot::Sender; -use futures::{Future, Stream}; +use futures_channel::oneshot::Sender; +use futures_core::Stream; /// Do websocket handshake and start ws actor. pub fn start(actor: A, req: &HttpRequest, stream: T) -> Result diff --git a/actix-web-actors/tests/test_ws.rs b/actix-web-actors/tests/test_ws.rs index 076e375d3..25977c2c2 100644 --- a/actix-web-actors/tests/test_ws.rs +++ b/actix-web-actors/tests/test_ws.rs @@ -2,7 +2,7 @@ use actix::prelude::*; use actix_web::{test, web, App, HttpRequest}; use actix_web_actors::*; use bytes::Bytes; -use futures::{SinkExt, StreamExt}; +use futures_util::{SinkExt, StreamExt}; struct Ws; From 24372467d96250cc6f71c9f055050afe0d9dc6f8 Mon Sep 17 00:00:00 2001 From: Yuki Okushi Date: Mon, 18 May 2020 11:46:37 +0900 Subject: [PATCH 08/13] codegen: Minimize `futures` dependencies --- actix-web-codegen/Cargo.toml | 2 +- actix-web-codegen/src/lib.rs | 1 - actix-web-codegen/tests/test_macro.rs | 3 ++- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/actix-web-codegen/Cargo.toml b/actix-web-codegen/Cargo.toml index 835c9fcc9..c7b06e311 100644 --- a/actix-web-codegen/Cargo.toml +++ b/actix-web-codegen/Cargo.toml @@ -19,4 +19,4 @@ proc-macro2 = "^1" [dev-dependencies] actix-rt = "1.0.0" actix-web = "3.0.0-alpha.2" -futures = "0.3.1" +futures-util = { version = "0.3.5", default-features = false } diff --git a/actix-web-codegen/src/lib.rs b/actix-web-codegen/src/lib.rs index 39a8a6464..2a49b4714 100644 --- a/actix-web-codegen/src/lib.rs +++ b/actix-web-codegen/src/lib.rs @@ -33,7 +33,6 @@ //! ```rust //! use actix_web::HttpResponse; //! use actix_web_codegen::get; -//! use futures::{future, Future}; //! //! #[get("/test")] //! async fn async_test() -> Result { diff --git a/actix-web-codegen/tests/test_macro.rs b/actix-web-codegen/tests/test_macro.rs index 8264a7fd7..0ef7e1c75 100644 --- a/actix-web-codegen/tests/test_macro.rs +++ b/actix-web-codegen/tests/test_macro.rs @@ -1,10 +1,11 @@ +use std::future::Future; use std::pin::Pin; use std::task::{Context, Poll}; use actix_web::{http, test, web::Path, App, HttpResponse, Responder, Error}; use actix_web::dev::{Service, Transform, ServiceRequest, ServiceResponse}; use actix_web_codegen::{connect, delete, get, head, options, patch, post, put, trace}; -use futures::{future, Future}; +use futures_util::future; use actix_web::http::header::{HeaderName, HeaderValue}; // Make sure that we can name function as 'config' From d7abbff3b0acfa0909a7dd6cd292419881bad746 Mon Sep 17 00:00:00 2001 From: Yuki Okushi Date: Mon, 18 May 2020 11:46:57 +0900 Subject: [PATCH 09/13] awc: Minimize `futures` dependencies --- awc/Cargo.toml | 4 ++-- awc/src/lib.rs | 1 - awc/src/request.rs | 2 +- awc/src/response.rs | 3 ++- awc/src/sender.rs | 3 ++- awc/tests/test_client.rs | 2 +- awc/tests/test_rustls_client.rs | 2 +- awc/tests/test_ssl_client.rs | 2 +- awc/tests/test_ws.rs | 4 ++-- 9 files changed, 12 insertions(+), 11 deletions(-) diff --git a/awc/Cargo.toml b/awc/Cargo.toml index 5ccf31654..c31c19025 100644 --- a/awc/Cargo.toml +++ b/awc/Cargo.toml @@ -42,7 +42,7 @@ actix-rt = "1.0.0" base64 = "0.11" bytes = "0.5.3" derive_more = "0.99.2" -futures-core = "0.3.1" +futures-core = { version = "0.3.5", default-features = false } log =" 0.4" mime = "0.3" percent-encoding = "2.1" @@ -63,6 +63,6 @@ actix-server = "1.0.0" actix-tls = { version = "2.0.0-alpha.1", features = ["openssl", "rustls"] } brotli2 = "0.3.2" flate2 = "1.0.13" -futures = "0.3.1" +futures-util = { version = "0.3.5", default-features = false } env_logger = "0.7" webpki = "0.21" diff --git a/awc/src/lib.rs b/awc/src/lib.rs index 952a15369..1cc31a194 100644 --- a/awc/src/lib.rs +++ b/awc/src/lib.rs @@ -7,7 +7,6 @@ //! An HTTP Client //! //! ```rust -//! use futures::future::{lazy, Future}; //! use actix_rt::System; //! use awc::Client; //! diff --git a/awc/src/request.rs b/awc/src/request.rs index 67b063a8e..21a7cd911 100644 --- a/awc/src/request.rs +++ b/awc/src/request.rs @@ -156,7 +156,7 @@ impl ClientRequest { /// /// ```rust /// fn main() { - /// # actix_rt::System::new("test").block_on(futures::future::lazy(|_| { + /// # actix_rt::System::new("test").block_on(futures_util::future::lazy(|_| { /// let req = awc::Client::new() /// .get("http://www.rust-lang.org") /// .set(awc::http::header::Date::now()) diff --git a/awc/src/response.rs b/awc/src/response.rs index 20093c72d..ffc8c5408 100644 --- a/awc/src/response.rs +++ b/awc/src/response.rs @@ -1,11 +1,12 @@ use std::cell::{Ref, RefMut}; use std::fmt; +use std::future::Future; use std::marker::PhantomData; use std::pin::Pin; use std::task::{Context, Poll}; use bytes::{Bytes, BytesMut}; -use futures_core::{ready, Future, Stream}; +use futures_core::{ready, Stream}; use actix_http::cookie::Cookie; use actix_http::error::{CookieParseError, PayloadError}; diff --git a/awc/src/sender.rs b/awc/src/sender.rs index 983e730e1..5e0f5beec 100644 --- a/awc/src/sender.rs +++ b/awc/src/sender.rs @@ -1,3 +1,4 @@ +use std::future::Future; use std::net; use std::pin::Pin; use std::rc::Rc; @@ -7,7 +8,7 @@ use std::time::Duration; use actix_rt::time::{delay_for, Delay}; use bytes::Bytes; use derive_more::From; -use futures_core::{Future, Stream}; +use futures_core::Stream; use serde::Serialize; use actix_http::body::{Body, BodyStream}; diff --git a/awc/tests/test_client.rs b/awc/tests/test_client.rs index 449734a9f..cc61f1006 100644 --- a/awc/tests/test_client.rs +++ b/awc/tests/test_client.rs @@ -9,7 +9,7 @@ use bytes::Bytes; use flate2::read::GzDecoder; use flate2::write::GzEncoder; use flate2::Compression; -use futures::future::ok; +use futures_util::future::ok; use rand::Rng; use actix_http::HttpService; diff --git a/awc/tests/test_rustls_client.rs b/awc/tests/test_rustls_client.rs index 7407a33fc..0c6be76d4 100644 --- a/awc/tests/test_rustls_client.rs +++ b/awc/tests/test_rustls_client.rs @@ -7,7 +7,7 @@ use actix_http_test::test_server; use actix_service::{map_config, pipeline_factory, ServiceFactory}; use actix_web::http::Version; use actix_web::{dev::AppConfig, web, App, HttpResponse}; -use futures::future::ok; +use futures_util::future::ok; use open_ssl::ssl::{SslAcceptor, SslFiletype, SslMethod, SslVerifyMode}; use rust_tls::ClientConfig; diff --git a/awc/tests/test_ssl_client.rs b/awc/tests/test_ssl_client.rs index 8e128ad0c..b2a2e1785 100644 --- a/awc/tests/test_ssl_client.rs +++ b/awc/tests/test_ssl_client.rs @@ -7,7 +7,7 @@ use actix_http_test::test_server; use actix_service::{map_config, pipeline_factory, ServiceFactory}; use actix_web::http::Version; use actix_web::{dev::AppConfig, web, App, HttpResponse}; -use futures::future::ok; +use futures_util::future::ok; use open_ssl::ssl::{SslAcceptor, SslConnector, SslFiletype, SslMethod, SslVerifyMode}; fn ssl_acceptor() -> SslAcceptor { diff --git a/awc/tests/test_ws.rs b/awc/tests/test_ws.rs index 779a4301c..d3f66814f 100644 --- a/awc/tests/test_ws.rs +++ b/awc/tests/test_ws.rs @@ -4,8 +4,8 @@ use actix_codec::Framed; use actix_http::{body::BodySize, h1, ws, Error, HttpService, Request, Response}; use actix_http_test::test_server; use bytes::Bytes; -use futures::future::ok; -use futures::{SinkExt, StreamExt}; +use futures_util::future::ok; +use futures_util::{SinkExt, StreamExt}; async fn ws_service(req: ws::Frame) -> Result { match req { From a98e53ecb8933a351c4c299ef175c102b35a8d67 Mon Sep 17 00:00:00 2001 From: Yuki Okushi Date: Mon, 18 May 2020 11:47:20 +0900 Subject: [PATCH 10/13] web: Minimize `futures` dependencies --- Cargo.toml | 4 +++- benches/server.rs | 2 +- src/app.rs | 4 ++-- src/app_service.rs | 2 +- src/data.rs | 2 +- src/extract.rs | 6 +++--- src/handler.rs | 4 ++-- src/middleware/compress.rs | 4 ++-- src/middleware/condition.rs | 2 +- src/middleware/defaultheaders.rs | 4 ++-- src/middleware/errhandlers.rs | 4 ++-- src/middleware/logger.rs | 6 +++--- src/middleware/normalize.rs | 2 +- src/request.rs | 2 +- src/resource.rs | 4 ++-- src/responder.rs | 4 ++-- src/route.rs | 2 +- src/scope.rs | 5 +++-- src/server.rs | 2 +- src/service.rs | 2 +- src/test.rs | 5 +++-- src/types/form.rs | 4 ++-- src/types/json.rs | 4 ++-- src/types/path.rs | 2 +- src/types/payload.rs | 14 +++++++++----- src/types/query.rs | 2 +- src/types/readlines.rs | 4 ++-- src/web.rs | 4 ++-- tests/test_server.rs | 5 +++-- 29 files changed, 60 insertions(+), 51 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 4d2d783ef..ce26e82e0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -84,7 +84,9 @@ awc = { version = "2.0.0-alpha.1", default-features = false } bytes = "0.5.3" derive_more = "0.99.2" encoding_rs = "0.8" -futures = "0.3.1" +futures-channel = { version = "0.3.5", default-features = false } +futures-core = { version = "0.3.5", default-features = false } +futures-util = { version = "0.3.5", default-features = false } fxhash = "0.2.1" log = "0.4" mime = "0.3" diff --git a/benches/server.rs b/benches/server.rs index 93079a223..70531adf7 100644 --- a/benches/server.rs +++ b/benches/server.rs @@ -1,7 +1,7 @@ use actix_web::{test, web, App, HttpResponse}; use awc::Client; use criterion::{criterion_group, criterion_main, Criterion}; -use futures::future::join_all; +use futures_util::future::join_all; const STR: &str = "Hello World Hello World Hello World Hello World Hello World \ Hello World Hello World Hello World Hello World Hello World \ diff --git a/src/app.rs b/src/app.rs index 7d3100db7..9e38f5bc9 100644 --- a/src/app.rs +++ b/src/app.rs @@ -10,7 +10,7 @@ use actix_service::boxed::{self, BoxServiceFactory}; use actix_service::{ apply, apply_fn_factory, IntoServiceFactory, ServiceFactory, Transform, }; -use futures::future::FutureExt; +use futures_util::future::FutureExt; use crate::app_service::{AppEntry, AppInit, AppRoutingFactory}; use crate::config::ServiceConfig; @@ -474,7 +474,7 @@ where mod tests { use actix_service::Service; use bytes::Bytes; - use futures::future::{ok, err}; + use futures_util::future::{ok, err}; use super::*; use crate::http::{header, HeaderValue, Method, StatusCode}; diff --git a/src/app_service.rs b/src/app_service.rs index 693624ba0..233cfc0d5 100644 --- a/src/app_service.rs +++ b/src/app_service.rs @@ -9,7 +9,7 @@ use actix_http::{Extensions, Request, Response}; use actix_router::{Path, ResourceDef, ResourceInfo, Router, Url}; use actix_service::boxed::{self, BoxService, BoxServiceFactory}; use actix_service::{fn_service, Service, ServiceFactory}; -use futures::future::{join_all, ok, FutureExt, LocalBoxFuture}; +use futures_util::future::{join_all, ok, FutureExt, LocalBoxFuture}; use crate::config::{AppConfig, AppService}; use crate::data::{DataFactory, FnDataFactory}; diff --git a/src/data.rs b/src/data.rs index e657d8b7b..34ada863d 100644 --- a/src/data.rs +++ b/src/data.rs @@ -3,7 +3,7 @@ use std::sync::Arc; use actix_http::error::{Error, ErrorInternalServerError}; use actix_http::Extensions; -use futures::future::{err, ok, LocalBoxFuture, Ready}; +use futures_util::future::{err, ok, LocalBoxFuture, Ready}; use crate::dev::Payload; use crate::extract::FromRequest; diff --git a/src/extract.rs b/src/extract.rs index 5289bd7db..df9c34cb3 100644 --- a/src/extract.rs +++ b/src/extract.rs @@ -4,7 +4,7 @@ use std::pin::Pin; use std::task::{Context, Poll}; use actix_http::error::Error; -use futures::future::{ok, FutureExt, LocalBoxFuture, Ready}; +use futures_util::future::{ok, FutureExt, LocalBoxFuture, Ready}; use crate::dev::Payload; use crate::request::HttpRequest; @@ -50,7 +50,7 @@ pub trait FromRequest: Sized { /// ```rust /// use actix_web::{web, dev, App, Error, HttpRequest, FromRequest}; /// use actix_web::error::ErrorBadRequest; -/// use futures::future::{ok, err, Ready}; +/// use futures_util::future::{ok, err, Ready}; /// use serde_derive::Deserialize; /// use rand; /// @@ -122,7 +122,7 @@ where /// ```rust /// use actix_web::{web, dev, App, Result, Error, HttpRequest, FromRequest}; /// use actix_web::error::ErrorBadRequest; -/// use futures::future::{ok, err, Ready}; +/// use futures_util::future::{ok, err, Ready}; /// use serde_derive::Deserialize; /// use rand; /// diff --git a/src/handler.rs b/src/handler.rs index 33cd2408d..669512ab3 100644 --- a/src/handler.rs +++ b/src/handler.rs @@ -6,8 +6,8 @@ use std::task::{Context, Poll}; use actix_http::{Error, Response}; use actix_service::{Service, ServiceFactory}; -use futures::future::{ok, Ready}; -use futures::ready; +use futures_util::future::{ok, Ready}; +use futures_util::ready; use pin_project::pin_project; use crate::extract::FromRequest; diff --git a/src/middleware/compress.rs b/src/middleware/compress.rs index 70006ab3c..6de451c84 100644 --- a/src/middleware/compress.rs +++ b/src/middleware/compress.rs @@ -11,7 +11,7 @@ use actix_http::encoding::Encoder; use actix_http::http::header::{ContentEncoding, ACCEPT_ENCODING}; use actix_http::Error; use actix_service::{Service, Transform}; -use futures::future::{ok, Ready}; +use futures_util::future::{ok, Ready}; use pin_project::pin_project; use crate::dev::BodyEncoding; @@ -133,7 +133,7 @@ where fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { let this = self.project(); - match futures::ready!(this.fut.poll(cx)) { + match futures_util::ready!(this.fut.poll(cx)) { Ok(resp) => { let enc = if let Some(enc) = resp.response().get_encoding() { enc diff --git a/src/middleware/condition.rs b/src/middleware/condition.rs index 8c6909134..7ff81437b 100644 --- a/src/middleware/condition.rs +++ b/src/middleware/condition.rs @@ -2,7 +2,7 @@ use std::task::{Context, Poll}; use actix_service::{Service, Transform}; -use futures::future::{ok, Either, FutureExt, LocalBoxFuture}; +use futures_util::future::{ok, Either, FutureExt, LocalBoxFuture}; /// `Middleware` for conditionally enables another middleware. /// The controlled middleware must not change the `Service` interfaces. diff --git a/src/middleware/defaultheaders.rs b/src/middleware/defaultheaders.rs index ba001c77b..ef2e56e69 100644 --- a/src/middleware/defaultheaders.rs +++ b/src/middleware/defaultheaders.rs @@ -4,7 +4,7 @@ use std::rc::Rc; use std::task::{Context, Poll}; use actix_service::{Service, Transform}; -use futures::future::{ok, FutureExt, LocalBoxFuture, Ready}; +use futures_util::future::{ok, FutureExt, LocalBoxFuture, Ready}; use crate::http::header::{HeaderName, HeaderValue, CONTENT_TYPE}; use crate::http::{Error as HttpError, HeaderMap}; @@ -157,7 +157,7 @@ where #[cfg(test)] mod tests { use actix_service::IntoService; - use futures::future::ok; + use futures_util::future::ok; use super::*; use crate::dev::ServiceRequest; diff --git a/src/middleware/errhandlers.rs b/src/middleware/errhandlers.rs index 71886af0b..93a5d3f22 100644 --- a/src/middleware/errhandlers.rs +++ b/src/middleware/errhandlers.rs @@ -3,7 +3,7 @@ use std::rc::Rc; use std::task::{Context, Poll}; use actix_service::{Service, Transform}; -use futures::future::{ok, FutureExt, LocalBoxFuture, Ready}; +use futures_util::future::{ok, FutureExt, LocalBoxFuture, Ready}; use fxhash::FxHashMap; use crate::dev::{ServiceRequest, ServiceResponse}; @@ -147,7 +147,7 @@ where #[cfg(test)] mod tests { use actix_service::IntoService; - use futures::future::ok; + use futures_util::future::ok; use super::*; use crate::http::{header::CONTENT_TYPE, HeaderValue, StatusCode}; diff --git a/src/middleware/logger.rs b/src/middleware/logger.rs index d6b931bb4..e63efc832 100644 --- a/src/middleware/logger.rs +++ b/src/middleware/logger.rs @@ -11,7 +11,7 @@ use std::task::{Context, Poll}; use actix_service::{Service, Transform}; use bytes::Bytes; -use futures::future::{ok, Ready}; +use futures_util::future::{ok, Ready}; use log::debug; use regex::Regex; use time::OffsetDateTime; @@ -216,7 +216,7 @@ where fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { let this = self.project(); - let res = match futures::ready!(this.fut.poll(cx)) { + let res = match futures_util::ready!(this.fut.poll(cx)) { Ok(res) => res, Err(e) => return Poll::Ready(Err(e)), }; @@ -506,7 +506,7 @@ impl<'a> fmt::Display for FormatDisplay<'a> { #[cfg(test)] mod tests { use actix_service::{IntoService, Service, Transform}; - use futures::future::ok; + use futures_util::future::ok; use super::*; use crate::http::{header, StatusCode}; diff --git a/src/middleware/normalize.rs b/src/middleware/normalize.rs index 38b5310f7..139ec892e 100644 --- a/src/middleware/normalize.rs +++ b/src/middleware/normalize.rs @@ -4,7 +4,7 @@ use std::task::{Context, Poll}; use actix_http::http::{PathAndQuery, Uri}; use actix_service::{Service, Transform}; use bytes::Bytes; -use futures::future::{ok, Ready}; +use futures_util::future::{ok, Ready}; use regex::Regex; use crate::service::{ServiceRequest, ServiceResponse}; diff --git a/src/request.rs b/src/request.rs index 72fea1faf..f8abeb1bb 100644 --- a/src/request.rs +++ b/src/request.rs @@ -5,7 +5,7 @@ use std::{fmt, net}; use actix_http::http::{HeaderMap, Method, Uri, Version}; use actix_http::{Error, Extensions, HttpMessage, Message, Payload, RequestHead}; use actix_router::{Path, Url}; -use futures::future::{ok, Ready}; +use futures_util::future::{ok, Ready}; use tinyvec::TinyVec; use crate::config::AppConfig; diff --git a/src/resource.rs b/src/resource.rs index 4c0e26c18..5da1de62f 100644 --- a/src/resource.rs +++ b/src/resource.rs @@ -11,7 +11,7 @@ use actix_service::boxed::{self, BoxService, BoxServiceFactory}; use actix_service::{ apply, apply_fn_factory, IntoServiceFactory, Service, ServiceFactory, Transform, }; -use futures::future::{ok, Either, LocalBoxFuture, Ready}; +use futures_util::future::{ok, Either, LocalBoxFuture, Ready}; use crate::data::Data; use crate::dev::{insert_slash, AppService, HttpServiceFactory, ResourceDef}; @@ -588,7 +588,7 @@ mod tests { use actix_rt::time::delay_for; use actix_service::Service; - use futures::future::ok; + use futures_util::future::ok; use crate::http::{header, HeaderValue, Method, StatusCode}; use crate::middleware::DefaultHeaders; diff --git a/src/responder.rs b/src/responder.rs index 7189eecf1..367c9fccf 100644 --- a/src/responder.rs +++ b/src/responder.rs @@ -10,8 +10,8 @@ use actix_http::http::{ }; use actix_http::{Error, Response, ResponseBuilder}; use bytes::{Bytes, BytesMut}; -use futures::future::{err, ok, Either as EitherFuture, Ready}; -use futures::ready; +use futures_util::future::{err, ok, Either as EitherFuture, Ready}; +use futures_util::ready; use pin_project::{pin_project, project}; use crate::request::HttpRequest; diff --git a/src/route.rs b/src/route.rs index 11455630c..8da9aec1b 100644 --- a/src/route.rs +++ b/src/route.rs @@ -5,7 +5,7 @@ use std::task::{Context, Poll}; use actix_http::{http::Method, Error}; use actix_service::{Service, ServiceFactory}; -use futures::future::{ready, FutureExt, LocalBoxFuture}; +use futures_util::future::{ready, FutureExt, LocalBoxFuture}; use crate::extract::FromRequest; use crate::guard::{self, Guard}; diff --git a/src/scope.rs b/src/scope.rs index 5afca61da..b9166a4bf 100644 --- a/src/scope.rs +++ b/src/scope.rs @@ -1,5 +1,6 @@ use std::cell::RefCell; use std::fmt; +use std::future::Future; use std::pin::Pin; use std::rc::Rc; use std::task::{Context, Poll}; @@ -10,7 +11,7 @@ use actix_service::boxed::{self, BoxService, BoxServiceFactory}; use actix_service::{ apply, apply_fn_factory, IntoServiceFactory, Service, ServiceFactory, Transform, }; -use futures::future::{ok, Either, Future, LocalBoxFuture, Ready}; +use futures_util::future::{ok, Either, LocalBoxFuture, Ready}; use crate::config::ServiceConfig; use crate::data::Data; @@ -666,7 +667,7 @@ impl ServiceFactory for ScopeEndpoint { mod tests { use actix_service::Service; use bytes::Bytes; - use futures::future::ok; + use futures_util::future::ok; use crate::dev::{Body, ResponseBody}; use crate::http::{header, HeaderValue, Method, StatusCode}; diff --git a/src/server.rs b/src/server.rs index 97dd9f7f7..248cd39b3 100644 --- a/src/server.rs +++ b/src/server.rs @@ -13,7 +13,7 @@ use actix_http::Protocol; #[cfg(unix)] use actix_service::pipeline_factory; #[cfg(unix)] -use futures::future::ok; +use futures_util::future::ok; #[cfg(feature = "openssl")] use actix_tls::openssl::{AlpnError, SslAcceptor, SslAcceptorBuilder}; diff --git a/src/service.rs b/src/service.rs index c0148a9b2..232a2f132 100644 --- a/src/service.rs +++ b/src/service.rs @@ -536,7 +536,7 @@ mod tests { use crate::test::{init_service, TestRequest}; use crate::{guard, http, web, App, HttpResponse}; use actix_service::Service; - use futures::future::ok; + use futures_util::future::ok; #[test] fn test_service_request() { diff --git a/src/test.rs b/src/test.rs index c8a738d83..79e351eb3 100644 --- a/src/test.rs +++ b/src/test.rs @@ -18,8 +18,9 @@ use actix_service::{ use awc::error::PayloadError; use awc::{Client, ClientRequest, ClientResponse, Connector}; use bytes::{Bytes, BytesMut}; -use futures::future::ok; -use futures::stream::{Stream, StreamExt}; +use futures_core::Stream; +use futures_util::future::ok; +use futures_util::StreamExt; use net2::TcpBuilder; use serde::de::DeserializeOwned; use serde::Serialize; diff --git a/src/types/form.rs b/src/types/form.rs index d917345e1..ca1a4b103 100644 --- a/src/types/form.rs +++ b/src/types/form.rs @@ -9,8 +9,8 @@ use std::{fmt, ops}; use actix_http::{Error, HttpMessage, Payload, Response}; use bytes::BytesMut; use encoding_rs::{Encoding, UTF_8}; -use futures::future::{err, ok, FutureExt, LocalBoxFuture, Ready}; -use futures::StreamExt; +use futures_util::future::{err, ok, FutureExt, LocalBoxFuture, Ready}; +use futures_util::StreamExt; use serde::de::DeserializeOwned; use serde::Serialize; diff --git a/src/types/json.rs b/src/types/json.rs index df8aa4fc6..f746fd432 100644 --- a/src/types/json.rs +++ b/src/types/json.rs @@ -7,8 +7,8 @@ use std::task::{Context, Poll}; use std::{fmt, ops}; use bytes::BytesMut; -use futures::future::{err, ok, FutureExt, LocalBoxFuture, Ready}; -use futures::StreamExt; +use futures_util::future::{err, ok, FutureExt, LocalBoxFuture, Ready}; +use futures_util::StreamExt; use serde::de::DeserializeOwned; use serde::Serialize; diff --git a/src/types/path.rs b/src/types/path.rs index a37cb8f12..82050171c 100644 --- a/src/types/path.rs +++ b/src/types/path.rs @@ -4,7 +4,7 @@ use std::{fmt, ops}; use actix_http::error::{Error, ErrorNotFound}; use actix_router::PathDeserializer; -use futures::future::{ready, Ready}; +use futures_util::future::{ready, Ready}; use serde::de; use crate::dev::Payload; diff --git a/src/types/payload.rs b/src/types/payload.rs index 449e6c5b0..bad33bfc6 100644 --- a/src/types/payload.rs +++ b/src/types/payload.rs @@ -8,8 +8,9 @@ use actix_http::error::{Error, ErrorBadRequest, PayloadError}; use actix_http::HttpMessage; use bytes::{Bytes, BytesMut}; use encoding_rs::UTF_8; -use futures::future::{err, ok, Either, FutureExt, LocalBoxFuture, Ready}; -use futures::{Stream, StreamExt}; +use futures_core::stream::Stream; +use futures_util::future::{err, ok, Either, FutureExt, LocalBoxFuture, Ready}; +use futures_util::StreamExt; use mime::Mime; use crate::dev; @@ -22,9 +23,10 @@ use crate::request::HttpRequest; /// ## Example /// /// ```rust -/// use futures::{Future, Stream, StreamExt}; /// use actix_web::{web, error, App, Error, HttpResponse}; -/// +/// use std::future::Future; +/// use futures_core::stream::Stream; +/// use futures_util::StreamExt; /// /// extract binary data from request /// async fn index(mut body: web::Payload) -> Result /// { @@ -70,8 +72,10 @@ impl Stream for Payload { /// ## Example /// /// ```rust -/// use futures::{Future, Stream, StreamExt}; /// use actix_web::{web, error, App, Error, HttpResponse}; +/// use std::future::Future; +/// use futures_core::stream::Stream; +/// use futures_util::StreamExt; /// /// /// extract binary data from request /// async fn index(mut body: web::Payload) -> Result diff --git a/src/types/query.rs b/src/types/query.rs index 73ea14f17..cf1a8930d 100644 --- a/src/types/query.rs +++ b/src/types/query.rs @@ -4,7 +4,7 @@ use std::sync::Arc; use std::{fmt, ops}; use actix_http::error::Error; -use futures::future::{err, ok, Ready}; +use futures_util::future::{err, ok, Ready}; use serde::de; use crate::dev::Payload; diff --git a/src/types/readlines.rs b/src/types/readlines.rs index 82853381b..f03235377 100644 --- a/src/types/readlines.rs +++ b/src/types/readlines.rs @@ -5,7 +5,7 @@ use std::task::{Context, Poll}; use bytes::{Bytes, BytesMut}; use encoding_rs::{Encoding, UTF_8}; -use futures::Stream; +use futures_util::stream::Stream; use crate::dev::Payload; use crate::error::{PayloadError, ReadlinesError}; @@ -172,7 +172,7 @@ where #[cfg(test)] mod tests { - use futures::stream::StreamExt; + use futures_util::stream::StreamExt; use super::*; use crate::test::TestRequest; diff --git a/src/web.rs b/src/web.rs index f47cf865e..1d1174f41 100644 --- a/src/web.rs +++ b/src/web.rs @@ -1,11 +1,11 @@ //! Essentials helper functions and types for application registration. use actix_http::http::Method; use actix_router::IntoPattern; -use futures::Future; +use std::future::Future; pub use actix_http::Response as HttpResponse; pub use bytes::{Bytes, BytesMut}; -pub use futures::channel::oneshot::Canceled; +pub use futures_channel::oneshot::Canceled; use crate::error::BlockingError; use crate::extract::FromRequest; diff --git a/tests/test_server.rs b/tests/test_server.rs index a4dfa65a0..926b211ee 100644 --- a/tests/test_server.rs +++ b/tests/test_server.rs @@ -1,3 +1,4 @@ +use std::future::Future; use std::io::{Read, Write}; use std::pin::Pin; use std::task::{Context, Poll}; @@ -11,7 +12,7 @@ use bytes::Bytes; use flate2::read::GzDecoder; use flate2::write::{GzEncoder, ZlibDecoder, ZlibEncoder}; use flate2::Compression; -use futures::{ready, Future}; +use futures_util::ready; use rand::{distributions::Alphanumeric, Rng}; use actix_web::dev::BodyEncoding; @@ -56,7 +57,7 @@ impl TestBody { } } -impl futures::Stream for TestBody { +impl futures_core::stream::Stream for TestBody { type Item = Result; fn poll_next( From 81b0c32062e43f369c4d5ffa9d211b311807d811 Mon Sep 17 00:00:00 2001 From: Yuki Okushi Date: Mon, 18 May 2020 11:47:33 +0900 Subject: [PATCH 11/13] test-server: Minimize `futures` dependencies --- test-server/Cargo.toml | 2 +- test-server/src/lib.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/test-server/Cargo.toml b/test-server/Cargo.toml index f44ecc5fd..8357815c9 100644 --- a/test-server/Cargo.toml +++ b/test-server/Cargo.toml @@ -41,7 +41,7 @@ awc = "2.0.0-alpha.1" base64 = "0.11" bytes = "0.5.3" -futures = "0.3.1" +futures-core = { version = "0.3.5", default-features = false } http = "0.2.0" log = "0.4" env_logger = "0.6" diff --git a/test-server/src/lib.rs b/test-server/src/lib.rs index c36cc706f..4fa0ecc17 100644 --- a/test-server/src/lib.rs +++ b/test-server/src/lib.rs @@ -7,7 +7,7 @@ use actix_rt::{net::TcpStream, System}; use actix_server::{Server, ServiceFactory}; use awc::{error::PayloadError, ws, Client, ClientRequest, ClientResponse, Connector}; use bytes::Bytes; -use futures::Stream; +use futures_core::stream::Stream; use http::Method; use net2::TcpBuilder; From 2dac9afc4e377490c1b41b238da2e9cf9ae800bf Mon Sep 17 00:00:00 2001 From: Yuki Okushi Date: Tue, 19 May 2020 09:25:51 +0900 Subject: [PATCH 12/13] test-server: Replace `net2` crate with `socket2` --- test-server/CHANGES.md | 1 + test-server/Cargo.toml | 2 +- test-server/src/lib.rs | 10 +++++----- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/test-server/CHANGES.md b/test-server/CHANGES.md index 6a92d581c..1570e36d8 100644 --- a/test-server/CHANGES.md +++ b/test-server/CHANGES.md @@ -6,6 +6,7 @@ * Update `actix-connect` dependency to 2.0.0-alpha.2 * Make `test_server` `async` fn. * Bump minimum supported Rust version to 1.40 +* Replace deprecated `net2` crate with `socket2` ## [1.0.0] - 2019-12-13 diff --git a/test-server/Cargo.toml b/test-server/Cargo.toml index 8357815c9..ebfbd55cd 100644 --- a/test-server/Cargo.toml +++ b/test-server/Cargo.toml @@ -45,7 +45,7 @@ futures-core = { version = "0.3.5", default-features = false } http = "0.2.0" log = "0.4" env_logger = "0.6" -net2 = "0.2" +socket2 = "0.3" serde = "1.0" serde_json = "1.0" sha1 = "0.6" diff --git a/test-server/src/lib.rs b/test-server/src/lib.rs index 4fa0ecc17..265d9a771 100644 --- a/test-server/src/lib.rs +++ b/test-server/src/lib.rs @@ -9,7 +9,7 @@ use awc::{error::PayloadError, ws, Client, ClientRequest, ClientResponse, Connec use bytes::Bytes; use futures_core::stream::Stream; use http::Method; -use net2::TcpBuilder; +use socket2::{Domain, Protocol, Socket, Type}; pub use actix_testing::*; @@ -104,10 +104,10 @@ pub async fn test_server>(factory: F) -> TestServer /// Get first available unused 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 9a7f93610a69b6bec00fda93598d1cffc50cb0e0 Mon Sep 17 00:00:00 2001 From: Yuki Okushi Date: Tue, 19 May 2020 09:34:37 +0900 Subject: [PATCH 13/13] web: Replace `net2` crate with `socket2` --- CHANGES.md | 2 ++ Cargo.toml | 2 +- src/server.rs | 17 +++++++++-------- src/test.rs | 10 +++++----- tests/test_httpserver.rs | 18 ++++-------------- 5 files changed, 21 insertions(+), 28 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index ab660808e..d5f36a9cb 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -14,6 +14,8 @@ * Bump minimum supported Rust version to 1.40 +* Replace deprecated `net2` crate with `socket2` + [#1485]: https://github.com/actix/actix-web/pull/1485 [#1509]: https://github.com/actix/actix-web/pull/1509 diff --git a/Cargo.toml b/Cargo.toml index ce26e82e0..a7b6e70d6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -90,7 +90,7 @@ futures-util = { version = "0.3.5", default-features = false } fxhash = "0.2.1" log = "0.4" mime = "0.3" -net2 = "0.2.33" +socket2 = "0.3" pin-project = "0.4.6" regex = "1.3" serde = { version = "1.0", features=["derive"] } diff --git a/src/server.rs b/src/server.rs index 248cd39b3..b2695b004 100644 --- a/src/server.rs +++ b/src/server.rs @@ -6,8 +6,6 @@ use actix_http::{body::MessageBody, Error, HttpService, KeepAlive, Request, Resp use actix_server::{Server, ServerBuilder}; use actix_service::{map_config, IntoServiceFactory, Service, ServiceFactory}; -use net2::TcpBuilder; - #[cfg(unix)] use actix_http::Protocol; #[cfg(unix)] @@ -562,13 +560,16 @@ 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()?, + use socket2::{Domain, Protocol, Socket, Type}; + 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()) } #[cfg(feature = "openssl")] diff --git a/src/test.rs b/src/test.rs index 79e351eb3..684e9c116 100644 --- a/src/test.rs +++ b/src/test.rs @@ -21,10 +21,10 @@ use bytes::{Bytes, BytesMut}; use futures_core::Stream; use futures_util::future::ok; use futures_util::StreamExt; -use net2::TcpBuilder; use serde::de::DeserializeOwned; use serde::Serialize; use serde_json; +use socket2::{Domain, Protocol, Socket, Type}; pub use actix_http::test::TestBuffer; @@ -913,10 +913,10 @@ impl TestServerConfig { /// Get first available unused 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() } diff --git a/tests/test_httpserver.rs b/tests/test_httpserver.rs index ecd5c9ffb..750084fdc 100644 --- a/tests/test_httpserver.rs +++ b/tests/test_httpserver.rs @@ -1,25 +1,15 @@ -use net2::TcpBuilder; use std::sync::mpsc; -use std::{net, thread, time::Duration}; +use std::{thread, time::Duration}; #[cfg(feature = "openssl")] use open_ssl::ssl::SslAcceptorBuilder; -use actix_web::{web, App, HttpResponse, HttpServer}; - -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(); - tcp.local_addr().unwrap() -} +use actix_web::{test, web, App, HttpResponse, HttpServer}; #[cfg(unix)] #[actix_rt::test] async fn test_start() { - let addr = unused_addr(); + let addr = test::unused_addr(); let (tx, rx) = mpsc::channel(); thread::spawn(move || { @@ -92,7 +82,7 @@ fn ssl_acceptor() -> std::io::Result { async fn test_start_ssl() { use actix_web::HttpRequest; - let addr = unused_addr(); + let addr = test::unused_addr(); let (tx, rx) = mpsc::channel(); thread::spawn(move || {