use std::collections::HashSet;
use std::sync::LazyLock;
const S3_FILTERED_QUERY_PARAMS: &[&str] = &[
"X-Amz-Algorithm",
"X-Amz-Credential",
"X-Amz-Date",
"X-Amz-Expires",
"X-Amz-SignedHeaders",
"X-Amz-Signature",
"X-Amz-Security-Token",
"X-Amz-User-Agent",
];
const GCS_FILTERED_QUERY_PARAMS: &[&str] = &[
"X-Goog-Algorithm",
"X-Goog-Credential",
"X-Goog-Date",
"X-Goog-Expires",
"X-Goog-SignedHeaders",
"X-Goog-Signature",
];
const OSS_FILTERED_QUERY_PARAMS: &[&str] =
&["OSSAccessKeyId", "Expires", "Signature", "SecurityToken"];
const OBS_FILTERED_QUERY_PARAMS: &[&str] = &[
"AccessKeyId",
"Signature",
"Expires",
"X-Obs-Date",
"X-Obs-Security-Token",
];
const COS_FILTERED_QUERY_PARAMS: &[&str] = &[
"q-sign-algorithm",
"q-ak",
"q-sign-time",
"q-key-time",
"q-header-list",
"q-url-param-list",
"q-signature",
"x-cos-security-token",
];
const CONTAINERD_FILTERED_QUERY_PARAMS: &[&str] = &["ns"];
static DEFAULT_PROXY_RULE_FILTERED_QUERY_PARAMS: LazyLock<Vec<String>> = LazyLock::new(|| {
let mut visited = HashSet::new();
let mut params = Vec::new();
for query_param in [
S3_FILTERED_QUERY_PARAMS,
GCS_FILTERED_QUERY_PARAMS,
OSS_FILTERED_QUERY_PARAMS,
OBS_FILTERED_QUERY_PARAMS,
COS_FILTERED_QUERY_PARAMS,
CONTAINERD_FILTERED_QUERY_PARAMS,
]
.concat()
{
if visited.insert(query_param) {
params.push(query_param.to_string());
}
}
params
});
#[inline]
pub fn default_proxy_rule_filtered_query_params() -> Vec<String> {
DEFAULT_PROXY_RULE_FILTERED_QUERY_PARAMS.clone()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn default_proxy_rule_filtered_query_params_unions_protocols_once() {
let params = default_proxy_rule_filtered_query_params();
let unique_params: HashSet<&str> = params.iter().map(|param| param.as_str()).collect();
let expected: HashSet<&str> = [
S3_FILTERED_QUERY_PARAMS,
GCS_FILTERED_QUERY_PARAMS,
OSS_FILTERED_QUERY_PARAMS,
OBS_FILTERED_QUERY_PARAMS,
COS_FILTERED_QUERY_PARAMS,
CONTAINERD_FILTERED_QUERY_PARAMS,
]
.concat()
.into_iter()
.collect();
assert_eq!(unique_params.len(), params.len());
assert_eq!(unique_params, expected);
}
}