From cc1104f1befe8e6a3339abcd6ba900a03fe98ea9 Mon Sep 17 00:00:00 2001 From: Martin Algesten Date: Tue, 18 Feb 2025 20:55:02 +0100 Subject: [PATCH 1/2] Avoid percent encoding some things in a query --- src/query.rs | 37 +++++++++++++++++++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/src/query.rs b/src/query.rs index 9c48b9d2..7893013d 100644 --- a/src/query.rs +++ b/src/query.rs @@ -4,7 +4,33 @@ use std::iter::Enumerate; use std::ops::Deref; use std::str::Chars; -use percent_encoding::utf8_percent_encode; +use percent_encoding::{utf8_percent_encode, AsciiSet, CONTROLS}; + +pub const ENCODED_IN_QUERY: &AsciiSet = &CONTROLS + .add(b' ') + .add(b'"') + .add(b'#') + .add(b'$') + .add(b'%') + .add(b'&') + .add(b'+') + .add(b',') + .add(b'/') + .add(b':') + .add(b';') + .add(b'<') + .add(b'=') + .add(b'>') + .add(b'?') + .add(b'@') + .add(b'[') + .add(b'\\') + .add(b']') + .add(b'^') + .add(b'`') + .add(b'{') + .add(b'|') + .add(b'}'); #[derive(Clone)] pub(crate) struct QueryParam<'a> { @@ -18,7 +44,7 @@ enum Source<'a> { } pub fn url_enc(i: &str) -> Cow { - utf8_percent_encode(i, percent_encoding::NON_ALPHANUMERIC).into() + utf8_percent_encode(i, ENCODED_IN_QUERY).into() } impl<'a> QueryParam<'a> { @@ -144,4 +170,11 @@ mod test { assert_eq!(p("foo=bar&"), vec!["foo=bar"]); assert_eq!(p("foo=bar&foo2=bar2"), vec!["foo=bar", "foo2=bar2"]); } + + #[test] + fn do_not_url_encode_some_things() { + const NOT_ENCODE: &str = &"!'()*-._~"; + let q = QueryParam::new_key_value("key", NOT_ENCODE); + assert_eq!(q.as_str(), format!("key={}", NOT_ENCODE)); + } } From 2c8fc46fe904935156955fa2a8bb4ef541f2a03b Mon Sep 17 00:00:00 2001 From: Martin Algesten Date: Tue, 18 Feb 2025 20:57:14 +0100 Subject: [PATCH 2/2] Update changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 72a7bb2c..5ee6b271 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,7 @@ # Unreleased + * Avoid percent encoding some query parameter chars (#1004) + * Fix incorrect LargeResponseHeader (#1003) * Stop passing internal state in Config (#996) * Support request level TlsConfig (#996)