2021-08-08 14:30:51 +02:00
|
|
|
use super::*;
|
2021-08-21 15:18:05 +02:00
|
|
|
use std::future::{pending, ready};
|
2021-10-24 19:33:03 +02:00
|
|
|
use tower::{timeout::TimeoutLayer, ServiceBuilder};
|
2021-08-08 14:30:51 +02:00
|
|
|
|
|
|
|
|
async fn unit() {}
|
|
|
|
|
|
|
|
|
|
async fn forever() {
|
|
|
|
|
pending().await
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn timeout() -> TimeoutLayer {
|
|
|
|
|
TimeoutLayer::new(Duration::from_millis(10))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[derive(Clone)]
|
|
|
|
|
struct Svc;
|
|
|
|
|
|
|
|
|
|
impl<R> Service<R> for Svc {
|
|
|
|
|
type Response = Response<Body>;
|
|
|
|
|
type Error = hyper::Error;
|
|
|
|
|
type Future = Ready<Result<Self::Response, Self::Error>>;
|
|
|
|
|
|
|
|
|
|
fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {
|
|
|
|
|
Poll::Ready(Ok(()))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn call(&mut self, _req: R) -> Self::Future {
|
|
|
|
|
ready(Ok(Response::new(Body::empty())))
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[tokio::test]
|
|
|
|
|
async fn handler() {
|
2021-08-19 22:37:48 +02:00
|
|
|
let app = Router::new().route(
|
2021-08-08 14:30:51 +02:00
|
|
|
"/",
|
2021-10-24 19:33:03 +02:00
|
|
|
get(forever.layer(
|
|
|
|
|
ServiceBuilder::new()
|
|
|
|
|
.layer(HandleErrorLayer::new(|_: BoxError| {
|
|
|
|
|
StatusCode::REQUEST_TIMEOUT
|
|
|
|
|
}))
|
|
|
|
|
.layer(timeout()),
|
|
|
|
|
)),
|
2021-08-08 14:30:51 +02:00
|
|
|
);
|
|
|
|
|
|
2021-09-19 11:38:34 +02:00
|
|
|
let client = TestClient::new(app);
|
2021-08-08 14:30:51 +02:00
|
|
|
|
2021-09-19 11:38:34 +02:00
|
|
|
let res = client.get("/").send().await;
|
2021-08-08 14:30:51 +02:00
|
|
|
assert_eq!(res.status(), StatusCode::REQUEST_TIMEOUT);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[tokio::test]
|
|
|
|
|
async fn handler_multiple_methods_first() {
|
2021-08-19 22:37:48 +02:00
|
|
|
let app = Router::new().route(
|
2021-08-08 14:30:51 +02:00
|
|
|
"/",
|
2021-10-24 19:33:03 +02:00
|
|
|
get(forever.layer(
|
|
|
|
|
ServiceBuilder::new()
|
|
|
|
|
.layer(HandleErrorLayer::new(|_: BoxError| {
|
|
|
|
|
StatusCode::REQUEST_TIMEOUT
|
|
|
|
|
}))
|
|
|
|
|
.layer(timeout()),
|
|
|
|
|
))
|
2021-08-08 14:30:51 +02:00
|
|
|
.post(unit),
|
|
|
|
|
);
|
|
|
|
|
|
2021-09-19 11:38:34 +02:00
|
|
|
let client = TestClient::new(app);
|
2021-08-08 14:30:51 +02:00
|
|
|
|
2021-09-19 11:38:34 +02:00
|
|
|
let res = client.get("/").send().await;
|
2021-08-08 14:30:51 +02:00
|
|
|
assert_eq!(res.status(), StatusCode::REQUEST_TIMEOUT);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[tokio::test]
|
|
|
|
|
async fn handler_multiple_methods_middle() {
|
2021-08-19 22:37:48 +02:00
|
|
|
let app = Router::new().route(
|
2021-08-08 14:30:51 +02:00
|
|
|
"/",
|
|
|
|
|
delete(unit)
|
|
|
|
|
.get(
|
2021-10-24 19:33:03 +02:00
|
|
|
forever.layer(
|
|
|
|
|
ServiceBuilder::new()
|
|
|
|
|
.layer(HandleErrorLayer::new(|_: BoxError| {
|
|
|
|
|
StatusCode::REQUEST_TIMEOUT
|
|
|
|
|
}))
|
|
|
|
|
.layer(timeout()),
|
|
|
|
|
),
|
2021-08-08 14:30:51 +02:00
|
|
|
)
|
|
|
|
|
.post(unit),
|
|
|
|
|
);
|
|
|
|
|
|
2021-09-19 11:38:34 +02:00
|
|
|
let client = TestClient::new(app);
|
2021-08-08 14:30:51 +02:00
|
|
|
|
2021-09-19 11:38:34 +02:00
|
|
|
let res = client.get("/").send().await;
|
2021-08-08 14:30:51 +02:00
|
|
|
assert_eq!(res.status(), StatusCode::REQUEST_TIMEOUT);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[tokio::test]
|
|
|
|
|
async fn handler_multiple_methods_last() {
|
2021-08-19 22:37:48 +02:00
|
|
|
let app = Router::new().route(
|
2021-08-08 14:30:51 +02:00
|
|
|
"/",
|
|
|
|
|
delete(unit).get(
|
2021-10-24 19:33:03 +02:00
|
|
|
forever.layer(
|
|
|
|
|
ServiceBuilder::new()
|
|
|
|
|
.layer(HandleErrorLayer::new(|_: BoxError| {
|
|
|
|
|
StatusCode::REQUEST_TIMEOUT
|
|
|
|
|
}))
|
|
|
|
|
.layer(timeout()),
|
|
|
|
|
),
|
2021-08-08 14:30:51 +02:00
|
|
|
),
|
|
|
|
|
);
|
|
|
|
|
|
2021-09-19 11:38:34 +02:00
|
|
|
let client = TestClient::new(app);
|
2021-08-08 14:30:51 +02:00
|
|
|
|
2021-09-19 11:38:34 +02:00
|
|
|
let res = client.get("/").send().await;
|
2021-08-08 14:30:51 +02:00
|
|
|
assert_eq!(res.status(), StatusCode::REQUEST_TIMEOUT);
|
|
|
|
|
}
|