From fe7444df4b4280f4a0e92ef4c686f1c45a03b9ec Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Tue, 17 Mar 2015 23:32:40 -0400 Subject: add query string parser --- src/http.rs | 38 ++++++++++++++++++++++++++++++++++++++ src/lib.rs | 1 + 2 files changed, 39 insertions(+) create mode 100644 src/http.rs 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; -- cgit v1.2.3-54-g00ecf