use crate::{Flag, OptionalDuration, OptionalInteger, OptionalString};
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct Gateway {
#[serde(default, rename = "HTTPHeaders")]
pub http_headers: HashMap<String, Vec<String>>,
#[serde(default)]
pub root_redirect: String,
#[serde(default)]
pub no_fetch: bool,
#[serde(default, rename = "NoDNSLink")]
pub no_dns_link: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub deserialized_responses: Option<Flag>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
rename = "DisableHTMLErrors"
)]
pub disable_html_errors: Option<Flag>,
#[serde(default)]
pub public_gateways: HashMap<String, GatewaySpec>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
rename = "ExposeRoutingAPI"
)]
pub expose_routing_api: Option<Flag>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub retrieval_timeout: Option<OptionalDuration>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub max_concurrent_requests: Option<OptionalInteger>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub max_range_request_file_size: Option<OptionalString>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
rename = "DiagnosticServiceURL"
)]
pub diagnostic_service_url: Option<OptionalString>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct GatewaySpec {
#[serde(default)]
pub paths: Vec<String>,
#[serde(default)]
pub use_subdomains: bool,
#[serde(default, rename = "NoDNSLink")]
pub no_dns_link: bool,
#[serde(
default,
skip_serializing_if = "Option::is_none",
rename = "InlineDNSLink"
)]
pub inline_dns_link: Option<Flag>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub deserialized_responses: Option<Flag>,
}
impl Gateway {
pub fn default_paths() -> Vec<String> {
vec!["/ipfs".to_string(), "/ipns".to_string()]
}
pub fn default_http_headers() -> HashMap<String, Vec<String>> {
let mut headers = HashMap::new();
headers.insert(
"Access-Control-Allow-Origin".to_string(),
vec!["*".to_string()],
);
headers.insert(
"Access-Control-Allow-Methods".to_string(),
vec!["GET".to_string()],
);
headers.insert(
"Access-Control-Allow-Headers".to_string(),
vec![
"X-Requested-With".to_string(),
"Range".to_string(),
"User-Agent".to_string(),
],
);
headers.insert(
"Access-Control-Expose-Headers".to_string(),
vec![
"Content-Range".to_string(),
"X-Chunked-Output".to_string(),
"X-Stream-Output".to_string(),
],
);
headers
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_gateway_default() {
let gw = Gateway::default();
assert!(gw.http_headers.is_empty());
assert!(!gw.no_fetch);
}
#[test]
fn test_default_paths() {
let paths = Gateway::default_paths();
assert!(paths.contains(&"/ipfs".to_string()));
assert!(paths.contains(&"/ipns".to_string()));
}
#[test]
fn test_default_headers() {
let headers = Gateway::default_http_headers();
assert!(headers.contains_key("Access-Control-Allow-Origin"));
}
}