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}