summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2015-03-17 23:32:40 -0400
committerJesse Luehrs <doy@tozt.net>2015-03-17 23:32:40 -0400
commitfe7444df4b4280f4a0e92ef4c686f1c45a03b9ec (patch)
tree47b0da1d4282351fc96fc8d70a10a975e08091a9
parent1c301caf74a7c5e4acb2d34203d9086283605b78 (diff)
downloadmatasano-fe7444df4b4280f4a0e92ef4c686f1c45a03b9ec.tar.gz
matasano-fe7444df4b4280f4a0e92ef4c686f1c45a03b9ec.zip
add query string parser
-rw-r--r--src/http.rs38
-rw-r--r--src/lib.rs1
2 files changed, 39 insertions, 0 deletions
diff --git a/src/http.rs b/src/http.rs
new file mode 100644
index 0000000..b85f1b4
--- /dev/null
+++ b/src/http.rs
@@ -0,0 +1,38 @@
+use std::collections::HashMap;
+
+fn parse_query_string (string: &[u8]) -> HashMap<&[u8], &[u8]> {
+ let mut map = HashMap::new();
+ let mut offset = 0;
+ let len = string.len();
+ while offset < len {
+ let key_start = offset;
+ let key_end = key_start + string[key_start..]
+ .iter()
+ .take_while(|&&c| c != b'=')
+ .count();
+ if string[key_end] != b'=' {
+ 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..]
+ .iter()
+ .take_while(|&&c| c != b'&')
+ .count();
+ let value = &string[value_start..value_end];
+ map.insert(key, value);
+ offset = value_end + 1;
+ }
+
+ return map;
+}
+
+#[test]
+fn test_parse_query_string () {
+ let got = parse_query_string(b"foo=bar&baz=qux&zap=zazzle");
+ let mut expected = HashMap::new();
+ expected.insert(b"foo", b"bar");
+ expected.insert(b"baz", b"qux");
+ expected.insert(b"zap", b"zazzle");
+ assert_eq!(got, expected);
+}
diff --git a/src/lib.rs b/src/lib.rs
index 55c4074..7502549 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -4,6 +4,7 @@ extern crate openssl;
mod aes;
mod base64;
mod data;
+mod http;
mod primitives;
mod xor;