mirror of
https://github.com/fafhrd91/actix-web
synced 2024-11-23 16:21:06 +01:00
bump actix-server to beta 9 (#2442)
This commit is contained in:
parent
2754608f3c
commit
a2f59c02f7
12
CHANGES.md
12
CHANGES.md
@ -1,8 +1,18 @@
|
|||||||
# Changes
|
# Changes
|
||||||
|
|
||||||
## Unreleased - 2021-xx-xx
|
## Unreleased - 2021-xx-xx
|
||||||
|
|
||||||
|
|
||||||
|
## 4.0.0-beta.11 - 2021-11-15
|
||||||
|
### Added
|
||||||
|
* Re-export `dev::ServerHandle` from `actix-server`. [#2442]
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
* `ContentType::html` now returns `Content-Type: text/html; charset=utf-8` instead of `Content-Type: text/html`.
|
* `ContentType::html` now produces `text/html; charset=utf-8` instead of `text/html`. [#2423]
|
||||||
|
* Update `actix-server` to `2.0.0-beta.9`. [#2442]
|
||||||
|
|
||||||
|
[#2423]: https://github.com/actix/actix-web/pull/2423
|
||||||
|
[#2442]: https://github.com/actix/actix-web/pull/2442
|
||||||
|
|
||||||
|
|
||||||
## 4.0.0-beta.10 - 2021-10-20
|
## 4.0.0-beta.10 - 2021-10-20
|
||||||
|
10
Cargo.toml
10
Cargo.toml
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "actix-web"
|
name = "actix-web"
|
||||||
version = "4.0.0-beta.10"
|
version = "4.0.0-beta.11"
|
||||||
authors = ["Nikolay Kim <fafhrd91@gmail.com>"]
|
authors = ["Nikolay Kim <fafhrd91@gmail.com>"]
|
||||||
description = "Actix Web is a powerful, pragmatic, and extremely fast web framework for Rust"
|
description = "Actix Web is a powerful, pragmatic, and extremely fast web framework for Rust"
|
||||||
keywords = ["actix", "http", "web", "framework", "async"]
|
keywords = ["actix", "http", "web", "framework", "async"]
|
||||||
@ -69,12 +69,12 @@ __compress = []
|
|||||||
actix-codec = "0.4.0"
|
actix-codec = "0.4.0"
|
||||||
actix-macros = "0.2.3"
|
actix-macros = "0.2.3"
|
||||||
actix-rt = "2.2"
|
actix-rt = "2.2"
|
||||||
actix-server = "2.0.0-beta.3"
|
actix-server = "2.0.0-beta.9"
|
||||||
actix-service = "2.0.0"
|
actix-service = "2.0.0"
|
||||||
actix-utils = "3.0.0"
|
actix-utils = "3.0.0"
|
||||||
actix-tls = { version = "3.0.0-beta.7", default-features = false, optional = true }
|
actix-tls = { version = "3.0.0-beta.7", default-features = false, optional = true }
|
||||||
|
|
||||||
actix-http = "3.0.0-beta.11"
|
actix-http = "3.0.0-beta.12"
|
||||||
actix-router = "0.5.0-beta.2"
|
actix-router = "0.5.0-beta.2"
|
||||||
actix-web-codegen = "0.5.0-beta.5"
|
actix-web-codegen = "0.5.0-beta.5"
|
||||||
|
|
||||||
@ -104,8 +104,8 @@ time = { version = "0.3", default-features = false, features = ["formatting"] }
|
|||||||
url = "2.1"
|
url = "2.1"
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
actix-test = { version = "0.1.0-beta.3", features = ["openssl", "rustls"] }
|
actix-test = { version = "0.1.0-beta.6", features = ["openssl", "rustls"] }
|
||||||
awc = { version = "3.0.0-beta.9", features = ["openssl"] }
|
awc = { version = "3.0.0-beta.10", features = ["openssl"] }
|
||||||
|
|
||||||
brotli2 = "0.3.2"
|
brotli2 = "0.3.2"
|
||||||
criterion = { version = "0.3", features = ["html_reports"] }
|
criterion = { version = "0.3", features = ["html_reports"] }
|
||||||
|
@ -6,10 +6,10 @@
|
|||||||
<p>
|
<p>
|
||||||
|
|
||||||
[![crates.io](https://img.shields.io/crates/v/actix-web?label=latest)](https://crates.io/crates/actix-web)
|
[![crates.io](https://img.shields.io/crates/v/actix-web?label=latest)](https://crates.io/crates/actix-web)
|
||||||
[![Documentation](https://docs.rs/actix-web/badge.svg?version=4.0.0-beta.10)](https://docs.rs/actix-web/4.0.0-beta.10)
|
[![Documentation](https://docs.rs/actix-web/badge.svg?version=4.0.0-beta.11)](https://docs.rs/actix-web/4.0.0-beta.11)
|
||||||
[![Version](https://img.shields.io/badge/rustc-1.52+-ab6000.svg)](https://blog.rust-lang.org/2021/05/06/Rust-1.52.0.html)
|
[![Version](https://img.shields.io/badge/rustc-1.52+-ab6000.svg)](https://blog.rust-lang.org/2021/05/06/Rust-1.52.0.html)
|
||||||
![MIT or Apache 2.0 licensed](https://img.shields.io/crates/l/actix-web.svg)
|
![MIT or Apache 2.0 licensed](https://img.shields.io/crates/l/actix-web.svg)
|
||||||
[![Dependency Status](https://deps.rs/crate/actix-web/4.0.0-beta.10/status.svg)](https://deps.rs/crate/actix-web/4.0.0-beta.10)
|
[![Dependency Status](https://deps.rs/crate/actix-web/4.0.0-beta.11/status.svg)](https://deps.rs/crate/actix-web/4.0.0-beta.11)
|
||||||
<br />
|
<br />
|
||||||
[![build status](https://github.com/actix/actix-web/workflows/CI%20%28Linux%29/badge.svg?branch=master&event=push)](https://github.com/actix/actix-web/actions)
|
[![build status](https://github.com/actix/actix-web/workflows/CI%20%28Linux%29/badge.svg?branch=master&event=push)](https://github.com/actix/actix-web/actions)
|
||||||
[![codecov](https://codecov.io/gh/actix/actix-web/branch/master/graph/badge.svg)](https://codecov.io/gh/actix/actix-web)
|
[![codecov](https://codecov.io/gh/actix/actix-web/branch/master/graph/badge.svg)](https://codecov.io/gh/actix/actix-web)
|
||||||
|
@ -15,8 +15,8 @@ name = "actix_files"
|
|||||||
path = "src/lib.rs"
|
path = "src/lib.rs"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
actix-web = { version = "4.0.0-beta.10", default-features = false }
|
actix-web = { version = "4.0.0-beta.11", default-features = false }
|
||||||
actix-http = "3.0.0-beta.11"
|
actix-http = "3.0.0-beta.12"
|
||||||
actix-service = "2.0.0"
|
actix-service = "2.0.0"
|
||||||
actix-utils = "3.0.0"
|
actix-utils = "3.0.0"
|
||||||
|
|
||||||
@ -33,5 +33,5 @@ percent-encoding = "2.1"
|
|||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
actix-rt = "2.2"
|
actix-rt = "2.2"
|
||||||
actix-web = "4.0.0-beta.10"
|
actix-web = "4.0.0-beta.11"
|
||||||
actix-test = "0.1.0-beta.5"
|
actix-test = "0.1.0-beta.6"
|
||||||
|
@ -1,8 +1,15 @@
|
|||||||
# Changes
|
# Changes
|
||||||
|
|
||||||
## Unreleased - 2021-xx-xx
|
## Unreleased - 2021-xx-xx
|
||||||
|
|
||||||
|
|
||||||
|
## 3.0.0-beta.6 - 2021-11-15
|
||||||
|
* `TestServer::stop` is now async and will wait for the server and system to shutdown. [#2442]
|
||||||
|
* Update `actix-server` to `2.0.0-beta.9`. [#2442]
|
||||||
* Minimum supported Rust version (MSRV) is now 1.52.
|
* Minimum supported Rust version (MSRV) is now 1.52.
|
||||||
|
|
||||||
|
[#2442]: https://github.com/actix/actix-web/pull/2442
|
||||||
|
|
||||||
|
|
||||||
## 3.0.0-beta.5 - 2021-09-09
|
## 3.0.0-beta.5 - 2021-09-09
|
||||||
* Minimum supported Rust version (MSRV) is now 1.51.
|
* Minimum supported Rust version (MSRV) is now 1.51.
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "actix-http-test"
|
name = "actix-http-test"
|
||||||
version = "3.0.0-beta.5"
|
version = "3.0.0-beta.6"
|
||||||
authors = ["Nikolay Kim <fafhrd91@gmail.com>"]
|
authors = ["Nikolay Kim <fafhrd91@gmail.com>"]
|
||||||
description = "Various helpers for Actix applications to use during testing"
|
description = "Various helpers for Actix applications to use during testing"
|
||||||
keywords = ["http", "web", "framework", "async", "futures"]
|
keywords = ["http", "web", "framework", "async", "futures"]
|
||||||
@ -34,13 +34,13 @@ actix-codec = "0.4.0"
|
|||||||
actix-tls = "3.0.0-beta.7"
|
actix-tls = "3.0.0-beta.7"
|
||||||
actix-utils = "3.0.0"
|
actix-utils = "3.0.0"
|
||||||
actix-rt = "2.2"
|
actix-rt = "2.2"
|
||||||
actix-server = "2.0.0-beta.3"
|
actix-server = "2.0.0-beta.9"
|
||||||
awc = { version = "3.0.0-beta.9", default-features = false }
|
awc = { version = "3.0.0-beta.10", default-features = false }
|
||||||
|
|
||||||
base64 = "0.13"
|
base64 = "0.13"
|
||||||
bytes = "1"
|
bytes = "1"
|
||||||
futures-core = { version = "0.3.7", default-features = false }
|
futures-core = { version = "0.3.7", default-features = false }
|
||||||
http = "0.2.2"
|
http = "0.2.5"
|
||||||
log = "0.4"
|
log = "0.4"
|
||||||
socket2 = "0.4"
|
socket2 = "0.4"
|
||||||
serde = "1.0"
|
serde = "1.0"
|
||||||
@ -48,7 +48,8 @@ serde_json = "1.0"
|
|||||||
slab = "0.4"
|
slab = "0.4"
|
||||||
serde_urlencoded = "0.7"
|
serde_urlencoded = "0.7"
|
||||||
tls-openssl = { version = "0.10.9", package = "openssl", optional = true }
|
tls-openssl = { version = "0.10.9", package = "openssl", optional = true }
|
||||||
|
tokio = { version = "1.2", features = ["sync"] }
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
actix-web = { version = "4.0.0-beta.10", default-features = false, features = ["cookies"] }
|
actix-web = { version = "4.0.0-beta.11", default-features = false, features = ["cookies"] }
|
||||||
actix-http = "3.0.0-beta.11"
|
actix-http = "3.0.0-beta.12"
|
||||||
|
@ -3,11 +3,11 @@
|
|||||||
> Various helpers for Actix applications to use during testing.
|
> Various helpers for Actix applications to use during testing.
|
||||||
|
|
||||||
[![crates.io](https://img.shields.io/crates/v/actix-http-test?label=latest)](https://crates.io/crates/actix-http-test)
|
[![crates.io](https://img.shields.io/crates/v/actix-http-test?label=latest)](https://crates.io/crates/actix-http-test)
|
||||||
[![Documentation](https://docs.rs/actix-http-test/badge.svg?version=3.0.0-beta.5)](https://docs.rs/actix-http-test/3.0.0-beta.5)
|
[![Documentation](https://docs.rs/actix-http-test/badge.svg?version=3.0.0-beta.6)](https://docs.rs/actix-http-test/3.0.0-beta.6)
|
||||||
[![Version](https://img.shields.io/badge/rustc-1.52+-ab6000.svg)](https://blog.rust-lang.org/2021/05/06/Rust-1.52.0.html)
|
[![Version](https://img.shields.io/badge/rustc-1.52+-ab6000.svg)](https://blog.rust-lang.org/2021/05/06/Rust-1.52.0.html)
|
||||||
![MIT or Apache 2.0 licensed](https://img.shields.io/crates/l/actix-http-test)
|
![MIT or Apache 2.0 licensed](https://img.shields.io/crates/l/actix-http-test)
|
||||||
<br>
|
<br>
|
||||||
[![Dependency Status](https://deps.rs/crate/actix-http-test/3.0.0-beta.5/status.svg)](https://deps.rs/crate/actix-http-test/3.0.0-beta.5)
|
[![Dependency Status](https://deps.rs/crate/actix-http-test/3.0.0-beta.6/status.svg)](https://deps.rs/crate/actix-http-test/3.0.0-beta.6)
|
||||||
[![Download](https://img.shields.io/crates/d/actix-http-test.svg)](https://crates.io/crates/actix-http-test)
|
[![Download](https://img.shields.io/crates/d/actix-http-test.svg)](https://crates.io/crates/actix-http-test)
|
||||||
[![Chat on Discord](https://img.shields.io/discord/771444961383153695?label=chat&logo=discord)](https://discord.gg/NWpN5mmg3x)
|
[![Chat on Discord](https://img.shields.io/discord/771444961383153695?label=chat&logo=discord)](https://discord.gg/NWpN5mmg3x)
|
||||||
|
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
#[cfg(feature = "openssl")]
|
#[cfg(feature = "openssl")]
|
||||||
extern crate tls_openssl as openssl;
|
extern crate tls_openssl as openssl;
|
||||||
|
|
||||||
use std::{net, sync::mpsc, thread, time::Duration};
|
use std::{net, thread, time::Duration};
|
||||||
|
|
||||||
use actix_codec::{AsyncRead, AsyncWrite, Framed};
|
use actix_codec::{AsyncRead, AsyncWrite, Framed};
|
||||||
use actix_rt::{net::TcpStream, System};
|
use actix_rt::{net::TcpStream, System};
|
||||||
@ -19,6 +19,7 @@ use bytes::Bytes;
|
|||||||
use futures_core::stream::Stream;
|
use futures_core::stream::Stream;
|
||||||
use http::Method;
|
use http::Method;
|
||||||
use socket2::{Domain, Protocol, Socket, Type};
|
use socket2::{Domain, Protocol, Socket, Type};
|
||||||
|
use tokio::sync::mpsc;
|
||||||
|
|
||||||
/// Start test server
|
/// Start test server
|
||||||
///
|
///
|
||||||
@ -55,12 +56,13 @@ pub async fn test_server<F: ServiceFactory<TcpStream>>(factory: F) -> TestServer
|
|||||||
test_server_with_addr(tcp, factory).await
|
test_server_with_addr(tcp, factory).await
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Start [`test server`](test_server()) on a concrete Address
|
/// Start [`test server`](test_server()) on an existing address binding.
|
||||||
pub async fn test_server_with_addr<F: ServiceFactory<TcpStream>>(
|
pub async fn test_server_with_addr<F: ServiceFactory<TcpStream>>(
|
||||||
tcp: net::TcpListener,
|
tcp: net::TcpListener,
|
||||||
factory: F,
|
factory: F,
|
||||||
) -> TestServer {
|
) -> TestServer {
|
||||||
let (tx, rx) = mpsc::channel();
|
let (started_tx, started_rx) = std::sync::mpsc::channel();
|
||||||
|
let (thread_stop_tx, thread_stop_rx) = mpsc::channel(1);
|
||||||
|
|
||||||
// run server in separate thread
|
// run server in separate thread
|
||||||
thread::spawn(move || {
|
thread::spawn(move || {
|
||||||
@ -68,59 +70,73 @@ pub async fn test_server_with_addr<F: ServiceFactory<TcpStream>>(
|
|||||||
let local_addr = tcp.local_addr().unwrap();
|
let local_addr = tcp.local_addr().unwrap();
|
||||||
|
|
||||||
let srv = Server::build()
|
let srv = Server::build()
|
||||||
.listen("test", tcp, factory)?
|
|
||||||
.workers(1)
|
.workers(1)
|
||||||
.disable_signals();
|
.disable_signals()
|
||||||
|
.listen("test", tcp, factory)
|
||||||
|
.expect("test server could not be created");
|
||||||
|
|
||||||
sys.block_on(async {
|
let srv = srv.run();
|
||||||
srv.run();
|
started_tx
|
||||||
tx.send((System::current(), local_addr)).unwrap();
|
.send((System::current(), srv.handle(), local_addr))
|
||||||
});
|
.unwrap();
|
||||||
|
|
||||||
sys.run()
|
// drive server loop
|
||||||
|
sys.block_on(srv).unwrap();
|
||||||
|
|
||||||
|
// start system event loop
|
||||||
|
sys.run().unwrap();
|
||||||
|
|
||||||
|
// notify TestServer that server and system have shut down
|
||||||
|
// all thread managed resources should be dropped at this point
|
||||||
|
let _ = thread_stop_tx.send(());
|
||||||
});
|
});
|
||||||
|
|
||||||
let (system, addr) = rx.recv().unwrap();
|
let (system, server, addr) = started_rx.recv().unwrap();
|
||||||
|
|
||||||
let client = {
|
let client = {
|
||||||
|
#[cfg(feature = "openssl")]
|
||||||
let connector = {
|
let connector = {
|
||||||
#[cfg(feature = "openssl")]
|
use openssl::ssl::{SslConnector, SslMethod, SslVerifyMode};
|
||||||
{
|
|
||||||
use openssl::ssl::{SslConnector, SslMethod, SslVerifyMode};
|
|
||||||
|
|
||||||
let mut builder = SslConnector::builder(SslMethod::tls()).unwrap();
|
let mut builder = SslConnector::builder(SslMethod::tls()).unwrap();
|
||||||
builder.set_verify(SslVerifyMode::NONE);
|
|
||||||
let _ = builder
|
builder.set_verify(SslVerifyMode::NONE);
|
||||||
.set_alpn_protos(b"\x02h2\x08http/1.1")
|
let _ = builder
|
||||||
.map_err(|e| log::error!("Can not set alpn protocol: {:?}", e));
|
.set_alpn_protos(b"\x02h2\x08http/1.1")
|
||||||
Connector::new()
|
.map_err(|e| log::error!("Can not set alpn protocol: {:?}", e));
|
||||||
.conn_lifetime(Duration::from_secs(0))
|
|
||||||
.timeout(Duration::from_millis(30000))
|
Connector::new()
|
||||||
.ssl(builder.build())
|
.conn_lifetime(Duration::from_secs(0))
|
||||||
}
|
.timeout(Duration::from_millis(30000))
|
||||||
#[cfg(not(feature = "openssl"))]
|
.ssl(builder.build())
|
||||||
{
|
};
|
||||||
Connector::new()
|
|
||||||
.conn_lifetime(Duration::from_secs(0))
|
#[cfg(not(feature = "openssl"))]
|
||||||
.timeout(Duration::from_millis(30000))
|
let connector = {
|
||||||
}
|
Connector::new()
|
||||||
|
.conn_lifetime(Duration::from_secs(0))
|
||||||
|
.timeout(Duration::from_millis(30000))
|
||||||
};
|
};
|
||||||
|
|
||||||
Client::builder().connector(connector).finish()
|
Client::builder().connector(connector).finish()
|
||||||
};
|
};
|
||||||
|
|
||||||
TestServer {
|
TestServer {
|
||||||
addr,
|
server,
|
||||||
client,
|
client,
|
||||||
system,
|
system,
|
||||||
|
addr,
|
||||||
|
thread_stop_rx,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Test server controller
|
/// Test server controller
|
||||||
pub struct TestServer {
|
pub struct TestServer {
|
||||||
|
server: actix_server::ServerHandle,
|
||||||
|
client: awc::Client,
|
||||||
|
system: actix_rt::System,
|
||||||
addr: net::SocketAddr,
|
addr: net::SocketAddr,
|
||||||
client: Client,
|
thread_stop_rx: mpsc::Receiver<()>,
|
||||||
system: System,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl TestServer {
|
impl TestServer {
|
||||||
@ -257,15 +273,32 @@ impl TestServer {
|
|||||||
self.client.headers()
|
self.client.headers()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Stop HTTP server
|
/// Gracefully stop HTTP server.
|
||||||
fn stop(&mut self) {
|
///
|
||||||
|
/// Waits for spawned `Server` and `System` to shutdown gracefully.
|
||||||
|
pub async fn stop(&mut self) {
|
||||||
|
// signal server to stop
|
||||||
|
self.server.stop(true).await;
|
||||||
|
|
||||||
|
// also signal system to stop
|
||||||
|
// though this is handled by `ServerBuilder::exit_system` too
|
||||||
self.system.stop();
|
self.system.stop();
|
||||||
|
|
||||||
|
// wait for thread to be stopped but don't care about result
|
||||||
|
let _ = self.thread_stop_rx.recv().await;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Drop for TestServer {
|
impl Drop for TestServer {
|
||||||
fn drop(&mut self) {
|
fn drop(&mut self) {
|
||||||
self.stop()
|
// calls in this Drop impl should be enough to shut down the server, system, and thread
|
||||||
|
// without needing to await anything
|
||||||
|
|
||||||
|
// signal server to stop
|
||||||
|
let _ = self.server.stop(true);
|
||||||
|
|
||||||
|
// signal system to stop
|
||||||
|
self.system.stop();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,11 +1,18 @@
|
|||||||
# Changes
|
# Changes
|
||||||
|
|
||||||
## Unreleased - 2021-xx-xx
|
## Unreleased - 2021-xx-xx
|
||||||
|
|
||||||
|
|
||||||
|
## 3.0.0-beta.12 - 2021-11-15
|
||||||
|
### Changed
|
||||||
|
* Update `actix-server` to `2.0.0-beta.9`. [#2442]
|
||||||
|
|
||||||
### Removed
|
### Removed
|
||||||
* `client` module. [#2425]
|
* `client` module. [#2425]
|
||||||
* `trust-dns` feature. [#2425]
|
* `trust-dns` feature. [#2425]
|
||||||
|
|
||||||
[#2425]: https://github.com/actix/actix-web/pull/2425
|
[#2425]: https://github.com/actix/actix-web/pull/2425
|
||||||
|
[#2442]: https://github.com/actix/actix-web/pull/2442
|
||||||
|
|
||||||
|
|
||||||
## 3.0.0-beta.11 - 2021-10-20
|
## 3.0.0-beta.11 - 2021-10-20
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "actix-http"
|
name = "actix-http"
|
||||||
version = "3.0.0-beta.11"
|
version = "3.0.0-beta.12"
|
||||||
authors = ["Nikolay Kim <fafhrd91@gmail.com>"]
|
authors = ["Nikolay Kim <fafhrd91@gmail.com>"]
|
||||||
description = "HTTP primitives for the Actix ecosystem"
|
description = "HTTP primitives for the Actix ecosystem"
|
||||||
keywords = ["actix", "http", "framework", "async", "futures"]
|
keywords = ["actix", "http", "framework", "async", "futures"]
|
||||||
@ -57,7 +57,7 @@ encoding_rs = "0.8"
|
|||||||
futures-core = { version = "0.3.7", default-features = false, features = ["alloc"] }
|
futures-core = { version = "0.3.7", default-features = false, features = ["alloc"] }
|
||||||
futures-util = { version = "0.3.7", default-features = false, features = ["alloc", "sink"] }
|
futures-util = { version = "0.3.7", default-features = false, features = ["alloc", "sink"] }
|
||||||
h2 = "0.3.1"
|
h2 = "0.3.1"
|
||||||
http = "0.2.2"
|
http = "0.2.5"
|
||||||
httparse = "1.5.1"
|
httparse = "1.5.1"
|
||||||
httpdate = "1.0.1"
|
httpdate = "1.0.1"
|
||||||
itoa = "0.4"
|
itoa = "0.4"
|
||||||
@ -71,7 +71,6 @@ pin-project-lite = "0.2"
|
|||||||
rand = "0.8"
|
rand = "0.8"
|
||||||
sha-1 = "0.9"
|
sha-1 = "0.9"
|
||||||
smallvec = "1.6.1"
|
smallvec = "1.6.1"
|
||||||
tokio = { version = "1.2", features = ["sync"] }
|
|
||||||
|
|
||||||
# tls
|
# tls
|
||||||
actix-tls = { version = "3.0.0-beta.7", default-features = false, optional = true }
|
actix-tls = { version = "3.0.0-beta.7", default-features = false, optional = true }
|
||||||
@ -82,8 +81,8 @@ flate2 = { version = "1.0.13", optional = true }
|
|||||||
zstd = { version = "0.7", optional = true }
|
zstd = { version = "0.7", optional = true }
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
actix-server = "2.0.0-beta.3"
|
actix-server = "2.0.0-beta.9"
|
||||||
actix-http-test = { version = "3.0.0-beta.5", features = ["openssl"] }
|
actix-http-test = { version = "3.0.0-beta.6", features = ["openssl"] }
|
||||||
actix-tls = { version = "3.0.0-beta.7", features = ["openssl"] }
|
actix-tls = { version = "3.0.0-beta.7", features = ["openssl"] }
|
||||||
async-stream = "0.3"
|
async-stream = "0.3"
|
||||||
criterion = { version = "0.3", features = ["html_reports"] }
|
criterion = { version = "0.3", features = ["html_reports"] }
|
||||||
@ -95,6 +94,7 @@ serde = { version = "1.0", features = ["derive"] }
|
|||||||
serde_json = "1.0"
|
serde_json = "1.0"
|
||||||
tls-openssl = { package = "openssl", version = "0.10.9" }
|
tls-openssl = { package = "openssl", version = "0.10.9" }
|
||||||
tls-rustls = { package = "rustls", version = "0.20.0" }
|
tls-rustls = { package = "rustls", version = "0.20.0" }
|
||||||
|
tokio = { version = "1.2", features = ["net", "rt"] }
|
||||||
|
|
||||||
[[example]]
|
[[example]]
|
||||||
name = "ws"
|
name = "ws"
|
||||||
|
@ -3,11 +3,11 @@
|
|||||||
> HTTP primitives for the Actix ecosystem.
|
> HTTP primitives for the Actix ecosystem.
|
||||||
|
|
||||||
[![crates.io](https://img.shields.io/crates/v/actix-http?label=latest)](https://crates.io/crates/actix-http)
|
[![crates.io](https://img.shields.io/crates/v/actix-http?label=latest)](https://crates.io/crates/actix-http)
|
||||||
[![Documentation](https://docs.rs/actix-http/badge.svg?version=3.0.0-beta.11)](https://docs.rs/actix-http/3.0.0-beta.11)
|
[![Documentation](https://docs.rs/actix-http/badge.svg?version=3.0.0-beta.12)](https://docs.rs/actix-http/3.0.0-beta.12)
|
||||||
[![Version](https://img.shields.io/badge/rustc-1.52+-ab6000.svg)](https://blog.rust-lang.org/2021/05/06/Rust-1.52.0.html)
|
[![Version](https://img.shields.io/badge/rustc-1.52+-ab6000.svg)](https://blog.rust-lang.org/2021/05/06/Rust-1.52.0.html)
|
||||||
![MIT or Apache 2.0 licensed](https://img.shields.io/crates/l/actix-http.svg)
|
![MIT or Apache 2.0 licensed](https://img.shields.io/crates/l/actix-http.svg)
|
||||||
<br />
|
<br />
|
||||||
[![dependency status](https://deps.rs/crate/actix-http/3.0.0-beta.11/status.svg)](https://deps.rs/crate/actix-http/3.0.0-beta.11)
|
[![dependency status](https://deps.rs/crate/actix-http/3.0.0-beta.12/status.svg)](https://deps.rs/crate/actix-http/3.0.0-beta.12)
|
||||||
[![Download](https://img.shields.io/crates/d/actix-http.svg)](https://crates.io/crates/actix-http)
|
[![Download](https://img.shields.io/crates/d/actix-http.svg)](https://crates.io/crates/actix-http)
|
||||||
[![Chat on Discord](https://img.shields.io/discord/771444961383153695?label=chat&logo=discord)](https://discord.gg/NWpN5mmg3x)
|
[![Chat on Discord](https://img.shields.io/discord/771444961383153695?label=chat&logo=discord)](https://discord.gg/NWpN5mmg3x)
|
||||||
|
|
||||||
|
@ -13,7 +13,7 @@ async fn h2_ping_pong() -> io::Result<()> {
|
|||||||
|
|
||||||
let join = std::thread::spawn(move || {
|
let join = std::thread::spawn(move || {
|
||||||
actix_rt::System::new().block_on(async move {
|
actix_rt::System::new().block_on(async move {
|
||||||
let handle = Server::build()
|
let srv = Server::build()
|
||||||
.disable_signals()
|
.disable_signals()
|
||||||
.workers(1)
|
.workers(1)
|
||||||
.listen("h2_ping_pong", lst, || {
|
.listen("h2_ping_pong", lst, || {
|
||||||
@ -24,9 +24,9 @@ async fn h2_ping_pong() -> io::Result<()> {
|
|||||||
})?
|
})?
|
||||||
.run();
|
.run();
|
||||||
|
|
||||||
tx.send(handle.clone()).unwrap();
|
tx.send(srv.handle()).unwrap();
|
||||||
|
|
||||||
handle.await
|
srv.await
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -8,7 +8,7 @@ use actix_http::{
|
|||||||
body::{AnyBody, Body, SizedStream},
|
body::{AnyBody, Body, SizedStream},
|
||||||
error::PayloadError,
|
error::PayloadError,
|
||||||
http::{
|
http::{
|
||||||
header::{self, HeaderName, HeaderValue},
|
header::{self, HeaderValue},
|
||||||
Method, StatusCode, Version,
|
Method, StatusCode, Version,
|
||||||
},
|
},
|
||||||
Error, HttpMessage, HttpService, Request, Response,
|
Error, HttpMessage, HttpService, Request, Response,
|
||||||
@ -143,38 +143,25 @@ async fn test_h2_content_length() {
|
|||||||
})
|
})
|
||||||
.await;
|
.await;
|
||||||
|
|
||||||
let header = HeaderName::from_static("content-length");
|
static VALUE: HeaderValue = HeaderValue::from_static("0");
|
||||||
let value = HeaderValue::from_static("0");
|
|
||||||
|
|
||||||
{
|
{
|
||||||
for &i in &[0] {
|
let req = srv.request(Method::HEAD, srv.surl("/0")).send();
|
||||||
let req = srv
|
req.await.expect_err("should timeout on recv 1xx frame");
|
||||||
.request(Method::HEAD, srv.surl(&format!("/{}", i)))
|
|
||||||
.send();
|
|
||||||
let _response = req.await.expect_err("should timeout on recv 1xx frame");
|
|
||||||
// assert_eq!(response.headers().get(&header), None);
|
|
||||||
|
|
||||||
let req = srv
|
let req = srv.request(Method::GET, srv.surl("/0")).send();
|
||||||
.request(Method::GET, srv.surl(&format!("/{}", i)))
|
req.await.expect_err("should timeout on recv 1xx frame");
|
||||||
.send();
|
|
||||||
let _response = req.await.expect_err("should timeout on recv 1xx frame");
|
|
||||||
// assert_eq!(response.headers().get(&header), None);
|
|
||||||
}
|
|
||||||
|
|
||||||
for &i in &[1] {
|
let req = srv.request(Method::GET, srv.surl("/1")).send();
|
||||||
let req = srv
|
let response = req.await.unwrap();
|
||||||
.request(Method::GET, srv.surl(&format!("/{}", i)))
|
assert!(response.headers().get("content-length").is_none());
|
||||||
.send();
|
|
||||||
let response = req.await.unwrap();
|
|
||||||
assert_eq!(response.headers().get(&header), None);
|
|
||||||
}
|
|
||||||
|
|
||||||
for &i in &[2, 3] {
|
for &i in &[2, 3] {
|
||||||
let req = srv
|
let req = srv
|
||||||
.request(Method::GET, srv.surl(&format!("/{}", i)))
|
.request(Method::GET, srv.surl(&format!("/{}", i)))
|
||||||
.send();
|
.send();
|
||||||
let response = req.await.unwrap();
|
let response = req.await.unwrap();
|
||||||
assert_eq!(response.headers().get(&header), Some(&value));
|
assert_eq!(response.headers().get("content-length"), Some(&VALUE));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -26,10 +26,7 @@ use bytes::{Bytes, BytesMut};
|
|||||||
use derive_more::{Display, Error};
|
use derive_more::{Display, Error};
|
||||||
use futures_core::Stream;
|
use futures_core::Stream;
|
||||||
use futures_util::stream::{once, StreamExt as _};
|
use futures_util::stream::{once, StreamExt as _};
|
||||||
use rustls::{
|
use rustls::{Certificate, PrivateKey, ServerConfig as RustlsServerConfig, ServerName};
|
||||||
Certificate, OwnedTrustAnchor, PrivateKey, RootCertStore,
|
|
||||||
ServerConfig as RustlsServerConfig, ServerName,
|
|
||||||
};
|
|
||||||
use rustls_pemfile::{certs, pkcs8_private_keys};
|
use rustls_pemfile::{certs, pkcs8_private_keys};
|
||||||
|
|
||||||
async fn load_body<S>(mut stream: S) -> Result<BytesMut, PayloadError>
|
async fn load_body<S>(mut stream: S) -> Result<BytesMut, PayloadError>
|
||||||
|
@ -24,7 +24,7 @@ use regex::Regex;
|
|||||||
|
|
||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
async fn test_h1() {
|
async fn test_h1() {
|
||||||
let srv = test_server(|| {
|
let mut srv = test_server(|| {
|
||||||
HttpService::build()
|
HttpService::build()
|
||||||
.keep_alive(KeepAlive::Disabled)
|
.keep_alive(KeepAlive::Disabled)
|
||||||
.client_timeout(1000)
|
.client_timeout(1000)
|
||||||
@ -39,11 +39,13 @@ async fn test_h1() {
|
|||||||
|
|
||||||
let response = srv.get("/").send().await.unwrap();
|
let response = srv.get("/").send().await.unwrap();
|
||||||
assert!(response.status().is_success());
|
assert!(response.status().is_success());
|
||||||
|
|
||||||
|
srv.stop().await;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
async fn test_h1_2() {
|
async fn test_h1_2() {
|
||||||
let srv = test_server(|| {
|
let mut srv = test_server(|| {
|
||||||
HttpService::build()
|
HttpService::build()
|
||||||
.keep_alive(KeepAlive::Disabled)
|
.keep_alive(KeepAlive::Disabled)
|
||||||
.client_timeout(1000)
|
.client_timeout(1000)
|
||||||
@ -59,6 +61,8 @@ async fn test_h1_2() {
|
|||||||
|
|
||||||
let response = srv.get("/").send().await.unwrap();
|
let response = srv.get("/").send().await.unwrap();
|
||||||
assert!(response.status().is_success());
|
assert!(response.status().is_success());
|
||||||
|
|
||||||
|
srv.stop().await;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Display, Error)]
|
#[derive(Debug, Display, Error)]
|
||||||
@ -73,7 +77,7 @@ impl From<ExpectFailed> for Response<AnyBody> {
|
|||||||
|
|
||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
async fn test_expect_continue() {
|
async fn test_expect_continue() {
|
||||||
let srv = test_server(|| {
|
let mut srv = test_server(|| {
|
||||||
HttpService::build()
|
HttpService::build()
|
||||||
.expect(fn_service(|req: Request| {
|
.expect(fn_service(|req: Request| {
|
||||||
if req.head().uri.query() == Some("yes=") {
|
if req.head().uri.query() == Some("yes=") {
|
||||||
@ -98,11 +102,13 @@ async fn test_expect_continue() {
|
|||||||
let mut data = String::new();
|
let mut data = String::new();
|
||||||
let _ = stream.read_to_string(&mut data);
|
let _ = stream.read_to_string(&mut data);
|
||||||
assert!(data.starts_with("HTTP/1.1 100 Continue\r\n\r\nHTTP/1.1 200 OK\r\n"));
|
assert!(data.starts_with("HTTP/1.1 100 Continue\r\n\r\nHTTP/1.1 200 OK\r\n"));
|
||||||
|
|
||||||
|
srv.stop().await;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
async fn test_expect_continue_h1() {
|
async fn test_expect_continue_h1() {
|
||||||
let srv = test_server(|| {
|
let mut srv = test_server(|| {
|
||||||
HttpService::build()
|
HttpService::build()
|
||||||
.expect(fn_service(|req: Request| {
|
.expect(fn_service(|req: Request| {
|
||||||
sleep(Duration::from_millis(20)).then(move |_| {
|
sleep(Duration::from_millis(20)).then(move |_| {
|
||||||
@ -129,6 +135,8 @@ async fn test_expect_continue_h1() {
|
|||||||
let mut data = String::new();
|
let mut data = String::new();
|
||||||
let _ = stream.read_to_string(&mut data);
|
let _ = stream.read_to_string(&mut data);
|
||||||
assert!(data.starts_with("HTTP/1.1 100 Continue\r\n\r\nHTTP/1.1 200 OK\r\n"));
|
assert!(data.starts_with("HTTP/1.1 100 Continue\r\n\r\nHTTP/1.1 200 OK\r\n"));
|
||||||
|
|
||||||
|
srv.stop().await;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
@ -136,7 +144,7 @@ async fn test_chunked_payload() {
|
|||||||
let chunk_sizes = vec![32768, 32, 32768];
|
let chunk_sizes = vec![32768, 32, 32768];
|
||||||
let total_size: usize = chunk_sizes.iter().sum();
|
let total_size: usize = chunk_sizes.iter().sum();
|
||||||
|
|
||||||
let srv = test_server(|| {
|
let mut srv = test_server(|| {
|
||||||
HttpService::build()
|
HttpService::build()
|
||||||
.h1(fn_service(|mut request: Request| {
|
.h1(fn_service(|mut request: Request| {
|
||||||
request
|
request
|
||||||
@ -188,11 +196,13 @@ async fn test_chunked_payload() {
|
|||||||
};
|
};
|
||||||
|
|
||||||
assert_eq!(returned_size, total_size);
|
assert_eq!(returned_size, total_size);
|
||||||
|
|
||||||
|
srv.stop().await;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
async fn test_slow_request() {
|
async fn test_slow_request() {
|
||||||
let srv = test_server(|| {
|
let mut srv = test_server(|| {
|
||||||
HttpService::build()
|
HttpService::build()
|
||||||
.client_timeout(100)
|
.client_timeout(100)
|
||||||
.finish(|_| ok::<_, Infallible>(Response::ok()))
|
.finish(|_| ok::<_, Infallible>(Response::ok()))
|
||||||
@ -205,11 +215,13 @@ async fn test_slow_request() {
|
|||||||
let mut data = String::new();
|
let mut data = String::new();
|
||||||
let _ = stream.read_to_string(&mut data);
|
let _ = stream.read_to_string(&mut data);
|
||||||
assert!(data.starts_with("HTTP/1.1 408 Request Timeout"));
|
assert!(data.starts_with("HTTP/1.1 408 Request Timeout"));
|
||||||
|
|
||||||
|
srv.stop().await;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
async fn test_http1_malformed_request() {
|
async fn test_http1_malformed_request() {
|
||||||
let srv = test_server(|| {
|
let mut srv = test_server(|| {
|
||||||
HttpService::build()
|
HttpService::build()
|
||||||
.h1(|_| ok::<_, Infallible>(Response::ok()))
|
.h1(|_| ok::<_, Infallible>(Response::ok()))
|
||||||
.tcp()
|
.tcp()
|
||||||
@ -221,11 +233,13 @@ async fn test_http1_malformed_request() {
|
|||||||
let mut data = String::new();
|
let mut data = String::new();
|
||||||
let _ = stream.read_to_string(&mut data);
|
let _ = stream.read_to_string(&mut data);
|
||||||
assert!(data.starts_with("HTTP/1.1 400 Bad Request"));
|
assert!(data.starts_with("HTTP/1.1 400 Bad Request"));
|
||||||
|
|
||||||
|
srv.stop().await;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
async fn test_http1_keepalive() {
|
async fn test_http1_keepalive() {
|
||||||
let srv = test_server(|| {
|
let mut srv = test_server(|| {
|
||||||
HttpService::build()
|
HttpService::build()
|
||||||
.h1(|_| ok::<_, Infallible>(Response::ok()))
|
.h1(|_| ok::<_, Infallible>(Response::ok()))
|
||||||
.tcp()
|
.tcp()
|
||||||
@ -242,11 +256,13 @@ async fn test_http1_keepalive() {
|
|||||||
let mut data = vec![0; 1024];
|
let mut data = vec![0; 1024];
|
||||||
let _ = stream.read(&mut data);
|
let _ = stream.read(&mut data);
|
||||||
assert_eq!(&data[..17], b"HTTP/1.1 200 OK\r\n");
|
assert_eq!(&data[..17], b"HTTP/1.1 200 OK\r\n");
|
||||||
|
|
||||||
|
srv.stop().await;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
async fn test_http1_keepalive_timeout() {
|
async fn test_http1_keepalive_timeout() {
|
||||||
let srv = test_server(|| {
|
let mut srv = test_server(|| {
|
||||||
HttpService::build()
|
HttpService::build()
|
||||||
.keep_alive(1)
|
.keep_alive(1)
|
||||||
.h1(|_| ok::<_, Infallible>(Response::ok()))
|
.h1(|_| ok::<_, Infallible>(Response::ok()))
|
||||||
@ -264,11 +280,13 @@ async fn test_http1_keepalive_timeout() {
|
|||||||
let mut data = vec![0; 1024];
|
let mut data = vec![0; 1024];
|
||||||
let res = stream.read(&mut data).unwrap();
|
let res = stream.read(&mut data).unwrap();
|
||||||
assert_eq!(res, 0);
|
assert_eq!(res, 0);
|
||||||
|
|
||||||
|
srv.stop().await;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
async fn test_http1_keepalive_close() {
|
async fn test_http1_keepalive_close() {
|
||||||
let srv = test_server(|| {
|
let mut srv = test_server(|| {
|
||||||
HttpService::build()
|
HttpService::build()
|
||||||
.h1(|_| ok::<_, Infallible>(Response::ok()))
|
.h1(|_| ok::<_, Infallible>(Response::ok()))
|
||||||
.tcp()
|
.tcp()
|
||||||
@ -285,11 +303,13 @@ async fn test_http1_keepalive_close() {
|
|||||||
let mut data = vec![0; 1024];
|
let mut data = vec![0; 1024];
|
||||||
let res = stream.read(&mut data).unwrap();
|
let res = stream.read(&mut data).unwrap();
|
||||||
assert_eq!(res, 0);
|
assert_eq!(res, 0);
|
||||||
|
|
||||||
|
srv.stop().await;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
async fn test_http10_keepalive_default_close() {
|
async fn test_http10_keepalive_default_close() {
|
||||||
let srv = test_server(|| {
|
let mut srv = test_server(|| {
|
||||||
HttpService::build()
|
HttpService::build()
|
||||||
.h1(|_| ok::<_, Infallible>(Response::ok()))
|
.h1(|_| ok::<_, Infallible>(Response::ok()))
|
||||||
.tcp()
|
.tcp()
|
||||||
@ -305,11 +325,13 @@ async fn test_http10_keepalive_default_close() {
|
|||||||
let mut data = vec![0; 1024];
|
let mut data = vec![0; 1024];
|
||||||
let res = stream.read(&mut data).unwrap();
|
let res = stream.read(&mut data).unwrap();
|
||||||
assert_eq!(res, 0);
|
assert_eq!(res, 0);
|
||||||
|
|
||||||
|
srv.stop().await;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
async fn test_http10_keepalive() {
|
async fn test_http10_keepalive() {
|
||||||
let srv = test_server(|| {
|
let mut srv = test_server(|| {
|
||||||
HttpService::build()
|
HttpService::build()
|
||||||
.h1(|_| ok::<_, Infallible>(Response::ok()))
|
.h1(|_| ok::<_, Infallible>(Response::ok()))
|
||||||
.tcp()
|
.tcp()
|
||||||
@ -332,11 +354,13 @@ async fn test_http10_keepalive() {
|
|||||||
let mut data = vec![0; 1024];
|
let mut data = vec![0; 1024];
|
||||||
let res = stream.read(&mut data).unwrap();
|
let res = stream.read(&mut data).unwrap();
|
||||||
assert_eq!(res, 0);
|
assert_eq!(res, 0);
|
||||||
|
|
||||||
|
srv.stop().await;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
async fn test_http1_keepalive_disabled() {
|
async fn test_http1_keepalive_disabled() {
|
||||||
let srv = test_server(|| {
|
let mut srv = test_server(|| {
|
||||||
HttpService::build()
|
HttpService::build()
|
||||||
.keep_alive(KeepAlive::Disabled)
|
.keep_alive(KeepAlive::Disabled)
|
||||||
.h1(|_| ok::<_, Infallible>(Response::ok()))
|
.h1(|_| ok::<_, Infallible>(Response::ok()))
|
||||||
@ -353,6 +377,8 @@ async fn test_http1_keepalive_disabled() {
|
|||||||
let mut data = vec![0; 1024];
|
let mut data = vec![0; 1024];
|
||||||
let res = stream.read(&mut data).unwrap();
|
let res = stream.read(&mut data).unwrap();
|
||||||
assert_eq!(res, 0);
|
assert_eq!(res, 0);
|
||||||
|
|
||||||
|
srv.stop().await;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
@ -362,7 +388,7 @@ async fn test_content_length() {
|
|||||||
StatusCode,
|
StatusCode,
|
||||||
};
|
};
|
||||||
|
|
||||||
let srv = test_server(|| {
|
let mut srv = test_server(|| {
|
||||||
HttpService::build()
|
HttpService::build()
|
||||||
.h1(|req: Request| {
|
.h1(|req: Request| {
|
||||||
let indx: usize = req.uri().path()[1..].parse().unwrap();
|
let indx: usize = req.uri().path()[1..].parse().unwrap();
|
||||||
@ -400,6 +426,8 @@ async fn test_content_length() {
|
|||||||
assert_eq!(response.headers().get(&header), Some(&value));
|
assert_eq!(response.headers().get(&header), Some(&value));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
srv.stop().await;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
@ -439,6 +467,8 @@ async fn test_h1_headers() {
|
|||||||
// read response
|
// read response
|
||||||
let bytes = srv.load_body(response).await.unwrap();
|
let bytes = srv.load_body(response).await.unwrap();
|
||||||
assert_eq!(bytes, Bytes::from(data2));
|
assert_eq!(bytes, Bytes::from(data2));
|
||||||
|
|
||||||
|
srv.stop().await;
|
||||||
}
|
}
|
||||||
|
|
||||||
const STR: &str = "Hello World Hello World Hello World Hello World Hello World \
|
const STR: &str = "Hello World Hello World Hello World Hello World Hello World \
|
||||||
@ -478,6 +508,8 @@ async fn test_h1_body() {
|
|||||||
// read response
|
// read response
|
||||||
let bytes = srv.load_body(response).await.unwrap();
|
let bytes = srv.load_body(response).await.unwrap();
|
||||||
assert_eq!(bytes, Bytes::from_static(STR.as_ref()));
|
assert_eq!(bytes, Bytes::from_static(STR.as_ref()));
|
||||||
|
|
||||||
|
srv.stop().await;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
@ -503,6 +535,8 @@ async fn test_h1_head_empty() {
|
|||||||
// read response
|
// read response
|
||||||
let bytes = srv.load_body(response).await.unwrap();
|
let bytes = srv.load_body(response).await.unwrap();
|
||||||
assert!(bytes.is_empty());
|
assert!(bytes.is_empty());
|
||||||
|
|
||||||
|
srv.stop().await;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
@ -528,11 +562,13 @@ async fn test_h1_head_binary() {
|
|||||||
// read response
|
// read response
|
||||||
let bytes = srv.load_body(response).await.unwrap();
|
let bytes = srv.load_body(response).await.unwrap();
|
||||||
assert!(bytes.is_empty());
|
assert!(bytes.is_empty());
|
||||||
|
|
||||||
|
srv.stop().await;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
async fn test_h1_head_binary2() {
|
async fn test_h1_head_binary2() {
|
||||||
let srv = test_server(|| {
|
let mut srv = test_server(|| {
|
||||||
HttpService::build()
|
HttpService::build()
|
||||||
.h1(|_| ok::<_, Infallible>(Response::ok().set_body(STR)))
|
.h1(|_| ok::<_, Infallible>(Response::ok().set_body(STR)))
|
||||||
.tcp()
|
.tcp()
|
||||||
@ -549,6 +585,8 @@ async fn test_h1_head_binary2() {
|
|||||||
.unwrap();
|
.unwrap();
|
||||||
assert_eq!(format!("{}", STR.len()), len.to_str().unwrap());
|
assert_eq!(format!("{}", STR.len()), len.to_str().unwrap());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
srv.stop().await;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
@ -571,6 +609,8 @@ async fn test_h1_body_length() {
|
|||||||
// read response
|
// read response
|
||||||
let bytes = srv.load_body(response).await.unwrap();
|
let bytes = srv.load_body(response).await.unwrap();
|
||||||
assert_eq!(bytes, Bytes::from_static(STR.as_ref()));
|
assert_eq!(bytes, Bytes::from_static(STR.as_ref()));
|
||||||
|
|
||||||
|
srv.stop().await;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
@ -606,6 +646,8 @@ async fn test_h1_body_chunked_explicit() {
|
|||||||
|
|
||||||
// decode
|
// decode
|
||||||
assert_eq!(bytes, Bytes::from_static(STR.as_ref()));
|
assert_eq!(bytes, Bytes::from_static(STR.as_ref()));
|
||||||
|
|
||||||
|
srv.stop().await;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
@ -635,6 +677,8 @@ async fn test_h1_body_chunked_implicit() {
|
|||||||
// read response
|
// read response
|
||||||
let bytes = srv.load_body(response).await.unwrap();
|
let bytes = srv.load_body(response).await.unwrap();
|
||||||
assert_eq!(bytes, Bytes::from_static(STR.as_ref()));
|
assert_eq!(bytes, Bytes::from_static(STR.as_ref()));
|
||||||
|
|
||||||
|
srv.stop().await;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
@ -662,6 +706,8 @@ async fn test_h1_response_http_error_handling() {
|
|||||||
bytes,
|
bytes,
|
||||||
Bytes::from_static(b"error processing HTTP: failed to parse header value")
|
Bytes::from_static(b"error processing HTTP: failed to parse header value")
|
||||||
);
|
);
|
||||||
|
|
||||||
|
srv.stop().await;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Display, Error)]
|
#[derive(Debug, Display, Error)]
|
||||||
@ -689,11 +735,13 @@ async fn test_h1_service_error() {
|
|||||||
// read response
|
// read response
|
||||||
let bytes = srv.load_body(response).await.unwrap();
|
let bytes = srv.load_body(response).await.unwrap();
|
||||||
assert_eq!(bytes, Bytes::from_static(b"error"));
|
assert_eq!(bytes, Bytes::from_static(b"error"));
|
||||||
|
|
||||||
|
srv.stop().await;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
async fn test_h1_on_connect() {
|
async fn test_h1_on_connect() {
|
||||||
let srv = test_server(|| {
|
let mut srv = test_server(|| {
|
||||||
HttpService::build()
|
HttpService::build()
|
||||||
.on_connect_ext(|_, data| {
|
.on_connect_ext(|_, data| {
|
||||||
data.insert(20isize);
|
data.insert(20isize);
|
||||||
@ -708,4 +756,6 @@ async fn test_h1_on_connect() {
|
|||||||
|
|
||||||
let response = srv.get("/").send().await.unwrap();
|
let response = srv.get("/").send().await.unwrap();
|
||||||
assert!(response.status().is_success());
|
assert!(response.status().is_success());
|
||||||
|
|
||||||
|
srv.stop().await;
|
||||||
}
|
}
|
||||||
|
@ -14,7 +14,7 @@ name = "actix_multipart"
|
|||||||
path = "src/lib.rs"
|
path = "src/lib.rs"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
actix-web = { version = "4.0.0-beta.10", default-features = false }
|
actix-web = { version = "4.0.0-beta.11", default-features = false }
|
||||||
actix-utils = "3.0.0"
|
actix-utils = "3.0.0"
|
||||||
|
|
||||||
bytes = "1"
|
bytes = "1"
|
||||||
@ -29,6 +29,6 @@ twoway = "0.2"
|
|||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
actix-rt = "2.2"
|
actix-rt = "2.2"
|
||||||
actix-http = "3.0.0-beta.11"
|
actix-http = "3.0.0-beta.12"
|
||||||
tokio = { version = "1", features = ["sync"] }
|
tokio = { version = "1", features = ["sync"] }
|
||||||
tokio-stream = "0.1"
|
tokio-stream = "0.1"
|
||||||
|
@ -30,7 +30,7 @@ serde = "1"
|
|||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
criterion = { version = "0.3", features = ["html_reports"] }
|
criterion = { version = "0.3", features = ["html_reports"] }
|
||||||
firestorm = { version = "0.4", features = ["enable_system_time"] }
|
firestorm = { version = "0.4", features = ["enable_system_time"] }
|
||||||
http = "0.2.3"
|
http = "0.2.5"
|
||||||
serde = { version = "1", features = ["derive"] }
|
serde = { version = "1", features = ["derive"] }
|
||||||
|
|
||||||
[[bench]]
|
[[bench]]
|
||||||
|
@ -3,6 +3,10 @@
|
|||||||
## Unreleased - 2021-xx-xx
|
## Unreleased - 2021-xx-xx
|
||||||
|
|
||||||
|
|
||||||
|
## 0.1.0-beta.6 - 2021-11-15
|
||||||
|
* No significant changes from `0.1.0-beta.5`.
|
||||||
|
|
||||||
|
|
||||||
## 0.1.0-beta.5 - 2021-10-20
|
## 0.1.0-beta.5 - 2021-10-20
|
||||||
* Updated rustls to v0.20. [#2414]
|
* Updated rustls to v0.20. [#2414]
|
||||||
* Minimum supported Rust version (MSRV) is now 1.52.
|
* Minimum supported Rust version (MSRV) is now 1.52.
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "actix-test"
|
name = "actix-test"
|
||||||
version = "0.1.0-beta.5"
|
version = "0.1.0-beta.6"
|
||||||
authors = [
|
authors = [
|
||||||
"Nikolay Kim <fafhrd91@gmail.com>",
|
"Nikolay Kim <fafhrd91@gmail.com>",
|
||||||
"Rob Ede <robjtede@icloud.com>",
|
"Rob Ede <robjtede@icloud.com>",
|
||||||
@ -29,13 +29,13 @@ openssl = ["tls-openssl", "actix-http/openssl", "awc/openssl"]
|
|||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
actix-codec = "0.4.0"
|
actix-codec = "0.4.0"
|
||||||
actix-http = "3.0.0-beta.11"
|
actix-http = "3.0.0-beta.12"
|
||||||
actix-http-test = "3.0.0-beta.5"
|
actix-http-test = "3.0.0-beta.6"
|
||||||
actix-service = "2.0.0"
|
actix-service = "2.0.0"
|
||||||
actix-utils = "3.0.0"
|
actix-utils = "3.0.0"
|
||||||
actix-web = { version = "4.0.0-beta.10", default-features = false, features = ["cookies"] }
|
actix-web = { version = "4.0.0-beta.11", default-features = false, features = ["cookies"] }
|
||||||
actix-rt = "2.1"
|
actix-rt = "2.1"
|
||||||
awc = { version = "3.0.0-beta.9", default-features = false, features = ["cookies"] }
|
awc = { version = "3.0.0-beta.10", default-features = false, features = ["cookies"] }
|
||||||
|
|
||||||
futures-core = { version = "0.3.7", default-features = false, features = ["std"] }
|
futures-core = { version = "0.3.7", default-features = false, features = ["std"] }
|
||||||
futures-util = { version = "0.3.7", default-features = false, features = [] }
|
futures-util = { version = "0.3.7", default-features = false, features = [] }
|
||||||
@ -45,3 +45,4 @@ serde_json = "1"
|
|||||||
serde_urlencoded = "0.7"
|
serde_urlencoded = "0.7"
|
||||||
tls-openssl = { package = "openssl", version = "0.10.9", optional = true }
|
tls-openssl = { package = "openssl", version = "0.10.9", optional = true }
|
||||||
tls-rustls = { package = "rustls", version = "0.20.0", optional = true }
|
tls-rustls = { package = "rustls", version = "0.20.0", optional = true }
|
||||||
|
tokio = { version = "1.2", features = ["sync"] }
|
||||||
|
@ -31,7 +31,7 @@ extern crate tls_openssl as openssl;
|
|||||||
#[cfg(feature = "rustls")]
|
#[cfg(feature = "rustls")]
|
||||||
extern crate tls_rustls as rustls;
|
extern crate tls_rustls as rustls;
|
||||||
|
|
||||||
use std::{error::Error as StdError, fmt, net, sync::mpsc, thread, time};
|
use std::{error::Error as StdError, fmt, net, thread, time::Duration};
|
||||||
|
|
||||||
use actix_codec::{AsyncRead, AsyncWrite, Framed};
|
use actix_codec::{AsyncRead, AsyncWrite, Framed};
|
||||||
pub use actix_http::test::TestBuffer;
|
pub use actix_http::test::TestBuffer;
|
||||||
@ -41,8 +41,9 @@ use actix_http::{
|
|||||||
};
|
};
|
||||||
use actix_service::{map_config, IntoServiceFactory, ServiceFactory, ServiceFactoryExt as _};
|
use actix_service::{map_config, IntoServiceFactory, ServiceFactory, ServiceFactoryExt as _};
|
||||||
use actix_web::{
|
use actix_web::{
|
||||||
dev::{AppConfig, MessageBody, Server, Service},
|
dev::{AppConfig, MessageBody, Server, ServerHandle, Service},
|
||||||
rt, web, Error,
|
rt::{self, System},
|
||||||
|
web, Error,
|
||||||
};
|
};
|
||||||
use awc::{error::PayloadError, Client, ClientRequest, ClientResponse, Connector};
|
use awc::{error::PayloadError, Client, ClientRequest, ClientResponse, Connector};
|
||||||
use futures_core::Stream;
|
use futures_core::Stream;
|
||||||
@ -52,6 +53,7 @@ pub use actix_web::test::{
|
|||||||
call_service, default_service, init_service, load_stream, ok_service, read_body,
|
call_service, default_service, init_service, load_stream, ok_service, read_body,
|
||||||
read_body_json, read_response, read_response_json, TestRequest,
|
read_body_json, read_response, read_response_json, TestRequest,
|
||||||
};
|
};
|
||||||
|
use tokio::sync::mpsc;
|
||||||
|
|
||||||
/// Start default [`TestServer`].
|
/// Start default [`TestServer`].
|
||||||
///
|
///
|
||||||
@ -128,7 +130,11 @@ where
|
|||||||
B: MessageBody + 'static,
|
B: MessageBody + 'static,
|
||||||
B::Error: Into<Box<dyn StdError>>,
|
B::Error: Into<Box<dyn StdError>>,
|
||||||
{
|
{
|
||||||
let (tx, rx) = mpsc::channel();
|
// for sending handles and server info back from the spawned thread
|
||||||
|
let (started_tx, started_rx) = std::sync::mpsc::channel();
|
||||||
|
|
||||||
|
// for signaling the shutdown of spawned server and system
|
||||||
|
let (thread_stop_tx, thread_stop_rx) = mpsc::channel(1);
|
||||||
|
|
||||||
let tls = match cfg.stream {
|
let tls = match cfg.stream {
|
||||||
StreamType::Tcp => false,
|
StreamType::Tcp => false,
|
||||||
@ -138,7 +144,7 @@ where
|
|||||||
StreamType::Rustls(_) => true,
|
StreamType::Rustls(_) => true,
|
||||||
};
|
};
|
||||||
|
|
||||||
// run server in separate thread
|
// run server in separate orphaned thread
|
||||||
thread::spawn(move || {
|
thread::spawn(move || {
|
||||||
let sys = rt::System::new();
|
let sys = rt::System::new();
|
||||||
let tcp = net::TcpListener::bind("127.0.0.1:0").unwrap();
|
let tcp = net::TcpListener::bind("127.0.0.1:0").unwrap();
|
||||||
@ -146,7 +152,7 @@ where
|
|||||||
let factory = factory.clone();
|
let factory = factory.clone();
|
||||||
let srv_cfg = cfg.clone();
|
let srv_cfg = cfg.clone();
|
||||||
let timeout = cfg.client_timeout;
|
let timeout = cfg.client_timeout;
|
||||||
let builder = Server::build().workers(1).disable_signals();
|
let builder = Server::build().workers(1).disable_signals().system_exit();
|
||||||
|
|
||||||
let srv = match srv_cfg.stream {
|
let srv = match srv_cfg.stream {
|
||||||
StreamType::Tcp => match srv_cfg.tp {
|
StreamType::Tcp => match srv_cfg.tp {
|
||||||
@ -275,17 +281,25 @@ where
|
|||||||
}),
|
}),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
.unwrap();
|
.expect("test server could not be created");
|
||||||
|
|
||||||
sys.block_on(async {
|
let srv = srv.run();
|
||||||
let srv = srv.run();
|
started_tx
|
||||||
tx.send((rt::System::current(), srv, local_addr)).unwrap();
|
.send((System::current(), srv.handle(), local_addr))
|
||||||
});
|
.unwrap();
|
||||||
|
|
||||||
sys.run()
|
// drive server loop
|
||||||
|
sys.block_on(srv).unwrap();
|
||||||
|
|
||||||
|
// start system event loop
|
||||||
|
sys.run().unwrap();
|
||||||
|
|
||||||
|
// notify TestServer that server and system have shut down
|
||||||
|
// all thread managed resources should be dropped at this point
|
||||||
|
let _ = thread_stop_tx.send(());
|
||||||
});
|
});
|
||||||
|
|
||||||
let (system, server, addr) = rx.recv().unwrap();
|
let (system, server, addr) = started_rx.recv().unwrap();
|
||||||
|
|
||||||
let client = {
|
let client = {
|
||||||
let connector = {
|
let connector = {
|
||||||
@ -299,15 +313,15 @@ where
|
|||||||
.set_alpn_protos(b"\x02h2\x08http/1.1")
|
.set_alpn_protos(b"\x02h2\x08http/1.1")
|
||||||
.map_err(|e| log::error!("Can not set alpn protocol: {:?}", e));
|
.map_err(|e| log::error!("Can not set alpn protocol: {:?}", e));
|
||||||
Connector::new()
|
Connector::new()
|
||||||
.conn_lifetime(time::Duration::from_secs(0))
|
.conn_lifetime(Duration::from_secs(0))
|
||||||
.timeout(time::Duration::from_millis(30000))
|
.timeout(Duration::from_millis(30000))
|
||||||
.ssl(builder.build())
|
.ssl(builder.build())
|
||||||
}
|
}
|
||||||
#[cfg(not(feature = "openssl"))]
|
#[cfg(not(feature = "openssl"))]
|
||||||
{
|
{
|
||||||
Connector::new()
|
Connector::new()
|
||||||
.conn_lifetime(time::Duration::from_secs(0))
|
.conn_lifetime(Duration::from_secs(0))
|
||||||
.timeout(time::Duration::from_millis(30000))
|
.timeout(Duration::from_millis(30000))
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -315,11 +329,12 @@ where
|
|||||||
};
|
};
|
||||||
|
|
||||||
TestServer {
|
TestServer {
|
||||||
addr,
|
server,
|
||||||
|
thread_stop_rx,
|
||||||
client,
|
client,
|
||||||
system,
|
system,
|
||||||
|
addr,
|
||||||
tls,
|
tls,
|
||||||
server,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -405,11 +420,12 @@ impl TestServerConfig {
|
|||||||
///
|
///
|
||||||
/// See [`start`] for usage example.
|
/// See [`start`] for usage example.
|
||||||
pub struct TestServer {
|
pub struct TestServer {
|
||||||
addr: net::SocketAddr,
|
server: ServerHandle,
|
||||||
|
thread_stop_rx: mpsc::Receiver<()>,
|
||||||
client: awc::Client,
|
client: awc::Client,
|
||||||
system: rt::System,
|
system: rt::System,
|
||||||
|
addr: net::SocketAddr,
|
||||||
tls: bool,
|
tls: bool,
|
||||||
server: Server,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl TestServer {
|
impl TestServer {
|
||||||
@ -505,15 +521,30 @@ impl TestServer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Gracefully stop HTTP server.
|
/// Gracefully stop HTTP server.
|
||||||
pub async fn stop(self) {
|
///
|
||||||
|
/// Waits for spawned `Server` and `System` to shutdown gracefully.
|
||||||
|
pub async fn stop(mut self) {
|
||||||
|
// signal server to stop
|
||||||
self.server.stop(true).await;
|
self.server.stop(true).await;
|
||||||
|
|
||||||
|
// also signal system to stop
|
||||||
|
// though this is handled by `ServerBuilder::exit_system` too
|
||||||
self.system.stop();
|
self.system.stop();
|
||||||
rt::time::sleep(time::Duration::from_millis(100)).await;
|
|
||||||
|
// wait for thread to be stopped but don't care about result
|
||||||
|
let _ = self.thread_stop_rx.recv().await;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Drop for TestServer {
|
impl Drop for TestServer {
|
||||||
fn drop(&mut self) {
|
fn drop(&mut self) {
|
||||||
self.system.stop()
|
// calls in this Drop impl should be enough to shut down the server, system, and thread
|
||||||
|
// without needing to await anything
|
||||||
|
|
||||||
|
// signal server to stop
|
||||||
|
let _ = self.server.stop(true);
|
||||||
|
|
||||||
|
// signal system to stop
|
||||||
|
self.system.stop();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -16,8 +16,8 @@ path = "src/lib.rs"
|
|||||||
[dependencies]
|
[dependencies]
|
||||||
actix = { version = "0.12.0", default-features = false }
|
actix = { version = "0.12.0", default-features = false }
|
||||||
actix-codec = "0.4.0"
|
actix-codec = "0.4.0"
|
||||||
actix-http = "3.0.0-beta.11"
|
actix-http = "3.0.0-beta.12"
|
||||||
actix-web = { version = "4.0.0-beta.10", default-features = false }
|
actix-web = { version = "4.0.0-beta.11", default-features = false }
|
||||||
|
|
||||||
bytes = "1"
|
bytes = "1"
|
||||||
bytestring = "1"
|
bytestring = "1"
|
||||||
@ -27,8 +27,8 @@ tokio = { version = "1", features = ["sync"] }
|
|||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
actix-rt = "2.2"
|
actix-rt = "2.2"
|
||||||
actix-test = "0.1.0-beta.5"
|
actix-test = "0.1.0-beta.6"
|
||||||
|
|
||||||
awc = { version = "3.0.0-beta.9", default-features = false }
|
awc = { version = "3.0.0-beta.10", default-features = false }
|
||||||
env_logger = "0.8"
|
env_logger = "0.8"
|
||||||
futures-util = { version = "0.3.7", default-features = false }
|
futures-util = { version = "0.3.7", default-features = false }
|
||||||
|
@ -23,9 +23,9 @@ actix-router = "0.5.0-beta.2"
|
|||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
actix-rt = "2.2"
|
actix-rt = "2.2"
|
||||||
actix-macros = "0.2.3"
|
actix-macros = "0.2.3"
|
||||||
actix-test = "0.1.0-beta.5"
|
actix-test = "0.1.0-beta.6"
|
||||||
actix-utils = "3.0.0"
|
actix-utils = "3.0.0"
|
||||||
actix-web = "4.0.0-beta.10"
|
actix-web = "4.0.0-beta.11"
|
||||||
|
|
||||||
futures-core = { version = "0.3.7", default-features = false, features = ["alloc"] }
|
futures-core = { version = "0.3.7", default-features = false, features = ["alloc"] }
|
||||||
trybuild = "1"
|
trybuild = "1"
|
||||||
|
@ -3,6 +3,9 @@
|
|||||||
## Unreleased - 2021-xx-xx
|
## Unreleased - 2021-xx-xx
|
||||||
|
|
||||||
|
|
||||||
|
## 3.0.0-beta.10 - 2021-11-15
|
||||||
|
|
||||||
|
|
||||||
## 3.0.0-beta.9 - 2021-10-20
|
## 3.0.0-beta.9 - 2021-10-20
|
||||||
* Updated rustls to v0.20. [#2414]
|
* Updated rustls to v0.20. [#2414]
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "awc"
|
name = "awc"
|
||||||
version = "3.0.0-beta.9"
|
version = "3.0.0-beta.10"
|
||||||
authors = [
|
authors = [
|
||||||
"Nikolay Kim <fafhrd91@gmail.com>",
|
"Nikolay Kim <fafhrd91@gmail.com>",
|
||||||
"fakeshadow <24548779@qq.com>",
|
"fakeshadow <24548779@qq.com>",
|
||||||
@ -55,7 +55,7 @@ __compress = []
|
|||||||
[dependencies]
|
[dependencies]
|
||||||
actix-codec = "0.4.0"
|
actix-codec = "0.4.0"
|
||||||
actix-service = "2.0.0"
|
actix-service = "2.0.0"
|
||||||
actix-http = "3.0.0-beta.11"
|
actix-http = "3.0.0-beta.12"
|
||||||
actix-rt = { version = "2.1", default-features = false }
|
actix-rt = { version = "2.1", default-features = false }
|
||||||
actix-tls = { version = "3.0.0-beta.7", features = ["connect"] }
|
actix-tls = { version = "3.0.0-beta.7", features = ["connect"] }
|
||||||
actix-utils = "3.0.0"
|
actix-utils = "3.0.0"
|
||||||
@ -68,7 +68,7 @@ derive_more = "0.99.5"
|
|||||||
futures-core = { version = "0.3.7", default-features = false }
|
futures-core = { version = "0.3.7", default-features = false }
|
||||||
futures-util = { version = "0.3.7", default-features = false }
|
futures-util = { version = "0.3.7", default-features = false }
|
||||||
h2 = "0.3"
|
h2 = "0.3"
|
||||||
http = "0.2"
|
http = "0.2.5"
|
||||||
itoa = "0.4"
|
itoa = "0.4"
|
||||||
log =" 0.4"
|
log =" 0.4"
|
||||||
mime = "0.3"
|
mime = "0.3"
|
||||||
@ -88,13 +88,13 @@ tls-rustls = { package = "rustls", version = "0.20.0", optional = true, features
|
|||||||
trust-dns-resolver = { version = "0.20.0", optional = true }
|
trust-dns-resolver = { version = "0.20.0", optional = true }
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
actix-web = { version = "4.0.0-beta.10", features = ["openssl"] }
|
actix-web = { version = "4.0.0-beta.11", features = ["openssl"] }
|
||||||
actix-http = { version = "3.0.0-beta.11", features = ["openssl"] }
|
actix-http = { version = "3.0.0-beta.12", features = ["openssl"] }
|
||||||
actix-http-test = { version = "3.0.0-beta.5", features = ["openssl"] }
|
actix-http-test = { version = "3.0.0-beta.6", features = ["openssl"] }
|
||||||
actix-utils = "3.0.0"
|
actix-utils = "3.0.0"
|
||||||
actix-server = "2.0.0-beta.3"
|
actix-server = "2.0.0-beta.9"
|
||||||
actix-tls = { version = "3.0.0-beta.7", features = ["openssl", "rustls"] }
|
actix-tls = { version = "3.0.0-beta.7", features = ["openssl", "rustls"] }
|
||||||
actix-test = { version = "0.1.0-beta.5", features = ["openssl", "rustls"] }
|
actix-test = { version = "0.1.0-beta.6", features = ["openssl", "rustls"] }
|
||||||
|
|
||||||
brotli2 = "0.3.2"
|
brotli2 = "0.3.2"
|
||||||
env_logger = "0.8"
|
env_logger = "0.8"
|
||||||
|
@ -3,9 +3,9 @@
|
|||||||
> Async HTTP and WebSocket client library.
|
> Async HTTP and WebSocket client library.
|
||||||
|
|
||||||
[![crates.io](https://img.shields.io/crates/v/awc?label=latest)](https://crates.io/crates/awc)
|
[![crates.io](https://img.shields.io/crates/v/awc?label=latest)](https://crates.io/crates/awc)
|
||||||
[![Documentation](https://docs.rs/awc/badge.svg?version=3.0.0-beta.9)](https://docs.rs/awc/3.0.0-beta.9)
|
[![Documentation](https://docs.rs/awc/badge.svg?version=3.0.0-beta.10)](https://docs.rs/awc/3.0.0-beta.10)
|
||||||
![MIT or Apache 2.0 licensed](https://img.shields.io/crates/l/awc)
|
![MIT or Apache 2.0 licensed](https://img.shields.io/crates/l/awc)
|
||||||
[![Dependency Status](https://deps.rs/crate/awc/3.0.0-beta.9/status.svg)](https://deps.rs/crate/awc/3.0.0-beta.9)
|
[![Dependency Status](https://deps.rs/crate/awc/3.0.0-beta.10/status.svg)](https://deps.rs/crate/awc/3.0.0-beta.10)
|
||||||
[![Chat on Discord](https://img.shields.io/discord/771444961383153695?label=chat&logo=discord)](https://discord.gg/NWpN5mmg3x)
|
[![Chat on Discord](https://img.shields.io/discord/771444961383153695?label=chat&logo=discord)](https://discord.gg/NWpN5mmg3x)
|
||||||
|
|
||||||
## Documentation & Resources
|
## Documentation & Resources
|
||||||
|
@ -173,6 +173,7 @@ impl H2ConnectionInner {
|
|||||||
/// Cancel spawned connection task on drop.
|
/// Cancel spawned connection task on drop.
|
||||||
impl Drop for H2ConnectionInner {
|
impl Drop for H2ConnectionInner {
|
||||||
fn drop(&mut self) {
|
fn drop(&mut self) {
|
||||||
|
// TODO: this can end up sending extraneous requests; see if there is a better way to handle
|
||||||
if self
|
if self
|
||||||
.sender
|
.sender
|
||||||
.send_request(http::Request::new(()), true)
|
.send_request(http::Request::new(()), true)
|
||||||
@ -183,8 +184,8 @@ impl Drop for H2ConnectionInner {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Unified connection type cover HTTP/1 Plain/TLS and HTTP/2 protocols.
|
||||||
#[allow(dead_code)]
|
#[allow(dead_code)]
|
||||||
/// Unified connection type cover Http1 Plain/Tls and Http2 protocols
|
|
||||||
pub enum Connection<A, B = Box<dyn ConnectionIo>>
|
pub enum Connection<A, B = Box<dyn ConnectionIo>>
|
||||||
where
|
where
|
||||||
A: ConnectionIo,
|
A: ConnectionIo,
|
||||||
|
@ -19,8 +19,7 @@ use actix_utils::future::ok;
|
|||||||
use actix_web::{dev::AppConfig, http::Version, web, App, HttpResponse};
|
use actix_web::{dev::AppConfig, http::Version, web, App, HttpResponse};
|
||||||
use rustls::{
|
use rustls::{
|
||||||
client::{ServerCertVerified, ServerCertVerifier},
|
client::{ServerCertVerified, ServerCertVerifier},
|
||||||
Certificate, ClientConfig, OwnedTrustAnchor, PrivateKey, RootCertStore, ServerConfig,
|
Certificate, ClientConfig, PrivateKey, ServerConfig, ServerName,
|
||||||
ServerName,
|
|
||||||
};
|
};
|
||||||
use rustls_pemfile::{certs, pkcs8_private_keys};
|
use rustls_pemfile::{certs, pkcs8_private_keys};
|
||||||
|
|
||||||
|
@ -8,6 +8,7 @@ use std::{any::Any, io, net::SocketAddr};
|
|||||||
|
|
||||||
use actix_web::{dev::Extensions, rt::net::TcpStream, web, App, HttpServer};
|
use actix_web::{dev::Extensions, rt::net::TcpStream, web, App, HttpServer};
|
||||||
|
|
||||||
|
#[allow(dead_code)]
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
struct ConnectionInfo {
|
struct ConnectionInfo {
|
||||||
bind: SocketAddr,
|
bind: SocketAddr,
|
||||||
|
@ -20,7 +20,7 @@ pub use actix_http::body::{AnyBody, Body, BodySize, MessageBody, ResponseBody, S
|
|||||||
pub use actix_http::encoding::Decoder as Decompress;
|
pub use actix_http::encoding::Decoder as Decompress;
|
||||||
pub use actix_http::{Extensions, Payload, PayloadStream, RequestHead, Response, ResponseHead};
|
pub use actix_http::{Extensions, Payload, PayloadStream, RequestHead, Response, ResponseHead};
|
||||||
pub use actix_router::{Path, ResourceDef, ResourcePath, Url};
|
pub use actix_router::{Path, ResourceDef, ResourcePath, Url};
|
||||||
pub use actix_server::Server;
|
pub use actix_server::{Server, ServerHandle};
|
||||||
pub use actix_service::{
|
pub use actix_service::{
|
||||||
always_ready, fn_factory, fn_service, forward_ready, Service, ServiceFactory, Transform,
|
always_ready, fn_factory, fn_service, forward_ready, Service, ServiceFactory, Transform,
|
||||||
};
|
};
|
||||||
|
@ -159,7 +159,7 @@ where
|
|||||||
///
|
///
|
||||||
/// By default max connections is set to a 25k.
|
/// By default max connections is set to a 25k.
|
||||||
pub fn max_connections(mut self, num: usize) -> Self {
|
pub fn max_connections(mut self, num: usize) -> Self {
|
||||||
self.builder = self.builder.maxconn(num);
|
self.builder = self.builder.max_concurrent_connections(num);
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -233,7 +233,7 @@ where
|
|||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Stop actix system.
|
/// Stop Actix `System` after server shutdown.
|
||||||
pub fn system_exit(mut self) -> Self {
|
pub fn system_exit(mut self) -> Self {
|
||||||
self.builder = self.builder.system_exit();
|
self.builder = self.builder.system_exit();
|
||||||
self
|
self
|
||||||
|
@ -14,57 +14,45 @@ async fn test_start() {
|
|||||||
let (tx, rx) = mpsc::channel();
|
let (tx, rx) = mpsc::channel();
|
||||||
|
|
||||||
thread::spawn(move || {
|
thread::spawn(move || {
|
||||||
let sys = actix_rt::System::new();
|
actix_rt::System::new()
|
||||||
|
.block_on(async {
|
||||||
|
let srv = HttpServer::new(|| {
|
||||||
|
App::new().service(
|
||||||
|
web::resource("/").route(web::to(|| HttpResponse::Ok().body("test"))),
|
||||||
|
)
|
||||||
|
})
|
||||||
|
.workers(1)
|
||||||
|
.backlog(1)
|
||||||
|
.max_connections(10)
|
||||||
|
.max_connection_rate(10)
|
||||||
|
.keep_alive(10)
|
||||||
|
.client_timeout(5000)
|
||||||
|
.client_shutdown(0)
|
||||||
|
.server_hostname("localhost")
|
||||||
|
.system_exit()
|
||||||
|
.disable_signals()
|
||||||
|
.bind(format!("{}", addr))
|
||||||
|
.unwrap()
|
||||||
|
.run();
|
||||||
|
|
||||||
sys.block_on(async {
|
tx.send(srv.handle()).unwrap();
|
||||||
let srv = HttpServer::new(|| {
|
|
||||||
App::new().service(
|
srv.await
|
||||||
web::resource("/").route(web::to(|| HttpResponse::Ok().body("test"))),
|
|
||||||
)
|
|
||||||
})
|
})
|
||||||
.workers(1)
|
.unwrap();
|
||||||
.backlog(1)
|
|
||||||
.max_connections(10)
|
|
||||||
.max_connection_rate(10)
|
|
||||||
.keep_alive(10)
|
|
||||||
.client_timeout(5000)
|
|
||||||
.client_shutdown(0)
|
|
||||||
.server_hostname("localhost")
|
|
||||||
.system_exit()
|
|
||||||
.disable_signals()
|
|
||||||
.bind(format!("{}", addr))
|
|
||||||
.unwrap()
|
|
||||||
.run();
|
|
||||||
|
|
||||||
let _ = tx.send((srv, actix_rt::System::current()));
|
|
||||||
});
|
|
||||||
|
|
||||||
let _ = sys.run();
|
|
||||||
});
|
});
|
||||||
let (srv, sys) = rx.recv().unwrap();
|
|
||||||
|
|
||||||
#[cfg(feature = "client")]
|
let srv = rx.recv().unwrap();
|
||||||
{
|
|
||||||
use actix_http::client;
|
|
||||||
|
|
||||||
let client = awc::Client::builder()
|
let client = awc::Client::builder()
|
||||||
.connector(
|
.connector(awc::Connector::new().timeout(Duration::from_millis(100)))
|
||||||
client::Connector::new()
|
.finish();
|
||||||
.timeout(Duration::from_millis(100))
|
|
||||||
.finish(),
|
|
||||||
)
|
|
||||||
.finish();
|
|
||||||
|
|
||||||
let host = format!("http://{}", addr);
|
let host = format!("http://{}", addr);
|
||||||
let response = client.get(host.clone()).send().await.unwrap();
|
let response = client.get(host.clone()).send().await.unwrap();
|
||||||
assert!(response.status().is_success());
|
assert!(response.status().is_success());
|
||||||
}
|
|
||||||
|
|
||||||
// stop
|
srv.stop(false).await;
|
||||||
let _ = srv.stop(false);
|
|
||||||
|
|
||||||
thread::sleep(Duration::from_millis(100));
|
|
||||||
let _ = sys.stop();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(feature = "openssl")]
|
#[cfg(feature = "openssl")]
|
||||||
@ -92,37 +80,38 @@ fn ssl_acceptor() -> openssl::ssl::SslAcceptorBuilder {
|
|||||||
#[cfg(feature = "openssl")]
|
#[cfg(feature = "openssl")]
|
||||||
async fn test_start_ssl() {
|
async fn test_start_ssl() {
|
||||||
use actix_web::HttpRequest;
|
use actix_web::HttpRequest;
|
||||||
|
use openssl::ssl::{SslConnector, SslMethod, SslVerifyMode};
|
||||||
|
|
||||||
let addr = actix_test::unused_addr();
|
let addr = actix_test::unused_addr();
|
||||||
let (tx, rx) = mpsc::channel();
|
let (tx, rx) = mpsc::channel();
|
||||||
|
|
||||||
thread::spawn(move || {
|
thread::spawn(move || {
|
||||||
let sys = actix_rt::System::new();
|
actix_rt::System::new()
|
||||||
let builder = ssl_acceptor();
|
.block_on(async {
|
||||||
|
let builder = ssl_acceptor();
|
||||||
|
|
||||||
let srv = HttpServer::new(|| {
|
let srv = HttpServer::new(|| {
|
||||||
App::new().service(web::resource("/").route(web::to(|req: HttpRequest| {
|
App::new().service(web::resource("/").route(web::to(|req: HttpRequest| {
|
||||||
assert!(req.app_config().secure());
|
assert!(req.app_config().secure());
|
||||||
HttpResponse::Ok().body("test")
|
HttpResponse::Ok().body("test")
|
||||||
})))
|
})))
|
||||||
})
|
})
|
||||||
.workers(1)
|
.workers(1)
|
||||||
.shutdown_timeout(1)
|
.shutdown_timeout(1)
|
||||||
.system_exit()
|
.system_exit()
|
||||||
.disable_signals()
|
.disable_signals()
|
||||||
.bind_openssl(format!("{}", addr), builder)
|
.bind_openssl(format!("{}", addr), builder)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
sys.block_on(async {
|
let srv = srv.run();
|
||||||
let srv = srv.run();
|
tx.send(srv.handle()).unwrap();
|
||||||
let _ = tx.send((srv, actix_rt::System::current()));
|
|
||||||
});
|
|
||||||
|
|
||||||
let _ = sys.run();
|
srv.await
|
||||||
|
})
|
||||||
|
.unwrap()
|
||||||
});
|
});
|
||||||
let (srv, sys) = rx.recv().unwrap();
|
let srv = rx.recv().unwrap();
|
||||||
|
|
||||||
use openssl::ssl::{SslConnector, SslMethod, SslVerifyMode};
|
|
||||||
let mut builder = SslConnector::builder(SslMethod::tls()).unwrap();
|
let mut builder = SslConnector::builder(SslMethod::tls()).unwrap();
|
||||||
builder.set_verify(SslVerifyMode::NONE);
|
builder.set_verify(SslVerifyMode::NONE);
|
||||||
let _ = builder
|
let _ = builder
|
||||||
@ -141,9 +130,5 @@ async fn test_start_ssl() {
|
|||||||
let response = client.get(host.clone()).send().await.unwrap();
|
let response = client.get(host.clone()).send().await.unwrap();
|
||||||
assert!(response.status().is_success());
|
assert!(response.status().is_success());
|
||||||
|
|
||||||
// stop
|
srv.stop(false).await;
|
||||||
let _ = srv.stop(false);
|
|
||||||
|
|
||||||
thread::sleep(Duration::from_millis(100));
|
|
||||||
let _ = sys.stop();
|
|
||||||
}
|
}
|
||||||
|
@ -127,6 +127,8 @@ async fn test_body() {
|
|||||||
// read response
|
// read response
|
||||||
let bytes = response.body().await.unwrap();
|
let bytes = response.body().await.unwrap();
|
||||||
assert_eq!(bytes, Bytes::from_static(STR.as_ref()));
|
assert_eq!(bytes, Bytes::from_static(STR.as_ref()));
|
||||||
|
|
||||||
|
srv.stop().await;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
@ -154,6 +156,8 @@ async fn test_body_gzip() {
|
|||||||
let mut dec = Vec::new();
|
let mut dec = Vec::new();
|
||||||
e.read_to_end(&mut dec).unwrap();
|
e.read_to_end(&mut dec).unwrap();
|
||||||
assert_eq!(Bytes::from(dec), Bytes::from_static(STR.as_ref()));
|
assert_eq!(Bytes::from(dec), Bytes::from_static(STR.as_ref()));
|
||||||
|
|
||||||
|
srv.stop().await;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
@ -181,6 +185,8 @@ async fn test_body_gzip2() {
|
|||||||
let mut dec = Vec::new();
|
let mut dec = Vec::new();
|
||||||
e.read_to_end(&mut dec).unwrap();
|
e.read_to_end(&mut dec).unwrap();
|
||||||
assert_eq!(Bytes::from(dec), Bytes::from_static(STR.as_ref()));
|
assert_eq!(Bytes::from(dec), Bytes::from_static(STR.as_ref()));
|
||||||
|
|
||||||
|
srv.stop().await;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
@ -241,6 +247,8 @@ async fn test_body_encoding_override() {
|
|||||||
e.write_all(bytes.as_ref()).unwrap();
|
e.write_all(bytes.as_ref()).unwrap();
|
||||||
let dec = e.finish().unwrap();
|
let dec = e.finish().unwrap();
|
||||||
assert_eq!(Bytes::from(dec), Bytes::from_static(STR.as_ref()));
|
assert_eq!(Bytes::from(dec), Bytes::from_static(STR.as_ref()));
|
||||||
|
|
||||||
|
srv.stop().await;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
@ -275,6 +283,8 @@ async fn test_body_gzip_large() {
|
|||||||
let mut dec = Vec::new();
|
let mut dec = Vec::new();
|
||||||
e.read_to_end(&mut dec).unwrap();
|
e.read_to_end(&mut dec).unwrap();
|
||||||
assert_eq!(Bytes::from(dec), Bytes::from(data));
|
assert_eq!(Bytes::from(dec), Bytes::from(data));
|
||||||
|
|
||||||
|
srv.stop().await;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
@ -314,6 +324,8 @@ async fn test_body_gzip_large_random() {
|
|||||||
e.read_to_end(&mut dec).unwrap();
|
e.read_to_end(&mut dec).unwrap();
|
||||||
assert_eq!(dec.len(), data.len());
|
assert_eq!(dec.len(), data.len());
|
||||||
assert_eq!(Bytes::from(dec), Bytes::from(data));
|
assert_eq!(Bytes::from(dec), Bytes::from(data));
|
||||||
|
|
||||||
|
srv.stop().await;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
@ -348,6 +360,8 @@ async fn test_body_chunked_implicit() {
|
|||||||
let mut dec = Vec::new();
|
let mut dec = Vec::new();
|
||||||
e.read_to_end(&mut dec).unwrap();
|
e.read_to_end(&mut dec).unwrap();
|
||||||
assert_eq!(Bytes::from(dec), Bytes::from_static(STR.as_ref()));
|
assert_eq!(Bytes::from(dec), Bytes::from_static(STR.as_ref()));
|
||||||
|
|
||||||
|
srv.stop().await;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
@ -380,6 +394,8 @@ async fn test_body_br_streaming() {
|
|||||||
let dec = e.finish().unwrap();
|
let dec = e.finish().unwrap();
|
||||||
println!("T: {:?}", Bytes::copy_from_slice(&dec));
|
println!("T: {:?}", Bytes::copy_from_slice(&dec));
|
||||||
assert_eq!(Bytes::from(dec), Bytes::from_static(STR.as_ref()));
|
assert_eq!(Bytes::from(dec), Bytes::from_static(STR.as_ref()));
|
||||||
|
|
||||||
|
srv.stop().await;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
@ -401,6 +417,8 @@ async fn test_head_binary() {
|
|||||||
// read response
|
// read response
|
||||||
let bytes = response.body().await.unwrap();
|
let bytes = response.body().await.unwrap();
|
||||||
assert!(bytes.is_empty());
|
assert!(bytes.is_empty());
|
||||||
|
|
||||||
|
srv.stop().await;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
@ -420,6 +438,8 @@ async fn test_no_chunking() {
|
|||||||
// read response
|
// read response
|
||||||
let bytes = response.body().await.unwrap();
|
let bytes = response.body().await.unwrap();
|
||||||
assert_eq!(bytes, Bytes::from_static(STR.as_ref()));
|
assert_eq!(bytes, Bytes::from_static(STR.as_ref()));
|
||||||
|
|
||||||
|
srv.stop().await;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
@ -447,6 +467,8 @@ async fn test_body_deflate() {
|
|||||||
e.write_all(bytes.as_ref()).unwrap();
|
e.write_all(bytes.as_ref()).unwrap();
|
||||||
let dec = e.finish().unwrap();
|
let dec = e.finish().unwrap();
|
||||||
assert_eq!(Bytes::from(dec), Bytes::from_static(STR.as_ref()));
|
assert_eq!(Bytes::from(dec), Bytes::from_static(STR.as_ref()));
|
||||||
|
|
||||||
|
srv.stop().await;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
@ -475,6 +497,8 @@ async fn test_body_brotli() {
|
|||||||
e.write_all(bytes.as_ref()).unwrap();
|
e.write_all(bytes.as_ref()).unwrap();
|
||||||
let dec = e.finish().unwrap();
|
let dec = e.finish().unwrap();
|
||||||
assert_eq!(Bytes::from(dec), Bytes::from_static(STR.as_ref()));
|
assert_eq!(Bytes::from(dec), Bytes::from_static(STR.as_ref()));
|
||||||
|
|
||||||
|
srv.stop().await;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
@ -503,6 +527,8 @@ async fn test_body_zstd() {
|
|||||||
let mut dec = Vec::new();
|
let mut dec = Vec::new();
|
||||||
e.read_to_end(&mut dec).unwrap();
|
e.read_to_end(&mut dec).unwrap();
|
||||||
assert_eq!(Bytes::from(dec), Bytes::from_static(STR.as_ref()));
|
assert_eq!(Bytes::from(dec), Bytes::from_static(STR.as_ref()));
|
||||||
|
|
||||||
|
srv.stop().await;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
@ -534,6 +560,8 @@ async fn test_body_zstd_streaming() {
|
|||||||
let mut dec = Vec::new();
|
let mut dec = Vec::new();
|
||||||
e.read_to_end(&mut dec).unwrap();
|
e.read_to_end(&mut dec).unwrap();
|
||||||
assert_eq!(Bytes::from(dec), Bytes::from_static(STR.as_ref()));
|
assert_eq!(Bytes::from(dec), Bytes::from_static(STR.as_ref()));
|
||||||
|
|
||||||
|
srv.stop().await;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
@ -559,6 +587,8 @@ async fn test_zstd_encoding() {
|
|||||||
// read response
|
// read response
|
||||||
let bytes = response.body().await.unwrap();
|
let bytes = response.body().await.unwrap();
|
||||||
assert_eq!(bytes, Bytes::from_static(STR.as_ref()));
|
assert_eq!(bytes, Bytes::from_static(STR.as_ref()));
|
||||||
|
|
||||||
|
srv.stop().await;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
@ -594,6 +624,8 @@ async fn test_zstd_encoding_large() {
|
|||||||
// read response
|
// read response
|
||||||
let bytes = response.body().limit(320_000).await.unwrap();
|
let bytes = response.body().limit(320_000).await.unwrap();
|
||||||
assert_eq!(bytes, Bytes::from(data));
|
assert_eq!(bytes, Bytes::from(data));
|
||||||
|
|
||||||
|
srv.stop().await;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
@ -619,6 +651,8 @@ async fn test_encoding() {
|
|||||||
// read response
|
// read response
|
||||||
let bytes = response.body().await.unwrap();
|
let bytes = response.body().await.unwrap();
|
||||||
assert_eq!(bytes, Bytes::from_static(STR.as_ref()));
|
assert_eq!(bytes, Bytes::from_static(STR.as_ref()));
|
||||||
|
|
||||||
|
srv.stop().await;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
@ -644,6 +678,8 @@ async fn test_gzip_encoding() {
|
|||||||
// read response
|
// read response
|
||||||
let bytes = response.body().await.unwrap();
|
let bytes = response.body().await.unwrap();
|
||||||
assert_eq!(bytes, Bytes::from_static(STR.as_ref()));
|
assert_eq!(bytes, Bytes::from_static(STR.as_ref()));
|
||||||
|
|
||||||
|
srv.stop().await;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
@ -670,6 +706,8 @@ async fn test_gzip_encoding_large() {
|
|||||||
// read response
|
// read response
|
||||||
let bytes = response.body().await.unwrap();
|
let bytes = response.body().await.unwrap();
|
||||||
assert_eq!(bytes, Bytes::from(data));
|
assert_eq!(bytes, Bytes::from(data));
|
||||||
|
|
||||||
|
srv.stop().await;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
@ -702,6 +740,8 @@ async fn test_reading_gzip_encoding_large_random() {
|
|||||||
let bytes = response.body().await.unwrap();
|
let bytes = response.body().await.unwrap();
|
||||||
assert_eq!(bytes.len(), data.len());
|
assert_eq!(bytes.len(), data.len());
|
||||||
assert_eq!(bytes, Bytes::from(data));
|
assert_eq!(bytes, Bytes::from(data));
|
||||||
|
|
||||||
|
srv.stop().await;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
@ -727,6 +767,8 @@ async fn test_reading_deflate_encoding() {
|
|||||||
// read response
|
// read response
|
||||||
let bytes = response.body().await.unwrap();
|
let bytes = response.body().await.unwrap();
|
||||||
assert_eq!(bytes, Bytes::from_static(STR.as_ref()));
|
assert_eq!(bytes, Bytes::from_static(STR.as_ref()));
|
||||||
|
|
||||||
|
srv.stop().await;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
@ -753,6 +795,8 @@ async fn test_reading_deflate_encoding_large() {
|
|||||||
// read response
|
// read response
|
||||||
let bytes = response.body().await.unwrap();
|
let bytes = response.body().await.unwrap();
|
||||||
assert_eq!(bytes, Bytes::from(data));
|
assert_eq!(bytes, Bytes::from(data));
|
||||||
|
|
||||||
|
srv.stop().await;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
@ -785,6 +829,8 @@ async fn test_reading_deflate_encoding_large_random() {
|
|||||||
let bytes = response.body().await.unwrap();
|
let bytes = response.body().await.unwrap();
|
||||||
assert_eq!(bytes.len(), data.len());
|
assert_eq!(bytes.len(), data.len());
|
||||||
assert_eq!(bytes, Bytes::from(data));
|
assert_eq!(bytes, Bytes::from(data));
|
||||||
|
|
||||||
|
srv.stop().await;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
@ -810,6 +856,8 @@ async fn test_brotli_encoding() {
|
|||||||
// read response
|
// read response
|
||||||
let bytes = response.body().await.unwrap();
|
let bytes = response.body().await.unwrap();
|
||||||
assert_eq!(bytes, Bytes::from_static(STR.as_ref()));
|
assert_eq!(bytes, Bytes::from_static(STR.as_ref()));
|
||||||
|
|
||||||
|
srv.stop().await;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
@ -845,6 +893,8 @@ async fn test_brotli_encoding_large() {
|
|||||||
// read response
|
// read response
|
||||||
let bytes = response.body().limit(320_000).await.unwrap();
|
let bytes = response.body().limit(320_000).await.unwrap();
|
||||||
assert_eq!(bytes, Bytes::from(data));
|
assert_eq!(bytes, Bytes::from(data));
|
||||||
|
|
||||||
|
srv.stop().await;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(feature = "openssl")]
|
#[cfg(feature = "openssl")]
|
||||||
@ -861,9 +911,9 @@ async fn test_brotli_encoding_large_openssl() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
// body
|
// body
|
||||||
let mut e = BrotliEncoder::new(Vec::new(), 3);
|
let mut enc = BrotliEncoder::new(Vec::new(), 3);
|
||||||
e.write_all(data.as_ref()).unwrap();
|
enc.write_all(data.as_ref()).unwrap();
|
||||||
let enc = e.finish().unwrap();
|
let enc = enc.finish().unwrap();
|
||||||
|
|
||||||
// client request
|
// client request
|
||||||
let mut response = srv
|
let mut response = srv
|
||||||
@ -877,6 +927,8 @@ async fn test_brotli_encoding_large_openssl() {
|
|||||||
// read response
|
// read response
|
||||||
let bytes = response.body().await.unwrap();
|
let bytes = response.body().await.unwrap();
|
||||||
assert_eq!(bytes, Bytes::from(data));
|
assert_eq!(bytes, Bytes::from(data));
|
||||||
|
|
||||||
|
srv.stop().await;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(feature = "rustls")]
|
#[cfg(feature = "rustls")]
|
||||||
@ -944,6 +996,8 @@ mod plus_rustls {
|
|||||||
let bytes = response.body().await.unwrap();
|
let bytes = response.body().await.unwrap();
|
||||||
assert_eq!(bytes.len(), data.len());
|
assert_eq!(bytes.len(), data.len());
|
||||||
assert_eq!(bytes, Bytes::from(data));
|
assert_eq!(bytes, Bytes::from(data));
|
||||||
|
|
||||||
|
srv.stop().await;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -998,6 +1052,8 @@ async fn test_server_cookies() {
|
|||||||
assert_eq!(cookies[0], second_cookie);
|
assert_eq!(cookies[0], second_cookie);
|
||||||
assert_eq!(cookies[1], first_cookie);
|
assert_eq!(cookies[1], first_cookie);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
srv.stop().await;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
@ -1018,6 +1074,8 @@ async fn test_slow_request() {
|
|||||||
let mut data = String::new();
|
let mut data = String::new();
|
||||||
let _ = stream.read_to_string(&mut data);
|
let _ = stream.read_to_string(&mut data);
|
||||||
assert!(data.starts_with("HTTP/1.1 408 Request Timeout"));
|
assert!(data.starts_with("HTTP/1.1 408 Request Timeout"));
|
||||||
|
|
||||||
|
srv.stop().await;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
@ -1030,6 +1088,8 @@ async fn test_normalize() {
|
|||||||
|
|
||||||
let response = srv.get("/one/").send().await.unwrap();
|
let response = srv.get("/one/").send().await.unwrap();
|
||||||
assert!(response.status().is_success());
|
assert!(response.status().is_success());
|
||||||
|
|
||||||
|
srv.stop().await
|
||||||
}
|
}
|
||||||
|
|
||||||
// allow deprecated App::data
|
// allow deprecated App::data
|
||||||
@ -1099,4 +1159,6 @@ async fn test_accept_encoding_no_match() {
|
|||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
assert_eq!(response.status().as_u16(), 406);
|
assert_eq!(response.status().as_u16(), 406);
|
||||||
|
|
||||||
|
srv.stop().await;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user