1 use super::FromRequestParts;
2 use async_trait::async_trait;
3 use http::request::Parts;
4 use std::convert::Infallible;
5 
6 /// Extractor that extracts the raw query string, without parsing it.
7 ///
8 /// # Example
9 ///
10 /// ```rust,no_run
11 /// use axum::{
12 ///     extract::RawQuery,
13 ///     routing::get,
14 ///     Router,
15 /// };
16 /// use futures_util::StreamExt;
17 ///
18 /// async fn handler(RawQuery(query): RawQuery) {
19 ///     // ...
20 /// }
21 ///
22 /// let app = Router::new().route("/users", get(handler));
23 /// # async {
24 /// # axum::Server::bind(&"".parse().unwrap()).serve(app.into_make_service()).await.unwrap();
25 /// # };
26 /// ```
27 #[derive(Debug)]
28 pub struct RawQuery(pub Option<String>);
29 
30 #[async_trait]
31 impl<S> FromRequestParts<S> for RawQuery
32 where
33     S: Send + Sync,
34 {
35     type Rejection = Infallible;
36 
from_request_parts(parts: &mut Parts, _state: &S) -> Result<Self, Self::Rejection>37     async fn from_request_parts(parts: &mut Parts, _state: &S) -> Result<Self, Self::Rejection> {
38         let query = parts.uri.query().map(|query| query.to_owned());
39         Ok(Self(query))
40     }
41 }
42