routerify_unixsocket/
ext.rs

1use crate::request_meta::RequestMeta;
2use hyper::Request;
3use tokio::net::unix::{SocketAddr, UCred};
4
5/// A extension trait which extends the [`hyper::Request`](https://docs.rs/hyper/0.14.4/hyper/struct.Request.html) type with methods related to requests served through a unix socket.
6pub trait UnixRequestExt {
7    /// Returns the the incoming request's socket's peer credential
8    ///
9    /// # Examples
10    ///
11    /// ```
12    /// use hyper::{Body, Response};
13    /// use routerify::{RouteParams, Router};
14    /// use routerify_unixsocket::UnixRequestExt;
15    /// # use std::convert::Infallible;
16    ///
17    /// # fn run() -> Router<Body, Infallible> {
18    /// let router = Router::builder()
19    ///     .get("/", |req| async move {
20    ///         let peer_addr = req.unix_peer_addr().expect("did not have any peer address");
21    ///
22    ///         Ok(Response::new(Body::from(format!(
23    ///             "Peer address: {:?}",
24    ///             peer_addr
25    ///         ))))
26    ///     })
27    ///     .build()
28    ///     .unwrap();
29    /// # router
30    /// # }
31    /// # run();
32    /// ```
33    fn unix_peer_addr(&self) -> Option<&SocketAddr>;
34
35    /// Returns the the incoming request's socket's peer credential
36    ///
37    /// # Examples
38    ///
39    /// ```
40    /// use hyper::{Body, Response};
41    /// use routerify::{RouteParams, Router};
42    /// use routerify_unixsocket::UnixRequestExt;
43    /// # use std::convert::Infallible;
44    ///
45    /// # fn run() -> Router<Body, Infallible> {
46    /// let router = Router::builder()
47    ///     .get("/whoami", |req| async move {
48    ///         let peer_addr = req
49    ///             .unix_peer_cred()
50    ///             .expect("did not have peer credential information");
51    ///
52    ///         Ok(Response::new(Body::from(format!(
53    ///             "uid={} gid={}",
54    ///             peer_addr.uid(),
55    ///             peer_addr.gid()
56    ///         ))))
57    ///     })
58    ///     .build()
59    ///     .unwrap();
60    /// # router
61    /// # }
62    /// # run();
63    /// ```
64    fn unix_peer_cred(&self) -> Option<&UCred>;
65}
66
67impl UnixRequestExt for Request<hyper::Body> {
68    fn unix_peer_addr(&self) -> Option<&SocketAddr> {
69        self.extensions()
70            .get::<RequestMeta>()
71            .and_then(|x| x.peer_addr())
72    }
73
74    fn unix_peer_cred(&self) -> Option<&UCred> {
75        self.extensions()
76            .get::<RequestMeta>()
77            .and_then(|x| x.peer_cred())
78    }
79}