Skip to content

Commit 51caa87

Browse files
committed
fix(tests): handle timeout layer without breaking subsequent requests
1 parent 9ef8208 commit 51caa87

2 files changed

Lines changed: 47 additions & 5 deletions

File tree

Cargo.toml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,7 @@ clap = "4.6.1"
208208
const-oid = "0.10"
209209
cookie = "0.18.1"
210210
criterion = "0.8.2"
211-
cucumber = "0.22.1"
211+
cucumber = "0.23.0"
212212
der = "0.8.0"
213213
digest = "0.11.2"
214214
encoding_rs = "0.8.35"
@@ -235,7 +235,7 @@ hyper = "1.8.1"
235235
hyper-util = "0.1.20"
236236
ipnet = "2.12.0"
237237
js-sys = "0.3.91"
238-
libc = "0.2.185"
238+
libc = "0.2.186"
239239
md-5 = "0.11.0"
240240
memchr = "2.8.0"
241241
mime = "0.3.17"
@@ -254,10 +254,10 @@ pretty_env_logger = "0.5.0"
254254
proptest = "1.6.0"
255255
quick-xml = "0.39.2"
256256
rand = "0.10.1"
257-
rustls = "0.23.38"
257+
rustls = "0.23.39"
258258
rustls-native-certs = "0.8.3"
259259
rustls-pemfile = "2.2.0"
260-
rustls-pki-types = "1.14.0"
260+
rustls-pki-types = "1.14.1"
261261
rustyline = "18.0.0"
262262
scc = "3.7.0"
263263
schnellru = "0.2.4"

crates/hpx/tests/layers.rs

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
11
mod support;
22

3-
use std::time::Duration;
3+
use std::{
4+
sync::{
5+
Arc,
6+
atomic::{AtomicUsize, Ordering},
7+
},
8+
time::Duration,
9+
};
410

511
use futures_util::future::join_all;
612
use hpx::{Body, Client, ClientResponseBody};
@@ -156,6 +162,42 @@ async fn with_connect_timeout_layer_slow() {
156162
assert!(err.is_timeout());
157163
}
158164

165+
#[tokio::test]
166+
async fn timeout_layer_does_not_break_follow_up_requests() {
167+
let _ = env_logger::try_init();
168+
169+
let request_count = Arc::new(AtomicUsize::new(0));
170+
let server_count = Arc::clone(&request_count);
171+
let server = server::http(move |_req| {
172+
let server_count = Arc::clone(&server_count);
173+
async move {
174+
let current = server_count.fetch_add(1, Ordering::SeqCst);
175+
if current == 0 {
176+
tokio::time::sleep(Duration::from_millis(200)).await;
177+
}
178+
179+
http::Response::new(hpx::Body::from(format!("response-{current}")))
180+
}
181+
});
182+
183+
let url = format!("http://{}/slow", server.addr());
184+
185+
let client = Client::builder()
186+
.layer(TimeoutLayer::new(Duration::from_millis(50)))
187+
.no_proxy()
188+
.build()
189+
.unwrap();
190+
191+
let first_err = client.get(&url).send().await.unwrap_err();
192+
assert!(first_err.is_timeout());
193+
194+
let second = client.get(&url).send().await.unwrap();
195+
let body = second.text().await.unwrap();
196+
197+
assert_eq!(body, "response-1");
198+
assert_eq!(request_count.load(Ordering::SeqCst), 2);
199+
}
200+
159201
#[tokio::test]
160202
async fn multiple_timeout_layers_under_threshold() {
161203
let _ = env_logger::try_init();

0 commit comments

Comments
 (0)