- main
- manifest
- deps
- main
- Install
- Run
use anyhow::Context;
use fastly::http::{header, StatusCode, Url};
use fastly::{Backend, Error, Request, Response};
const HTTP_ME_GLITCH: &str = "origin_0";
const HOST_NAME: &str = "http-me.fastly.dev";
#[fastly::main]
fn main(mut req: Request) -> Result<Response, Error> {
req.set_header(header::HOST, HOST_NAME);
let mut resp = req.send(HTTP_ME_GLITCH)?;
let status = resp.get_status();
println!("Status code {status}");
if [
StatusCode::MOVED_PERMANENTLY,
StatusCode::FOUND,
StatusCode::PERMANENT_REDIRECT,
]
.contains(&status)
{
let location = resp
.get_header_str(header::LOCATION)
.context("No location header")?;
println!("Redirected to {location}");
let url = Url::parse(location)?;
let redirected_host = url.host_str().context("No host info in location")?;
let mut backend_builder =
Backend::builder("redirected_backend", redirected_host).override_host(redirected_host);
if url.scheme() == "https" {
backend_builder = backend_builder.enable_ssl();
}
let backend_redirect = backend_builder.finish().context("Dynamic backend failed")?;
resp = Request::get(location).send(backend_redirect)?;
}
Ok(resp)
}