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
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)
|
|
}); |