Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 10 additions & 1 deletion tower-http/src/set_header/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -157,14 +157,23 @@ impl<T> fmt::Debug for BoxedMakeHeaderValue<T> {
}

/// Metadata describing a request or response header to be set.
#[derive(Clone, Debug)]
#[derive(Debug)]
pub struct HeaderMetadata<T> {
/// The name of the header to set.
header_name: HeaderName,
/// The value or value factory for the header.
make: BoxedMakeHeaderValue<T>,
}

impl<T> Clone for HeaderMetadata<T> {
fn clone(&self) -> Self {
Self {
header_name: self.header_name.clone(),
make: self.make.clone(),
}
}
}

impl<T> HeaderMetadata<T> {
/// Create a new HeaderMetadata with the given header name and value factory.
fn new<M: MakeHeaderValue<T> + Clone + 'static + Send + Sync>(
Expand Down
36 changes: 34 additions & 2 deletions tower-http/src/set_header/request/multiple_headers.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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<M> {
headers: Vec<HeaderInsertionConfig<M>>,
}

impl<M> Clone for SetMultipleRequestHeadersLayer<M> {
fn clone(&self) -> Self {
Self {
headers: self.headers.clone(),
}
}
}

impl<M> fmt::Debug for SetMultipleRequestHeadersLayer<M> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("SetMultipleRequestHeadersLayer")
Expand Down Expand Up @@ -84,12 +91,23 @@ impl<S, M> Layer<S> for SetMultipleRequestHeadersLayer<M> {
}

/// Middleware that sets multiple headers on the request.
#[derive(Clone)]
pub struct SetMultipleRequestHeader<S, M> {
inner: S,
headers: Vec<HeaderInsertionConfig<M>>,
}

impl<S, M> Clone for SetMultipleRequestHeader<S, M>
where
S: Clone,
{
fn clone(&self) -> Self {
Self {
inner: self.inner.clone(),
headers: self.headers.clone(),
}
}
}

impl<S, M> SetMultipleRequestHeader<S, M> {
/// Create a new [`SetMultipleRequestHeader`].
///
Expand Down Expand Up @@ -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::<Request<NonCloneBody>>::overriding(vec![]))
.check_clone()
.service(service_fn(|_: Request<NonCloneBody>| async move {
Ok::<_, Infallible>(Response::new(NonCloneBody))
}));

fn check_service_and_clone<T: Service<Request<NonCloneBody>> + Clone>(_: T) {}
check_service_and_clone(svc);
}
}
Loading