diff --git a/src/lib.rs b/src/lib.rs index 3f2e1fa..e92c3a3 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -83,7 +83,7 @@ impl<'a, 'b> plugin::Plugin> for UrlEncodedQuery { fn eval(req: &mut Request) -> QueryResult { match req.url.query() { - Some(ref query) => create_param_hashmap(&query), + Some(ref query) => parse(&query), None => Err(UrlDecodingError::EmptyQuery) } } @@ -96,10 +96,14 @@ impl<'a, 'b> plugin::Plugin> for UrlEncodedBody { req.get::() .map(|x| x.unwrap_or("".to_string())) .map_err(|e| UrlDecodingError::BodyError(e)) - .and_then(|x| create_param_hashmap(&x)) + .and_then(|x| parse(&x)) } } +pub fn parse(data: &str) -> QueryResult { + create_param_hashmap(data) +} + /// Parse a urlencoded string into an optional HashMap. fn create_param_hashmap(data: &str) -> QueryResult { match data { diff --git a/tests/round_trip.rs b/tests/round_trip.rs new file mode 100644 index 0000000..6e329a6 --- /dev/null +++ b/tests/round_trip.rs @@ -0,0 +1,22 @@ +extern crate urlencoded; + +use std::collections::HashMap; + +#[test] +fn test_empty_query_round_trip() { + let data = ""; + let answer = urlencoded::parse(data); + assert!(answer.is_err()); +} + +#[test] +fn test_query_round_trip() { + let data = "band=arctic%20monkeys&band=mumford%20%26%20sons&band=temper trap&color=green"; + let answer = urlencoded::parse(data).unwrap(); + + let mut control = HashMap::new(); + control.insert("band".to_string(), + vec!["arctic monkeys".to_string(), "mumford & sons".to_string(), "temper trap".to_string()]); + control.insert("color".to_string(), vec!["green".to_string()]); + assert_eq!(answer, control); +} \ No newline at end of file