1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
4pub struct HttpConfig {
5 pub session: SessionConfig,
6 pub session_cookie: CookieConfig,
7 pub flash_cookie: CookieConfig,
8 pub csrf: CsrfConfig,
9}
10
11#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
12pub struct SessionConfig {
13 pub store: SessionStore,
14 pub idle_timeout_secs: u64,
15 pub absolute_timeout_secs: u64,
16}
17
18#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
19#[serde(rename_all = "snake_case")]
20pub enum SessionStore {
21 Memory,
22 Database,
23 Redis,
24 Valkey,
25}
26
27#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
28pub struct CookieConfig {
29 pub name: String,
30 #[serde(default)]
31 pub domain: Option<String>,
32 #[serde(default = "default_cookie_path")]
33 pub path: String,
34 pub same_site: SameSitePolicy,
35 #[serde(default = "default_true")]
36 pub secure: bool,
37 #[serde(default = "default_true")]
38 pub http_only: bool,
39 #[serde(default)]
40 pub protection: CookieProtection,
41}
42
43#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
44#[serde(rename_all = "snake_case")]
45pub enum SameSitePolicy {
46 Lax,
47 Strict,
48 None,
49}
50
51#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, Default)]
52#[serde(rename_all = "snake_case")]
53pub enum CookieProtection {
54 #[default]
55 Signed,
56 Encrypted,
57}
58
59#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
60pub struct CsrfConfig {
61 pub enabled: bool,
62 pub field_name: String,
63 pub header_name: String,
64}
65
66fn default_cookie_path() -> String {
67 "/".to_string()
68}
69
70fn default_true() -> bool {
71 true
72}