1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//! Run with `cargo run --example remote_address_using_tower` command.
//!
//! To connect through browser, navigate to "http://localhost:3000" url.

use axum::body::Body;
use hyper::{body::Incoming, Request, Response};
use std::{convert::Infallible, net::SocketAddr};
use tower::service_fn;
use tower_http::add_extension::AddExtension;

#[tokio::main]
async fn main() {
    let service = service_fn(|mut req: Request<Incoming>| async move {
        let addr: SocketAddr = req.extensions_mut().remove().unwrap();
        let body = Body::from(format!("IP Address: {}", addr));

        Ok::<_, Infallible>(Response::new(body))
    });

    hyper_serve::bind(SocketAddr::from(([127, 0, 0, 1], 3000)))
        .serve(service_fn(|addr: SocketAddr| async move {
            Ok::<_, Infallible>(AddExtension::new(service, addr))
        }))
        .await
        .unwrap();
}