#![cfg(all(feature = "tls", feature = "server", feature = "client"))]
use oxihttp::Router;
use oxihttp::Server;
use oxihttp_server::TlsConfig;
use oxitls::rcgen_bridge::{generate_self_signed_ed25519, CertifiedKey};
fn make_localhost_cert() -> CertifiedKey {
generate_self_signed_ed25519(&["localhost"]).expect("cert gen")
}
#[tokio::test]
async fn early_data_client_option_connects_successfully() {
let ck = make_localhost_cert();
let tls_cfg = TlsConfig::from_pem(ck.cert_pem.as_bytes(), ck.key_pem().as_bytes())
.expect("server TlsConfig");
let router = Router::new().get("/ping", |_req| async {
oxihttp::response::text_response("pong")
});
let (addr, server_handle) = Server::bind("127.0.0.1:0")
.with_tls(tls_cfg)
.serve_with_addr(router)
.await
.expect("server bind");
let client = oxihttp::Client::builder()
.with_trusted_cert_der(ck.cert_der.clone())
.with_early_data()
.build_https()
.expect("build_https with early_data");
let url = format!("https://localhost:{}/ping", addr.port());
let resp = client.get(&url).expect("GET").send().await.expect("send");
assert_eq!(
resp.status(),
oxihttp::StatusCode::OK,
"expected 200 OK from /ping endpoint"
);
server_handle.abort();
}
#[tokio::test]
async fn early_data_flag_is_idempotent() {
let ck = make_localhost_cert();
let tls_cfg = TlsConfig::from_pem(ck.cert_pem.as_bytes(), ck.key_pem().as_bytes())
.expect("server TlsConfig");
let router = Router::new().get("/ping", |_req| async {
oxihttp::response::text_response("pong")
});
let (addr, server_handle) = Server::bind("127.0.0.1:0")
.with_tls(tls_cfg)
.serve_with_addr(router)
.await
.expect("server bind");
let client = oxihttp::Client::builder()
.with_trusted_cert_der(ck.cert_der.clone())
.with_early_data()
.with_early_data()
.build_https()
.expect("build_https with early_data (x2)");
let url = format!("https://localhost:{}/ping", addr.port());
let resp = client.get(&url).expect("GET").send().await.expect("send");
assert_eq!(resp.status(), oxihttp::StatusCode::OK);
server_handle.abort();
}