use pingora::{connectors::http::Connector, prelude::*};
use pingora_http::RequestHeader;
use regex::Regex;
#[tokio::main]
async fn main() -> Result<()> {
let connector = Connector::new(None);
let peer_addr = "1.1.1.1:443";
let mut peer = HttpPeer::new(peer_addr, true, "one.one.one.one".into());
peer.options.set_http_version(2, 1);
let (mut http, _reused) = connector.get_http_session(&peer).await?;
let mut new_request = RequestHeader::build("GET", b"/", None)?;
new_request.insert_header("Host", "one.one.one.one")?;
http.write_request_header(Box::new(new_request)).await?;
http.finish_request_body().await?;
http.read_response_header().await?;
if let Some(header) = http.response_header() {
println!("{header:#?}");
} else {
return Error::e_explain(ErrorType::InvalidHTTPHeader, "No response header");
};
let mut response_body = String::new();
while let Some(chunk) = http.read_response_body().await? {
response_body.push_str(&String::from_utf8_lossy(&chunk));
}
let re = Regex::new(r"<title>(.*?)</title>")
.or_err(ErrorType::InternalError, "Failed to compile regex")?;
if let Some(title) = re
.captures(&response_body)
.and_then(|caps| caps.get(1).map(|match_| match_.as_str()))
{
println!("Page Title: {title}");
} else {
return Error::e_explain(
ErrorType::new("InvalidHTML"),
"No <title> found in response body",
);
}
connector
.release_http_session(http, &peer, Some(std::time::Duration::from_secs(5)))
.await;
Ok(())
}