Compare commits

...

2 Commits

Author SHA1 Message Date
Yuki Okushi 1a980855f0
test(awc): add regression test for #2305 (#4044) 2026-04-25 20:08:27 +09:00
Yuki Okushi 3b100ebdfe
chore: upgrade `criterion` to 0.8 (#4045) 2026-04-25 20:08:11 +09:00
8 changed files with 102 additions and 33 deletions

47
Cargo.lock generated
View File

@ -465,6 +465,15 @@ dependencies = [
"alloc-no-stdlib",
]
[[package]]
name = "alloca"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e5a7d05ea6aea7e9e64d25b9156ba2fee3fdd659e34e41063cd2fc7cd020d7f4"
dependencies = [
"cc",
]
[[package]]
name = "anes"
version = "0.1.6"
@ -963,25 +972,24 @@ dependencies = [
[[package]]
name = "criterion"
version = "0.5.1"
version = "0.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f2b12d017a929603d80db1831cd3a24082f8137ce19c69e6447f54f5fc8d692f"
checksum = "950046b2aa2492f9a536f5f4f9a3de7b9e2476e575e05bd6c333371add4d98f3"
dependencies = [
"alloca",
"anes",
"cast",
"ciborium",
"clap",
"criterion-plot",
"is-terminal",
"itertools",
"num-traits",
"once_cell",
"oorandom",
"page_size",
"plotters",
"rayon",
"regex",
"serde",
"serde_derive",
"serde_json",
"tinytemplate",
"walkdir",
@ -989,9 +997,9 @@ dependencies = [
[[package]]
name = "criterion-plot"
version = "0.5.0"
version = "0.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1"
checksum = "d8d80a2f4f5b554395e47b5d8305bc3d27813bacb73493eb1001e8f76dae29ea"
dependencies = [
"cast",
"itertools",
@ -1845,17 +1853,6 @@ version = "2.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2"
[[package]]
name = "is-terminal"
version = "0.4.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3640c1c38b8e4e43584d8df18be5fc6b0aa314ce6ebf51b53313d4306cca8e46"
dependencies = [
"hermit-abi",
"libc",
"windows-sys 0.61.2",
]
[[package]]
name = "is_terminal_polyfill"
version = "1.70.2"
@ -1864,9 +1861,9 @@ checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695"
[[package]]
name = "itertools"
version = "0.10.5"
version = "0.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473"
checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186"
dependencies = [
"either",
]
@ -2170,6 +2167,16 @@ dependencies = [
"vcpkg",
]
[[package]]
name = "page_size"
version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "30d5b2194ed13191c1999ae0704b7839fb18384fa22e49b57eeaa97d79ce40da"
dependencies = [
"libc",
"winapi",
]
[[package]]
name = "parking_lot"
version = "0.12.5"

View File

@ -142,7 +142,7 @@ actix-web = "4"
awc = { version = "3", default-features = false, features = ["openssl"] }
async-stream = "0.3"
criterion = { version = "0.5", features = ["html_reports"] }
criterion = { version = "0.8", features = ["html_reports"] }
divan = "0.1.8"
env_logger = "0.11"
futures-util = { version = "0.3.17", default-features = false, features = ["alloc"] }

View File

@ -1,8 +1,8 @@
use std::convert::Infallible;
use std::{convert::Infallible, hint::black_box};
use actix_http::{encoding::Encoder, ContentEncoding, Request, Response, StatusCode};
use actix_service::{fn_service, Service as _};
use criterion::{black_box, criterion_group, criterion_main, Criterion};
use criterion::{criterion_group, criterion_main, Criterion};
static BODY: &[u8] = include_bytes!("../Cargo.toml");

View File

@ -30,7 +30,7 @@ serde = "1"
tracing = { version = "0.1.30", default-features = false, features = ["log"] }
[dev-dependencies]
criterion = { version = "0.5", features = ["html_reports"] }
criterion = { version = "0.8", features = ["html_reports"] }
http = "0.2.7"
percent-encoding = "2.1"
serde = { version = "1", features = ["derive"] }

View File

@ -1,6 +1,6 @@
use std::{borrow::Cow, fmt::Write as _};
use std::{borrow::Cow, fmt::Write as _, hint::black_box};
use criterion::{black_box, criterion_group, criterion_main, Criterion};
use criterion::{criterion_group, criterion_main, Criterion};
fn compare_quoters(c: &mut Criterion) {
let mut group = c.benchmark_group("Compare Quoters");

View File

@ -1,6 +1,8 @@
//! Based on https://github.com/ibraheemdev/matchit/blob/master/benches/bench.rs
use criterion::{black_box, criterion_group, criterion_main, Criterion};
use std::hint::black_box;
use criterion::{criterion_group, criterion_main, Criterion};
macro_rules! register {
(colon) => {{

View File

@ -176,7 +176,7 @@ awc = { version = "3", features = ["openssl"] }
brotli = "8"
const-str = "1.1"
core_affinity = "0.8"
criterion = { version = "0.5", features = ["html_reports"] }
criterion = { version = "0.8", features = ["html_reports"] }
env_logger = "0.11"
flate2 = "1.0.13"
futures-util = { version = "0.3.17", default-features = false, features = ["std"] }

View File

@ -2,16 +2,24 @@
extern crate tls_openssl as openssl;
use std::sync::{
atomic::{AtomicUsize, Ordering},
Arc,
use std::{
convert::Infallible,
sync::{
atomic::{AtomicBool, AtomicUsize, Ordering},
Arc,
},
};
use actix_http::HttpService;
use actix_http::{HttpService, Request, Response};
use actix_http_test::test_server;
use actix_service::{fn_service, map_config, ServiceFactoryExt};
use actix_utils::future::ok;
use actix_web::{dev::AppConfig, http::Version, web, App, HttpResponse};
use actix_web::{
dev::AppConfig,
http::{header, Version},
web, App, HttpResponse,
};
use futures_util::stream;
use openssl::{
pkey::PKey,
ssl::{SslAcceptor, SslConnector, SslMethod, SslVerifyMode},
@ -92,3 +100,55 @@ async fn test_connection_reuse_h2() {
// one connection
assert_eq!(num.load(Ordering::Relaxed), 1);
}
// Regression test for https://github.com/actix/actix-web/issues/2305.
#[actix_rt::test]
async fn h2_streaming_body_does_not_send_transfer_encoding() {
let has_transfer_encoding = Arc::new(AtomicBool::new(false));
let has_transfer_encoding2 = Arc::clone(&has_transfer_encoding);
let srv = test_server(move || {
let has_transfer_encoding = Arc::clone(&has_transfer_encoding2);
HttpService::build()
.h2(move |req: Request| {
let has_transfer_encoding = Arc::clone(&has_transfer_encoding);
async move {
has_transfer_encoding.store(
req.head().headers.contains_key(header::TRANSFER_ENCODING),
Ordering::Relaxed,
);
Ok::<_, Infallible>(Response::ok())
}
})
.openssl(tls_config())
.map_err(|_| ())
})
.await;
// disable ssl verification
let mut builder = SslConnector::builder(SslMethod::tls()).unwrap();
builder.set_verify(SslVerifyMode::NONE);
let _ = builder
.set_alpn_protos(b"\x02h2\x08http/1.1")
.map_err(|e| log::error!("Can not set alpn protocol: {:?}", e));
let client = awc::Client::builder()
.connector(awc::Connector::new().openssl(builder.build()))
.finish();
let response = client
.post(srv.surl("/"))
.version(Version::HTTP_2)
.send_stream(stream::once(async {
Ok::<_, Infallible>(bytes::Bytes::from_static(b"hello"))
}))
.await
.unwrap();
assert!(response.status().is_success());
assert_eq!(response.version(), Version::HTTP_2);
assert!(!has_transfer_encoding.load(Ordering::Relaxed));
}