summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2015-03-20 09:59:48 -0400
committerJesse Luehrs <doy@tozt.net>2015-03-20 09:59:48 -0400
commit1b809825ec0b5e4ef0fed2776d410e1d79e7a7e8 (patch)
tree4883cc52e21ba2cdfa4bc20168f0c4537f810a0c
parent1d465be4f8f3998c0ae315177456e5b4b86e13b8 (diff)
downloadmatasano-1b809825ec0b5e4ef0fed2776d410e1d79e7a7e8.tar.gz
matasano-1b809825ec0b5e4ef0fed2776d410e1d79e7a7e8.zip
don't panic if we can't parse the query string
the query string comes from external input, so it should be more robust
-rw-r--r--src/http.rs35
1 files 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<HashMap<&str, &str>> {
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]