diff options
author | Jesse Luehrs <doy@tozt.net> | 2015-03-17 23:32:40 -0400 |
---|---|---|
committer | Jesse Luehrs <doy@tozt.net> | 2015-03-17 23:32:40 -0400 |
commit | fe7444df4b4280f4a0e92ef4c686f1c45a03b9ec (patch) | |
tree | 47b0da1d4282351fc96fc8d70a10a975e08091a9 | |
parent | 1c301caf74a7c5e4acb2d34203d9086283605b78 (diff) | |
download | matasano-fe7444df4b4280f4a0e92ef4c686f1c45a03b9ec.tar.gz matasano-fe7444df4b4280f4a0e92ef4c686f1c45a03b9ec.zip |
add query string parser
-rw-r--r-- | src/http.rs | 38 | ||||
-rw-r--r-- | src/lib.rs | 1 |
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); +} @@ -4,6 +4,7 @@ extern crate openssl; mod aes; mod base64; mod data; +mod http; mod primitives; mod xor; |