Want to contribute? Fork me on Codeberg.org!
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

30 lines
849 B

use std::convert::Infallible;
use rocket::{
request::{self, FromRequest},
Request,
};
macro_rules! header {
($name:ident, $header:expr) => {
header!($name, $header, String, |header| header.to_owned());
};
($name:ident, $header:expr, $type:ty, $handler:expr) => {
pub struct $name(pub Option<$type>);
#[rocket::async_trait]
impl<'r> FromRequest<'r> for $name {
type Error = Infallible;
async fn from_request(req: &'r Request<'_>) -> request::Outcome<Self, Self::Error> {
let header = req.headers().get_one($header);
request::Outcome::Success(Self(header.map($handler)))
}
}
};
}
header!(Referer, "Referer");
header!(AcceptLanguage, "Accept-Language", Vec<String>, |header| {
accept_language::parse(header)
});