diff --git a/tower-http/src/set_header/mod.rs b/tower-http/src/set_header/mod.rs index bce11e1a7..f62b489b2 100644 --- a/tower-http/src/set_header/mod.rs +++ b/tower-http/src/set_header/mod.rs @@ -157,7 +157,7 @@ impl fmt::Debug for BoxedMakeHeaderValue { } /// Metadata describing a request or response header to be set. -#[derive(Clone, Debug)] +#[derive(Debug)] pub struct HeaderMetadata { /// The name of the header to set. header_name: HeaderName, @@ -165,6 +165,15 @@ pub struct HeaderMetadata { make: BoxedMakeHeaderValue, } +impl Clone for HeaderMetadata { + fn clone(&self) -> Self { + Self { + header_name: self.header_name.clone(), + make: self.make.clone(), + } + } +} + impl HeaderMetadata { /// Create a new HeaderMetadata with the given header name and value factory. fn new + Clone + 'static + Send + Sync>( diff --git a/tower-http/src/set_header/request/multiple_headers.rs b/tower-http/src/set_header/request/multiple_headers.rs index b2e287e4f..fcc0e53df 100644 --- a/tower-http/src/set_header/request/multiple_headers.rs +++ b/tower-http/src/set_header/request/multiple_headers.rs @@ -15,11 +15,18 @@ use crate::set_header::{HeaderInsertionConfig, HeaderMetadata, InsertHeaderMode} /// Layer that applies [`SetMultipleRequestHeader`] which adds multiple request headers. /// /// See [`SetMultipleRequestHeader`] for more details. -#[derive(Clone)] pub struct SetMultipleRequestHeadersLayer { headers: Vec>, } +impl Clone for SetMultipleRequestHeadersLayer { + fn clone(&self) -> Self { + Self { + headers: self.headers.clone(), + } + } +} + impl fmt::Debug for SetMultipleRequestHeadersLayer { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_struct("SetMultipleRequestHeadersLayer") @@ -84,12 +91,23 @@ impl Layer for SetMultipleRequestHeadersLayer { } /// Middleware that sets multiple headers on the request. -#[derive(Clone)] pub struct SetMultipleRequestHeader { inner: S, headers: Vec>, } +impl Clone for SetMultipleRequestHeader +where + S: Clone, +{ + fn clone(&self) -> Self { + Self { + inner: self.inner.clone(), + headers: self.headers.clone(), + } + } +} + impl SetMultipleRequestHeader { /// Create a new [`SetMultipleRequestHeader`]. /// @@ -361,4 +379,18 @@ mod tests { let debug_str = format!("{:?}", layer); assert!(debug_str.contains("SetMultipleRequestHeadersLayer")); } + + #[test] + fn test_service_clone() { + struct NonCloneBody; + let svc = tower::ServiceBuilder::new() + .layer(SetMultipleRequestHeadersLayer::>::overriding(vec![])) + .check_clone() + .service(service_fn(|_: Request| async move { + Ok::<_, Infallible>(Response::new(NonCloneBody)) + })); + + fn check_service_and_clone> + Clone>(_: T) {} + check_service_and_clone(svc); + } }