use cpool::backend::Address;
use cpool::pool::Pool;
use http_body_util::BodyExt;
use http_pool::http1::Http1Pool;
use std::sync::Arc;
use std::time::Duration;
#[tokio::main]
async fn main() {
init_log();
let use_tls = false;
let uri = if use_tls {
"https://www.baidu.com"
} else {
"http://www.baidu.com"
};
let pool = Arc::new(http_pool::http1::Pool::default());
pool.add_backend(Address::from(uri));
pool.set_max_conn(Some(1));
pool.set_keepalive(Some(Duration::from_secs(5)));
pool.use_tls(use_tls);
let mut r1 = pool.clone().get("").await;
assert_eq!(r1.is_ok(), true);
let r2 = pool.clone().get("").await;
assert_eq!(r2.is_err(), true);
if let Err(http_pool::Error::PoolFull) = r2 {
} else {
assert!(false);
}
let req = http_pool::http1::request_builder(uri, hyper::Method::GET)
.body(http_pool::body::empty())
.unwrap();
let rsp = r1.as_mut().unwrap().send_request(req).await.unwrap();
let data = rsp.collect().await;
match data {
Err(e) => println!("request error:{:?}", e),
Ok(data) => println!("request ok, data len:{}", data.to_bytes().len()),
}
assert_eq!(pool.get_cur_conn(), 1);
pool.remove_backend(&Address::from(uri));
assert_eq!(pool.get_cur_conn(), 0);
}
fn init_log() {
#[cfg(feature = "tracing")]
{
tracing_subscriber::fmt()
.with_max_level(tracing::Level::TRACE)
.init();
}
}