(query: &str)
| 279 | } |
| 280 | |
| 281 | pub(crate) fn parse_query_params(query: &str) -> Result<HashMap<String, Vec<String>>> { |
| 282 | let mut params: HashMap<String, Vec<String>> = HashMap::new(); |
| 283 | if query.is_empty() { |
| 284 | return Ok(params); |
| 285 | } |
| 286 | |
| 287 | for pair in query.split('&') { |
| 288 | if pair.is_empty() { |
| 289 | continue; |
| 290 | } |
| 291 | |
| 292 | let (raw_key, raw_value) = match pair.split_once('=') { |
| 293 | Some((key, value)) => (key, value), |
| 294 | None => (pair, ""), |
| 295 | }; |
| 296 | let key = decode_query_component(raw_key)?; |
| 297 | let value = decode_query_component(raw_value)?; |
| 298 | params.entry(key).or_default().push(value); |
| 299 | } |
| 300 | |
| 301 | Ok(params) |
| 302 | } |
| 303 | |
| 304 | /// Decode a single query string component (key or value). |
| 305 | /// |
no test coverage detected