remote_address_using_tower/
remote_address_using_tower.rs

1//! Run with `cargo run --example remote_address_using_tower` command.
2//!
3//! To connect through browser, navigate to "http://localhost:3000" url.
4
5use axum::body::Body;
6use hyper::{body::Incoming, Request, Response};
7use std::{convert::Infallible, net::SocketAddr};
8use tower::service_fn;
9use tower_http::add_extension::AddExtension;
10
11#[tokio::main]
12async fn main() {
13    let service = service_fn(|mut req: Request<Incoming>| async move {
14        let addr: SocketAddr = req.extensions_mut().remove().unwrap();
15        let body = Body::from(format!("IP Address: {}", addr));
16
17        Ok::<_, Infallible>(Response::new(body))
18    });
19
20    hyper_serve::bind(SocketAddr::from(([127, 0, 0, 1], 3000)))
21        .serve(service_fn(|addr: SocketAddr| async move {
22            Ok::<_, Infallible>(AddExtension::new(service, addr))
23        }))
24        .await
25        .unwrap();
26}