- main
- manifest
- deps
- main
- Install
- Run
use std::vec::Vec;
use fastly::{Error, Request, Response};
#[fastly::main]
fn main(mut req: Request) -> Result<Response, Error> {
let qs: Vec<(String, String)> = req.get_query().unwrap();
let keep = vec!["query", "page", "foo"];
let mut qs = filter_except(qs, &keep);
for item in &mut qs {
if &item.0 == "query" {
item.1 = item.1.to_lowercase();
}
}
qs.sort_by(|a, b| a.0.cmp(&b.0));
let encoded_query = qs.iter()
.map(|(name, value)| format!("{}={}", name, value))
.collect::<Vec<String>>()
.join("&");
req.set_query_str(&encoded_query);
req.remove_header("user-agent");
req.remove_header("cookie");
let lang_accept = vec!["en", "de", "fr", "nl"];
let lang_default = "de";
let lang_norm = norm_accept(req.get_header_str("accept-language").unwrap_or(""), &lang_accept, lang_default);
req.set_header("accept-language", lang_norm);
let encoding_accept = vec!["br", "compress", "deflate", "gzip"];
let encoding_default = "identity";
let encoding_norm = norm_accept(req.get_header_str("accept-encoding").unwrap_or(""), &encoding_accept, encoding_default);
req.set_header("accept-encoding", encoding_norm);
let charset_accept = vec!["iso-8859-5", "iso-8859-2", "utf-8"];
let charset_default = "utf-8";
let charset_norm = norm_accept(req.get_header_str("accept-charset").unwrap_or(""), &charset_accept, charset_default);
req.set_header("accept-charset", charset_norm);
Ok(req.send("origin_0")?)
}
fn norm_accept(input: &str, accept: &[&str], def: &str) -> String {
for val in accept {
if input.contains(val) {
return val.to_string();
}
}
def.to_string()
}
fn filter_except(qs: Vec<(String, String)>, f: &[&str]) -> Vec<(String, String)> {
qs.into_iter() .filter(|(k, _)| f.contains(&k.as_str())) .collect()
}