use tiny_http::{Response, Server}; fn main() { let clickee_urls_raw = std::env::var("CLICKEE_URLS").expect("CLICKEE_URLS must be set"); let clickee_urls = clickee_urls_raw.split(",").collect::>(); let port = std::env::var("PORT") .unwrap_or_else(|_| "8000".to_string()) .parse::() .expect("PORT must be a number"); let server = Server::http(("0.0.0.0", port)).unwrap(); for request in server.incoming_requests() { let get_header = |name| { request .headers() .iter() .find(|h| h.field.equiv(name)) .map(|h| h.value.to_string()) }; let ip = get_header("x-real-ip") .or_else(|| request.remote_addr().map(|a| a.to_string())) .unwrap_or_else(|| "unknown".to_string()); let ua = get_header("user-agent").unwrap_or_else(|| "unknown".to_string()); let mut sent_click = false; for url in clickee_urls.iter() { match tinyget::get(*url).send_lazy() { Ok(_) => sent_click = true, Err(err) => println!("clickee ({url}) not online (error: {err}), using next one"), } } if sent_click { println!("clicker clicked: {ua} from {ip}"); } else { println!("no clickee available"); } let resp = Response::empty(sent_click.then_some(200).unwrap_or(502)); if let Err(err) = request.respond(resp) { println!("error responding to clicker: {err}"); } } }