tower_async_http/cors/
vary.rs

1use std::array;
2
3use http::{header::HeaderName, HeaderValue};
4
5use super::preflight_request_headers;
6
7/// Holds configuration for how to set the [`Vary`][mdn] header.
8///
9/// See [`CorsLayer::vary`] for more details.
10///
11/// [mdn]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Vary
12/// [`CorsLayer::vary`]: super::CorsLayer::vary
13#[derive(Clone, Debug)]
14pub struct Vary(Vec<HeaderValue>);
15
16impl Vary {
17    /// Set the list of header names to return as vary header values
18    ///
19    /// See [`CorsLayer::vary`] for more details.
20    ///
21    /// [`CorsLayer::vary`]: super::CorsLayer::vary
22    pub fn list<I>(headers: I) -> Self
23    where
24        I: IntoIterator<Item = HeaderName>,
25    {
26        Self(headers.into_iter().map(Into::into).collect())
27    }
28
29    pub(super) fn values(&self) -> impl Iterator<Item = HeaderValue> + '_ {
30        self.0.iter().cloned()
31    }
32}
33
34impl Default for Vary {
35    fn default() -> Self {
36        Self::list(preflight_request_headers())
37    }
38}
39
40impl<const N: usize> From<[HeaderName; N]> for Vary {
41    fn from(arr: [HeaderName; N]) -> Self {
42        #[allow(deprecated)] // Can be changed when MSRV >= 1.53
43        Self::list(array::IntoIter::new(arr))
44    }
45}
46
47impl From<Vec<HeaderName>> for Vary {
48    fn from(vec: Vec<HeaderName>) -> Self {
49        Self::list(vec)
50    }
51}