this repo has no description
at main 1.6 kB view raw
1use tiny_http::{Response, Server}; 2 3fn main() { 4 let clickee_urls_raw = std::env::var("CLICKEE_URLS").expect("CLICKEE_URLS must be set"); 5 let clickee_urls = clickee_urls_raw.split(",").collect::<Vec<_>>(); 6 let port = std::env::var("PORT") 7 .unwrap_or_else(|_| "8000".to_string()) 8 .parse::<u16>() 9 .expect("PORT must be a number"); 10 let server = Server::http(("0.0.0.0", port)).unwrap(); 11 12 for request in server.incoming_requests() { 13 let get_header = |name| { 14 request 15 .headers() 16 .iter() 17 .find(|h| h.field.equiv(name)) 18 .map(|h| h.value.to_string()) 19 }; 20 let ip = get_header("x-real-ip") 21 .or_else(|| request.remote_addr().map(|a| a.to_string())) 22 .unwrap_or_else(|| "unknown".to_string()); 23 let ua = get_header("user-agent").unwrap_or_else(|| "unknown".to_string()); 24 25 let mut sent_click = false; 26 for url in clickee_urls.iter() { 27 match tinyget::get(*url).send_lazy() { 28 Ok(_) => sent_click = true, 29 Err(err) => println!("clickee ({url}) not online (error: {err}), using next one"), 30 } 31 } 32 33 if sent_click { 34 println!("clicker clicked: {ua} from {ip}"); 35 } else { 36 println!("no clickee available"); 37 } 38 39 let resp = Response::empty(sent_click.then_some(200).unwrap_or(502)); 40 if let Err(err) = request.respond(resp) { 41 println!("error responding to clicker: {err}"); 42 } 43 } 44}