rust_web_server/client_hint/
mod.rs

1#[cfg(test)]
2mod tests;
3
4use crate::header::Header;
5
6#[derive(PartialEq, Eq, Clone, Debug)]
7pub struct ClientHint;
8
9impl ClientHint {
10    pub const ACCEPT_CLIENT_HINTS: &'static str = "Accept-CH";
11    pub const CRITICAL_CLIENT_HINTS: &'static str = "Critical-CH";
12
13    pub const USER_AGENT_CPU_ARCHITECTURE: &'static str = "Sec-CH-UA-Arch";
14    pub const USER_AGENT_CPU_BITNESS: &'static str = "Sec-CH-UA-Bitness";
15    pub const USER_AGENT_FULL_BRAND_INFORMATION: &'static str = "Sec-CH-UA-Full-Version-List";
16    pub const USER_AGENT_DEVICE_MODEL: &'static str = "Sec-CH-UA-Model";
17    pub const USER_AGENT_OPERATING_SYSTEM_VERSION: &'static str = "Sec-CH-UA-Platform-Version";
18    pub const NETWORK_DOWNLOAD_SPEED: &'static str = "Downlink"; // (Mbps)
19    pub const NETWORK_EFFECTIVE_CONNECTION_TYPE: &'static str = "ECT"; // (2g/3g/4g)
20    pub const NETWORK_ROUND_TRIP_TIME: &'static str = "RTT"; // (in ms, includes server processing time)
21    pub const NETWORK_SAVE_DATA: &'static str = "Save-Data";
22    pub const DEVICE_MEMORY: &'static str = "Device-Memory";
23    pub const PREFERS_REDUCED_MOTION: &'static str = "Sec-CH-Prefers-Reduced-Motion";
24    pub const PREFERS_COLOR_SCHEME: &'static str = "Sec-CH-Prefers-Color-Scheme";
25
26    pub fn get_client_hint_list() -> String {
27        let hint_list = [
28            ClientHint::USER_AGENT_CPU_ARCHITECTURE,
29            ClientHint::USER_AGENT_CPU_BITNESS,
30            ClientHint::USER_AGENT_FULL_BRAND_INFORMATION,
31            ClientHint::USER_AGENT_DEVICE_MODEL,
32            ClientHint::USER_AGENT_OPERATING_SYSTEM_VERSION,
33            ClientHint::NETWORK_DOWNLOAD_SPEED,
34            ClientHint::NETWORK_EFFECTIVE_CONNECTION_TYPE,
35            ClientHint::NETWORK_ROUND_TRIP_TIME,
36            ClientHint::NETWORK_SAVE_DATA,
37            ClientHint::DEVICE_MEMORY,
38            ClientHint::PREFERS_REDUCED_MOTION,
39            ClientHint::PREFERS_COLOR_SCHEME,
40        ];
41        let hint_header_value = hint_list.join(", ");
42        hint_header_value
43    }
44
45    pub fn get_accept_client_hints_header() -> Header {
46        let hint_header_value = ClientHint::get_client_hint_list();
47        let header = Header { name: ClientHint::ACCEPT_CLIENT_HINTS.to_string(), value: hint_header_value.to_string() };
48        header
49    }
50
51    pub fn get_critical_client_hints_header() -> Header {
52        let hint_header_value = ClientHint::get_client_hint_list();
53        let header = Header { name: ClientHint::CRITICAL_CLIENT_HINTS.to_string(), value: hint_header_value.to_string() };
54        header
55    }
56
57    pub fn get_vary_header_value() -> String {
58        let hint_list = [
59            ClientHint::USER_AGENT_CPU_ARCHITECTURE,
60            ClientHint::USER_AGENT_CPU_BITNESS,
61            ClientHint::USER_AGENT_FULL_BRAND_INFORMATION,
62            ClientHint::USER_AGENT_DEVICE_MODEL,
63            ClientHint::USER_AGENT_OPERATING_SYSTEM_VERSION,
64            ClientHint::NETWORK_SAVE_DATA,
65            ClientHint::DEVICE_MEMORY,
66            Header::_UPGRADE_INSECURE_REQUESTS,
67            ClientHint::PREFERS_REDUCED_MOTION,
68            ClientHint::PREFERS_COLOR_SCHEME,
69        ];
70        let vary_client_hint = hint_list.join(", ");
71        vary_client_hint
72    }
73
74}