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)
        }
    }
}