diff --git a/src/server.rs b/src/server.rs index 1e6f8c1a..356b7320 100644 --- a/src/server.rs +++ b/src/server.rs @@ -188,6 +188,14 @@ where self } + /// Reset the middleware chain for the current server, if any. + pub fn reset_middleware(&mut self) -> &mut Self { + let m = Arc::get_mut(&mut self.middleware) + .expect("Registering middleware is not possible after the Server has started"); + m.clear(); + self + } + /// Asynchronously serve the app with the supplied listener. /// /// This is a shorthand for calling `Server::bind`, logging the `ListenInfo` diff --git a/tests/route_middleware.rs b/tests/route_middleware.rs index ba89a15d..47a06310 100644 --- a/tests/route_middleware.rs +++ b/tests/route_middleware.rs @@ -128,3 +128,24 @@ async fn subroute_not_nested() -> tide::Result<()> { assert_eq!(res["x-child"], "child"); Ok(()) } + +#[async_std::test] +async fn app_middleware_reset() -> tide::Result<()> { + let mut app = tide::new(); + app.at("/") + .with(TestMiddleware::with_header_name("X-Root", "root")) + .get(echo_path); + app.reset_middleware(); + app.at("/foo") + .with(TestMiddleware::with_header_name("X-Foo", "foo")) + .get(echo_path); + + let res = app.get("/foo").await?; + assert!(res.header("X-Root").is_none()); + assert_eq!(res["X-Foo"], "foo"); + + let res = app.get("/").await?; + assert!(res.header("X-Foo").is_none()); + assert_eq!(res["X-Root"], "root"); + Ok(()) +}