- main
- manifest
- deps
- main
- Install
- Run
use cookie::{Cookie, CookieJar};
use fastly::http::{header, HeaderName, HeaderValue, Method, StatusCode, Url};
use fastly::{mime, Error, Request, Response};
const PAYWALL_BACKEND: &str = "origin_1";
const CONTENT_BACKEND: &str = "origin_0";
#[fastly::main]
fn main(mut req: Request) -> Result<Response, Error> {
if let Some(req_cookie_jar) = req
.get_header(header::COOKIE)
.and_then(|h| parse_cookies_to_jar(h).ok())
{
req.remove_header(header::COOKIE);
req.set_header(
"auth-sessionid",
req_cookie_jar
.get("sessionid")
.map(|c| c.value())
.unwrap_or_default(),
);
}
if !matches!(req.get_method(), &Method::GET | &Method::HEAD) {
return Ok(req.send(CONTENT_BACKEND)?);
}
let _ = req.take_body();
let mut content_resp = req.send(CONTENT_BACKEND)?;
if content_resp.get_status() == 403 || content_resp.get_status().is_server_error() {
return Ok(content_resp);
}
let paywall_hdr = match content_resp.remove_header("paywall") {
None => {
return Ok(content_resp);
}
Some(paywall_hdr) => paywall_hdr,
};
let paywall_url = Url::parse(paywall_hdr.to_str()?)?;
if paywall_url.host_str() != Some("fiddle-paywall.glitch.me") {
return Ok(content_resp);
}
let mut paywall_req = content_resp.take_backend_request().unwrap();
paywall_req.set_url(paywall_url);
let paywall_resp = paywall_req.send(PAYWALL_BACKEND)?;
if let Some(result_value) = paywall_resp.get_header("paywall-result") {
if result_value == "BLOCK" {
return Ok(Response::from_body(
"<p>This content is only available to premium subscribers.</p>\n",
)
.with_content_type(mime::TEXT_HTML)
.with_status(StatusCode::FORBIDDEN));
}
let meta_header = &HeaderName::from_static("paywall-meta");
if let Some(paywall_meta) = paywall_resp.get_header(meta_header) {
content_resp.set_header(meta_header, paywall_meta.clone());
}
}
Ok(content_resp)
}
fn parse_cookies_to_jar(value: &HeaderValue) -> Result<CookieJar, Error> {
let mut jar = CookieJar::new();
for cookie in value.to_str()?.split(';').map(Cookie::parse) {
jar.add_original(cookie?.into_owned());
}
Ok(jar)
}