From 1c0e4ed8d50ea92fcd0b3844259e9abae93b417b Mon Sep 17 00:00:00 2001 From: szudemj Date: Mon, 18 Jul 2022 13:52:38 +0200 Subject: [PATCH 1/6] Remove type name from QueryRejection This is neccessary, to avoid public exposure of implementation details by the default error message if the extractor fails to deserialize the query parameters into the target type. --- axum/src/extract/rejection.rs | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/axum/src/extract/rejection.rs b/axum/src/extract/rejection.rs index 68e72e6beb..969183cbf3 100644 --- a/axum/src/extract/rejection.rs +++ b/axum/src/extract/rejection.rs @@ -100,7 +100,6 @@ define_rejection! { #[derive(Debug)] pub struct FailedToDeserializeQueryString { error: Error, - type_name: &'static str, } impl FailedToDeserializeQueryString { @@ -111,7 +110,6 @@ impl FailedToDeserializeQueryString { { FailedToDeserializeQueryString { error: Error::new(error), - type_name: std::any::type_name::(), } } } @@ -124,11 +122,7 @@ impl IntoResponse for FailedToDeserializeQueryString { impl std::fmt::Display for FailedToDeserializeQueryString { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!( - f, - "Failed to deserialize query string. Expected something of type `{}`. Error: {}", - self.type_name, self.error, - ) + write!(f, "Failed to deserialize query string: {}", self.error,) } } From 8436ad14ca75acbaa3bbafcfcc77218833094100 Mon Sep 17 00:00:00 2001 From: szudemj Date: Mon, 18 Jul 2022 14:39:47 +0200 Subject: [PATCH 2/6] Remove unused generic type param --- axum/src/extract/query.rs | 2 +- axum/src/extract/rejection.rs | 2 +- axum/src/form.rs | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/axum/src/extract/query.rs b/axum/src/extract/query.rs index c267ce05fc..8e8b6917b8 100644 --- a/axum/src/extract/query.rs +++ b/axum/src/extract/query.rs @@ -59,7 +59,7 @@ where async fn from_request(req: &mut RequestParts) -> Result { let query = req.uri().query().unwrap_or_default(); let value = serde_urlencoded::from_str(query) - .map_err(FailedToDeserializeQueryString::__private_new::)?; + .map_err(FailedToDeserializeQueryString::__private_new::<_>)?; Ok(Query(value)) } } diff --git a/axum/src/extract/rejection.rs b/axum/src/extract/rejection.rs index 969183cbf3..21dfd14ad1 100644 --- a/axum/src/extract/rejection.rs +++ b/axum/src/extract/rejection.rs @@ -104,7 +104,7 @@ pub struct FailedToDeserializeQueryString { impl FailedToDeserializeQueryString { #[doc(hidden)] - pub fn __private_new(error: E) -> Self + pub fn __private_new(error: E) -> Self where E: Into, { diff --git a/axum/src/form.rs b/axum/src/form.rs index 9974a46036..a15f53ce5e 100644 --- a/axum/src/form.rs +++ b/axum/src/form.rs @@ -69,7 +69,7 @@ where if req.method() == Method::GET { let query = req.uri().query().unwrap_or_default(); let value = serde_urlencoded::from_str(query) - .map_err(FailedToDeserializeQueryString::__private_new::)?; + .map_err(FailedToDeserializeQueryString::__private_new::<_>)?; Ok(Form(value)) } else { if !has_content_type(req, &mime::APPLICATION_WWW_FORM_URLENCODED) { @@ -78,7 +78,7 @@ where let bytes = Bytes::from_request(req).await?; let value = serde_urlencoded::from_bytes(&bytes) - .map_err(FailedToDeserializeQueryString::__private_new::)?; + .map_err(FailedToDeserializeQueryString::__private_new::<_>)?; Ok(Form(value)) } From 44b57b6bd5984a75261f140b52d7578c70bac7fc Mon Sep 17 00:00:00 2001 From: szudemj Date: Mon, 18 Jul 2022 14:44:08 +0200 Subject: [PATCH 3/6] Add fix to changelog --- axum/CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/axum/CHANGELOG.md b/axum/CHANGELOG.md index b4879fd10e..c5c12ea2f6 100644 --- a/axum/CHANGELOG.md +++ b/axum/CHANGELOG.md @@ -7,6 +7,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 # Unreleased +- **fixed:** `QueryRejection` response exposes type names through public interface ([#1171]) - **breaking:** Remove `extractor_middleware` which was previously deprecated. Use `axum::middleware::from_extractor` instead ([#1077]) - **breaking:** Allow `Error: Into` for `Route::{layer, route_layer}` ([#924]) @@ -29,6 +30,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - **breaking:** Require middleware added with `Handler::layer` to have `Infallible` as the error type ([#1152]) +[#1171]: https://github.com/tokio-rs/axum/pull/1171 [#1077]: https://github.com/tokio-rs/axum/pull/1077 [#1088]: https://github.com/tokio-rs/axum/pull/1088 [#1102]: https://github.com/tokio-rs/axum/pull/1102 From 20ba12cf4245a3268f6b617cf04e15ed96cb9c8a Mon Sep 17 00:00:00 2001 From: szudemj Date: Mon, 18 Jul 2022 14:57:34 +0200 Subject: [PATCH 4/6] Remove unnecessary usage of turbofish --- axum/src/extract/query.rs | 2 +- axum/src/form.rs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/axum/src/extract/query.rs b/axum/src/extract/query.rs index 8e8b6917b8..dc024366b2 100644 --- a/axum/src/extract/query.rs +++ b/axum/src/extract/query.rs @@ -59,7 +59,7 @@ where async fn from_request(req: &mut RequestParts) -> Result { let query = req.uri().query().unwrap_or_default(); let value = serde_urlencoded::from_str(query) - .map_err(FailedToDeserializeQueryString::__private_new::<_>)?; + .map_err(FailedToDeserializeQueryString::__private_new)?; Ok(Query(value)) } } diff --git a/axum/src/form.rs b/axum/src/form.rs index a15f53ce5e..d1a16f7b6f 100644 --- a/axum/src/form.rs +++ b/axum/src/form.rs @@ -69,7 +69,7 @@ where if req.method() == Method::GET { let query = req.uri().query().unwrap_or_default(); let value = serde_urlencoded::from_str(query) - .map_err(FailedToDeserializeQueryString::__private_new::<_>)?; + .map_err(FailedToDeserializeQueryString::__private_new)?; Ok(Form(value)) } else { if !has_content_type(req, &mime::APPLICATION_WWW_FORM_URLENCODED) { @@ -78,7 +78,7 @@ where let bytes = Bytes::from_request(req).await?; let value = serde_urlencoded::from_bytes(&bytes) - .map_err(FailedToDeserializeQueryString::__private_new::<_>)?; + .map_err(FailedToDeserializeQueryString::__private_new)?; Ok(Form(value)) } From 8f41daf1b02ffea67553d7ffc484917a42199d11 Mon Sep 17 00:00:00 2001 From: szudemj Date: Mon, 18 Jul 2022 15:15:29 +0200 Subject: [PATCH 5/6] axum-extra: Remove unnecessary usage of turbofish --- axum-extra/src/extract/form.rs | 4 ++-- axum-extra/src/extract/query.rs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/axum-extra/src/extract/form.rs b/axum-extra/src/extract/form.rs index bcd8c1809f..ada651910c 100644 --- a/axum-extra/src/extract/form.rs +++ b/axum-extra/src/extract/form.rs @@ -67,7 +67,7 @@ where if req.method() == Method::GET { let query = req.uri().query().unwrap_or_default(); let value = serde_html_form::from_str(query) - .map_err(FailedToDeserializeQueryString::__private_new::)?; + .map_err(FailedToDeserializeQueryString::__private_new)?; Ok(Form(value)) } else { if !has_content_type(req, &mime::APPLICATION_WWW_FORM_URLENCODED) { @@ -76,7 +76,7 @@ where let bytes = Bytes::from_request(req).await?; let value = serde_html_form::from_bytes(&bytes) - .map_err(FailedToDeserializeQueryString::__private_new::)?; + .map_err(FailedToDeserializeQueryString::__private_new)?; Ok(Form(value)) } diff --git a/axum-extra/src/extract/query.rs b/axum-extra/src/extract/query.rs index dcbcdb31fd..dbd092df01 100644 --- a/axum-extra/src/extract/query.rs +++ b/axum-extra/src/extract/query.rs @@ -68,7 +68,7 @@ where async fn from_request(req: &mut RequestParts) -> Result { let query = req.uri().query().unwrap_or_default(); let value = serde_html_form::from_str(query) - .map_err(FailedToDeserializeQueryString::__private_new::)?; + .map_err(FailedToDeserializeQueryString::__private_new)?; Ok(Query(value)) } } From a91d1cbdfa1f05e3da97bd0124341b914f10ca85 Mon Sep 17 00:00:00 2001 From: szudemj Date: Mon, 18 Jul 2022 15:25:30 +0200 Subject: [PATCH 6/6] Reword changelog entry for clarity --- axum/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/axum/CHANGELOG.md b/axum/CHANGELOG.md index c5c12ea2f6..3f4b04e3a9 100644 --- a/axum/CHANGELOG.md +++ b/axum/CHANGELOG.md @@ -7,7 +7,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 # Unreleased -- **fixed:** `QueryRejection` response exposes type names through public interface ([#1171]) +- **fixed:** Don't expose internal type names in `QueryRejection` response. ([#1171]) - **breaking:** Remove `extractor_middleware` which was previously deprecated. Use `axum::middleware::from_extractor` instead ([#1077]) - **breaking:** Allow `Error: Into` for `Route::{layer, route_layer}` ([#924])