use fastly::http::Method;
use fastly::{Error, Request, Response};
const PRIMARY_BACKEND: &str = "origin_0";
const FAILOVER_BACKEND: &str = "origin_1";
#[fastly::main]
fn main(req: Request) -> Result<Response, Error> {
match req.get_method() {
&Method::GET | &Method::HEAD => {
let mut beresp1 = req.send(PRIMARY_BACKEND)?;
// Return primary backend response, if not 403 and not 5xx
if beresp1.get_status() != 403 && !beresp1.get_status().is_server_error() {
return Ok(beresp1);
}
println!("Failing over");
// If 403 or 5XX from primary backend, then reconstruct request and try again on the secondary backend, though without the original request body
let beresp2 = beresp1
.take_backend_request()
.unwrap()
// For demo purposes, we are setting the request to failover origin to give a successful response
.with_path("/status/200")
.send(FAILOVER_BACKEND)?;
// If successful response from failover origin, then return this response. Otherwise return the primary origin response.
if !beresp2.get_status().is_server_error() {
Ok(beresp2)
} else {
Ok(beresp1)
}
}
_ => {
// Nothing special for other methods
let beresp = req.send(PRIMARY_BACKEND)?;
Ok(beresp)
}
}
}