Skip to content

Commit 39f91b5

Browse files
committed
axum/extract/query: Use serde_path_to_error to report key that failed to parse
1 parent fb68828 commit 39f91b5

File tree

2 files changed

+7
-4
lines changed

2 files changed

+7
-4
lines changed

axum/Cargo.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ macros = ["dep:axum-macros"]
3131
matched-path = []
3232
multipart = ["dep:multer"]
3333
original-uri = []
34-
query = ["dep:serde_urlencoded"]
34+
query = ["dep:form_urlencoded", "dep:serde_urlencoded", "dep:serde_path_to_error"]
3535
tokio = ["dep:hyper-util", "dep:tokio", "tokio/net", "tokio/rt", "tower/make", "tokio/macros"]
3636
tower-log = ["tower/log"]
3737
tracing = ["dep:tracing", "axum-core/tracing"]
@@ -68,6 +68,7 @@ tower-service = "0.3"
6868
# optional dependencies
6969
axum-macros = { path = "../axum-macros", version = "0.5.0-rc.1", optional = true }
7070
base64 = { version = "0.22.1", optional = true }
71+
form_urlencoded = { version = "1.1.0", optional = true }
7172
hyper = { version = "1.1.0", optional = true }
7273
hyper-util = { version = "0.1.3", features = ["tokio", "server", "service"], optional = true }
7374
multer = { version = "3.0.0", optional = true }

axum/src/extract/query.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,8 @@ where
8787
_state: &S,
8888
) -> Result<Option<Self>, Self::Rejection> {
8989
if let Some(query) = parts.uri.query() {
90-
let value = serde_urlencoded::from_str(query)
90+
let deserializer = serde_urlencoded::Deserializer::new(form_urlencoded::parse(query.as_bytes()));
91+
let value = serde_path_to_error::deserialize(deserializer)
9192
.map_err(FailedToDeserializeQueryString::from_err)?;
9293
Ok(Some(Self(value)))
9394
} else {
@@ -121,8 +122,9 @@ where
121122
/// ```
122123
pub fn try_from_uri(value: &Uri) -> Result<Self, QueryRejection> {
123124
let query = value.query().unwrap_or_default();
125+
let deserializer = serde_urlencoded::Deserializer::new(form_urlencoded::parse(query.as_bytes()));
124126
let params =
125-
serde_urlencoded::from_str(query).map_err(FailedToDeserializeQueryString::from_err)?;
127+
serde_path_to_error::deserialize(deserializer).map_err(FailedToDeserializeQueryString::from_err)?;
126128
Ok(Query(params))
127129
}
128130
}
@@ -201,7 +203,7 @@ mod tests {
201203

202204
let res = client.get("/?n=hi").await;
203205
assert_eq!(res.status(), StatusCode::BAD_REQUEST);
204-
assert_eq!(res.text().await, "Failed to deserialize query string: invalid digit found in string");
206+
assert_eq!(res.text().await, "Failed to deserialize query string: n: invalid digit found in string");
205207
}
206208

207209
#[test]

0 commit comments

Comments
 (0)