- main
- manifest
- deps
- main
- Install
- Run
use fastly::{Error, Request, Response};
use hashring::HashRing;
use std::collections::HashMap;
fn parse(cookie_string: &str) -> HashMap<&str, &str> {
cookie_string
.split("; ")
.filter_map(|kv| {
kv.find('=').map(|index| {
let (key, value) = kv.split_at(index);
let key = key.trim().trim();
let value = value[1..].trim();
(key, value)
})
})
.collect()
}
#[fastly::main]
fn main(req: Request) -> Result<Response, Error> {
let mut ring: HashRing <&str> = HashRing::new();
ring.add("origin_0");
ring.add("origin_1");
ring.add("origin_2");
let cookie_header = req.get_header_str("cookie").unwrap_or_default();
let cookie = parse(&cookie_header);
let user_id = cookie.get("user-id").unwrap();
let backend = ring.get(user_id).unwrap();
println!("user id: {}", user_id);
println!("Sending to backend {} ...", backend);
Ok(req.send(*backend)?)
}