Skip to main content

ordinary_config/http/
mod.rs

1// Copyright (C) 2026 The Ordinary Authors.
2//
3// SPDX-License-Identifier: BSD-3-Clause
4
5mod cache;
6mod cors;
7mod csp;
8
9use crate::{MiddlewareConfig, ProxyConfig, Redirects};
10pub use cache::*;
11pub use cors::*;
12pub use csp::*;
13use serde::{Deserialize, Serialize};
14use std::fmt::Formatter;
15
16#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
17#[cfg_attr(feature = "docs", derive(schemars::JsonSchema))]
18#[derive(Deserialize, Serialize, Debug, Clone, Default)]
19pub struct HttpConfig {
20    /// routes for request handling
21    #[serde(skip_serializing_if = "Option::is_none")]
22    #[serde(default)]
23    pub routes: Option<Vec<HttpRoute>>,
24
25    /// configuration of internal redirects
26    #[serde(skip_serializing_if = "Option::is_none")]
27    #[serde(default)]
28    pub redirects: Option<Redirects>,
29
30    /// configuration of proxied services
31    #[serde(skip_serializing_if = "Option::is_none")]
32    #[serde(default)]
33    pub proxies: Option<Vec<ProxyConfig>>,
34
35    /// list of middleware configurations that can be applied
36    /// to templates, assets, functions and proxies
37    #[serde(skip_serializing_if = "Option::is_none")]
38    #[serde(default)]
39    pub middlewares: Option<Vec<MiddlewareConfig>>,
40
41    /// default route config that all can extend from
42    #[serde(skip_serializing_if = "Option::is_none")]
43    #[serde(default)]
44    pub default_route_config: Option<HttpRouteConfig>,
45}
46
47#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
48#[cfg_attr(feature = "docs", derive(schemars::JsonSchema))]
49#[derive(Deserialize, Serialize, Debug, Clone)]
50pub struct HttpRoute {
51    /// Name of the function that will handle incoming requests.
52    pub function: String,
53    /// Path for the HTTP route (must start with leading "/").
54    pub path: String,
55    /// HTTP method for this route.
56    pub method: HttpMethod,
57    #[serde(skip_serializing_if = "Option::is_none")]
58    #[serde(default)]
59    pub config: Option<HttpRouteConfig>,
60    #[serde(skip_serializing_if = "Option::is_none")]
61    #[serde(default)]
62    pub middlewares: Option<Vec<String>>,
63}
64
65#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
66#[cfg_attr(feature = "docs", derive(schemars::JsonSchema))]
67#[derive(Deserialize, Serialize, Debug, Clone, Default)]
68pub struct HttpRouteConfig {
69    /// HTTP Content Security Policy configuration.
70    ///
71    /// <https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/CSP>
72    ///
73    /// "Base" defaults to `default-src 'self';` and tacks on SHA-256 integrity
74    /// hashes for all inlined scripts and styles (generated at build time) to
75    /// `script-src 'self' sha256-b64` and `style-src 'self' sha256-b64`, respectively.
76    ///
77    /// `https:` is used when not running in `--insecure` mode.
78    #[serde(skip_serializing_if = "Option::is_none")]
79    #[serde(default)]
80    pub csp: Option<HttpCsp>,
81    #[serde(skip_serializing_if = "Option::is_none")]
82    #[serde(default)]
83    pub cors: Option<HttpCors>,
84    #[serde(skip_serializing_if = "Option::is_none")]
85    #[serde(default)]
86    pub cache: Option<HttpCache>,
87    /// Default request timeout.
88    ///
89    /// Unit (seconds).
90    #[serde(skip_serializing_if = "Option::is_none")]
91    #[serde(default)]
92    pub timeout: Option<u16>,
93}
94
95#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
96#[cfg_attr(feature = "docs", derive(schemars::JsonSchema))]
97#[derive(Deserialize, Serialize, Debug, Clone)]
98pub enum HttpMethod {
99    PUT,
100    POST,
101    PATCH,
102    QUERY,
103    GET,
104    DELETE,
105    Other(String),
106}
107
108impl std::fmt::Display for HttpMethod {
109    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
110        match self {
111            Self::GET => write!(f, "GET"),
112
113            _ => Ok(()),
114        }
115    }
116}