mini-serve 0.13.12

An HTTP server: trie router, middleware, CORS, optional TLS. Built on hyper + tokio.
Documentation
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"
	);
}