use crate::peers::Peers;
use hyper::{Body, Request, Response, StatusCode};
use std::convert::Infallible;
use std::net::IpAddr;
use std::thread::sleep;
use std::time::Duration;
pub async fn proxy_http(client_ip: IpAddr, req: Request
, db: Peers) -> Result, Infallible> {
let p = db.clone();
let rurl = req.uri().path();
let yoyo = req.uri().path().to_string(); // Bad thing, only for debug
let peer = crate::peers::return_peer(p, rurl);
match hyper_reverse_proxy::call(client_ip, peer.as_ref(), req).await {
Ok(response) => {
println!("Peer: {}, Client: {}, Path: {}, Status: {}", peer.as_ref(), client_ip, yoyo, response.status());
Ok(response)
}
Err(_error) => {
println!("Error: no live peers for: {}", yoyo);
Ok(Response::builder().status(StatusCode::INTERNAL_SERVER_ERROR).body(Body::empty()).unwrap())
}
}
}
pub async fn healthcheck(peers: Peers, work: Peers) -> Result, Infallible> {
loop {
println!("Main Peers -> {:?}", peers);
println!("Work Peers -> {:?}", work);
sleep(Duration::from_secs(10));
peers.clone().iter().for_each(|peer| {
work.insert(peer.key().clone(), peer.value().clone());
// work[peer.key()] = peer.value();
});
}
}
// #[tokio::main]
// async fn client_check(url: &str) {
// let url = url.parse::().unwrap();
// let host = url.host().expect("uri has no host");
// let port = url.port_u16().unwrap_or(80);
// let address = format!("{}:{}", host, port);
// let stream = TcpStream::connect(address).await.unwrap();
// let io = TokioIo::new(stream);
// let (mut sender, conn) = hyper::client::conn::http1::handshake(io).await.unwrap();
//
// // Spawn a task to poll the connection, driving the HTTP state
// tokio::task::spawn(async move {
// if let Err(err) = conn.await {
// println!("Connection failed: {:?}", err);
// }
// });
// }