From 1b809825ec0b5e4ef0fed2776d410e1d79e7a7e8 Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Fri, 20 Mar 2015 09:59:48 -0400 Subject: don't panic if we can't parse the query string the query string comes from external input, so it should be more robust --- src/http.rs | 35 +++++++++++++++++++---------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/src/http.rs b/src/http.rs index 2763636..9096298 100644 --- a/src/http.rs +++ b/src/http.rs @@ -1,27 +1,28 @@ use std::collections::HashMap; -pub fn parse_query_string (string: &str) -> HashMap<&str, &str> { +pub fn parse_query_string (string: &str) -> Option> { let mut map = HashMap::new(); let mut offset = 0; let len = string.as_bytes().len(); while offset < len { let key_start = offset; - let key_end = key_start + string[key_start..] - .find('=') - .unwrap_or_else(|| { - panic!("couldn't parse query string '{:?}'", string) - }); - let key = &string[key_start..key_end]; - let value_start = key_end + 1; - let value_end = value_start + string[value_start..] - .find('&') - .unwrap_or_else(|| string[value_start..].as_bytes().len()); - let value = &string[value_start..value_end]; - map.insert(key, value); - offset = value_end + 1; + if let Some(found) = string[key_start..].find('=') { + let key_end = key_start + found; + let key = &string[key_start..key_end]; + let value_start = key_end + 1; + let value_end = value_start + string[value_start..] + .find('&') + .unwrap_or_else(|| string[value_start..].as_bytes().len()); + let value = &string[value_start..value_end]; + map.insert(key, value); + offset = value_end + 1; + } + else { + return None; + } } - return map; + return Some(map); } pub fn create_query_string (params: HashMap<&str, &str>) -> String { @@ -46,7 +47,9 @@ fn test_parse_query_string () { expected.insert("foo", "bar"); expected.insert("baz", "qux"); expected.insert("zap", "zazzle"); - assert_eq!(got, expected); + assert_eq!(got, Some(expected)); + + assert_eq!(parse_query_string("foo=bar&baz=qux&zapzazzle"), None); } #[test] -- cgit v1.2.3-54-g00ecf