this repo has no description
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}