use hyper::StatusCode;
use mini_serve::{handler, PeerAddr, RouteBuilder};
#[tokio::test]
async fn peer_addr_is_available_to_handlers_over_a_real_connection() {
let app = RouteBuilder::stateless()
.get("/", handler(|req, _state| async move {
let peer = req.extensions().get::<PeerAddr>().copied();
match peer {
Some(PeerAddr(addr)) => mini_serve::json(
StatusCode::OK,
&serde_json::json!({"ip": addr.ip().to_string()}),
),
None => mini_serve::json(StatusCode::OK, &serde_json::json!({"ip": null})),
}
}))
.seal();
let port = app.bind_ephemeral().await.expect("failed to bind");
tokio::time::sleep(tokio::time::Duration::from_millis(50)).await;
let resp = reqwest::get(&format!("http://127.0.0.1:{}/", port))
.await
.expect("request failed");
assert_eq!(resp.status(), StatusCode::OK);
let body: serde_json::Value = resp.json().await.expect("invalid json");
assert_eq!(
body["ip"], "127.0.0.1",
"peer address should be the loopback address the client actually connected from"
);
}