use rama::{
Context, Layer,
http::layer::ua::{UserAgent, UserAgentClassifierLayer},
http::{
HeaderName, Request, Response,
server::HttpServer,
service::web::response::{IntoResponse, Json},
},
rt::Executor,
service::service_fn,
};
use serde_json::json;
use std::convert::Infallible;
#[tokio::main]
async fn main() {
let exec = Executor::default();
HttpServer::auto(exec)
.listen(
"127.0.0.1:62015",
UserAgentClassifierLayer::new()
.overwrite_header(HeaderName::from_static("x-proxy-ua"))
.into_layer(service_fn(handle)),
)
.await
.unwrap();
}
async fn handle(ctx: Context<()>, _req: Request) -> Result<Response, Infallible> {
let ua: &UserAgent = ctx.get().unwrap();
Ok(Json(json!({
"ua": ua.header_str(),
"kind": ua.info().map(|info| info.kind.to_string()),
"version": ua.info().and_then(|info| info.version),
"platform": ua.platform().map(|p| p.to_string()),
"http_agent": ua.http_agent().as_ref().map(ToString::to_string),
"tls_agent": ua.tls_agent().as_ref().map(ToString::to_string),
}))
.into_response())
}