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| {
let statements = multi_referer.referer_values.iter().map(|referer_value| {
quote! {
let referer: Option<::hyperlane::RequestHeadersValueItem> = #context.get_request().try_get_header_back(REFERER);
if let Some(referer_header) = referer {
if referer_header != #referer_value {
return;
}
} else {
return;
}
}
});
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| {
let statements = multi_referer.referer_values.iter().map(|referer_value| {
quote! {
let referer: Option<::hyperlane::RequestHeadersValueItem> = #context.get_request().try_get_header_back(REFERER);
if let Some(referer_header) = referer {
if referer_header == #referer_value {
return;
}
}
}
});
quote! {
#(#statements)*
}
})
}