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 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
use crate::types::{RequestMeta, RouteParams}; use hyper::Request; use std::net::SocketAddr; /// A extension trait which extends the [`hyper::Request`](https://docs.rs/hyper/0.13.5/hyper/struct.Request.html) type with some helpful methods. pub trait RequestExt { /// It returns the route parameters as [RouteParams](../struct.RouteParams.html) type with the name of the parameter specified in the path as their respective keys. /// /// # Examples /// /// ``` /// use routerify::{Router, RouteParams}; /// use routerify::ext::RequestExt; /// use hyper::{Response, Body}; /// # use std::convert::Infallible; /// /// # fn run() -> Router<Body, Infallible> { /// let router = Router::builder() /// .get("/users/:userName/books/:bookName", |req| async move { /// let params: &RouteParams = req.params(); /// let user_name = params.get("userName").unwrap(); /// let book_name = params.get("bookName").unwrap(); /// /// Ok(Response::new(Body::from(format!("Username: {}, Book Name: {}", user_name, book_name)))) /// }) /// .build() /// .unwrap(); /// # router /// # } /// # run(); /// ``` fn params(&self) -> &RouteParams; /// It returns the route parameter value by the name of the parameter specified in the path. /// /// # Examples /// /// ``` /// use routerify::{Router, RouteParams}; /// use routerify::ext::RequestExt; /// use hyper::{Response, Body}; /// # use std::convert::Infallible; /// /// # fn run() -> Router<Body, Infallible> { /// let router = Router::builder() /// .get("/users/:userName/books/:bookName", |req| async move { /// let user_name = req.param("userName").unwrap(); /// let book_name = req.param("bookName").unwrap(); /// /// Ok(Response::new(Body::from(format!("Username: {}, Book Name: {}", user_name, book_name)))) /// }) /// .build() /// .unwrap(); /// # router /// # } /// # run(); /// ``` fn param<P: Into<String>>(&self, param_name: P) -> Option<&String>; /// It returns the remote address of the incoming request. /// /// # Examples /// /// ``` /// use routerify::{Router, RouteParams}; /// use routerify::ext::RequestExt; /// use hyper::{Response, Body}; /// # use std::convert::Infallible; /// /// # fn run() -> Router<Body, Infallible> { /// let router = Router::builder() /// .get("/hello", |req| async move { /// let remote_addr = req.remote_addr(); /// /// Ok(Response::new(Body::from(format!("Hello from : {}", remote_addr)))) /// }) /// .build() /// .unwrap(); /// # router /// # } /// # run(); /// ``` fn remote_addr(&self) -> SocketAddr; } impl RequestExt for Request<hyper::Body> { fn params(&self) -> &RouteParams { self.extensions() .get::<RequestMeta>() .and_then(|meta| meta.route_params()) .expect("Routerify: No RouteParams added while processing request") } fn param<P: Into<String>>(&self, param_name: P) -> Option<&String> { self.params().get(¶m_name.into()) } fn remote_addr(&self) -> SocketAddr { self.extensions() .get::<RequestMeta>() .and_then(|meta| meta.remote_addr()) .copied() .expect("Routerify: No remote address added while processing request") } }