http_types/cache/cache_control/
mod.rs

1//! HTTP `Cache-Control` headers.
2//!
3//! # Specifications
4//!
5//! - [RFC 8246: HTTP Immutable Responses](https://tools.ietf.org/html/rfc8246)
6//! - [RFC 7234: Hypertext Transfer Protocol (HTTP/1.1): Caching](https://tools.ietf.org/html/rfc7234)
7//! - [RFC 5861: HTTP Cache-Control Extensions for Stale Content](https://tools.ietf.org/html/rfc5861)
8
9#[allow(clippy::module_inception)]
10mod cache_control;
11mod cache_directive;
12
13pub use cache_control::CacheControl;
14pub use cache_directive::CacheDirective;
15
16#[cfg(test)]
17mod test {
18    use super::*;
19    use crate::headers::{Headers, CACHE_CONTROL};
20
21    #[test]
22    fn smoke() -> crate::Result<()> {
23        let mut entries = CacheControl::new();
24        entries.push(CacheDirective::Immutable);
25        entries.push(CacheDirective::NoStore);
26
27        let mut headers = Headers::new();
28        entries.apply(&mut headers);
29
30        let entries = CacheControl::from_headers(headers)?.unwrap();
31        let mut entries = entries.iter();
32        assert_eq!(entries.next().unwrap(), &CacheDirective::Immutable);
33        assert_eq!(entries.next().unwrap(), &CacheDirective::NoStore);
34        Ok(())
35    }
36
37    #[test]
38    fn ignore_unkonwn_directives() -> crate::Result<()> {
39        let mut headers = Headers::new();
40        headers.insert(CACHE_CONTROL, "barrel_roll");
41        let entries = CacheControl::from_headers(headers)?.unwrap();
42        let mut entries = entries.iter();
43        assert!(entries.next().is_none());
44        Ok(())
45    }
46
47    #[test]
48    fn bad_request_on_parse_error() {
49        let mut headers = Headers::new();
50        headers.insert(CACHE_CONTROL, "min-fresh=0.9"); // floats are not supported
51        let err = CacheControl::from_headers(headers).unwrap_err();
52        assert_eq!(err.status(), 400);
53    }
54}