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 hyper::{server::conn::AddrStream, Body, Request, Response};
6use std::{convert::Infallible, net::SocketAddr};
7use tower::service_fn;
8use tower_http::add_extension::AddExtension;
9
10#[tokio::main]
11async fn main() {
12    let service = service_fn(|mut req: Request<Body>| async move {
13        let addr: SocketAddr = req.extensions_mut().remove().unwrap();
14        let body = Body::from(format!("IP Address: {}", addr));
15
16        Ok::<_, Infallible>(Response::new(body))
17    });
18
19    hyper_server::bind(SocketAddr::from(([127, 0, 0, 1], 3000)))
20        .serve(service_fn(|addr: &AddrStream| {
21            let addr = addr.remote_addr();
22
23            async move { Ok::<_, Infallible>(AddExtension::new(service, addr)) }
24        }))
25        .await
26        .unwrap();
27}