use crate::*;
pub(crate) fn referer_macro(
attr: TokenStream,
item: TokenStream,
position: Position,
) -> TokenStream {
let multi_referer: MultiRefererData = parse_macro_input!(attr as MultiRefererData);
inject(position, item, |context: &Ident, _: &Ident| {
let statements = multi_referer.referer_values.iter().map(|referer_value| {
quote! {
let referer: Option<::hyperlane::RequestHeadersValueItem> = #context.get_request().try_get_header_back(::hyperlane::REFERER);
if let Some(referer_header) = referer {
if referer_header != #referer_value {
return ::hyperlane::Status::Reject;
}
} else {
return ::hyperlane::Status::Reject;
}
}
});
quote! {
#(#statements)*
}
})
}
pub(crate) fn reject_referer_macro(
attr: TokenStream,
item: TokenStream,
position: Position,
) -> TokenStream {
let multi_referer: MultiRefererData = parse_macro_input!(attr as MultiRefererData);
inject(position, item, |context: &Ident, _: &Ident| {
let statements = multi_referer.referer_values.iter().map(|referer_value| {
quote! {
let referer: Option<::hyperlane::RequestHeadersValueItem> = #context.get_request().try_get_header_back(::hyperlane::REFERER);
if let Some(referer_header) = referer {
if referer_header == #referer_value {
return ::hyperlane::Status::Reject;
}
}
}
});
quote! {
#(#statements)*
}
})
}