## Parsing Query Strings - [http_box::util::QueryIterator()](https://docs.rs/http-box/0.1.5/http_box/util/struct.QueryIterator.html) - [http_box::util::QueryError](https://docs.rs/http-box/0.1.5/http_box/util/enum.QueryError.html) `QueryIterator` enables you to iterate over a query string. Each iteration will return `(String, Option)`. You can optionally set a callback for receiving errors with `QueryIterator::on_error()`. This callback will receive instances of `QueryError`. Here's a basic example that ignores errors: ```rust extern crate http_box; use http_box::util::QueryIterator; fn main() { let query = b"field1=value1&field2=value2&field3"; for (n, (name, value)) in QueryIterator::new(query).enumerate() { if n == 0 { assert_eq!( name, "field1" ); assert_eq!( value.unwrap(), "value1" ); } else if n == 1 { assert_eq!( name, "field2" ); assert_eq!( value.unwrap(), "value2" ); } else if n == 2 { assert_eq!( name, "field3" ); assert_eq!( value, None ); } } } ``` And here's an example of specifying an error callback to handle a decoding error: ```rust extern crate http_box; use http_box::util::{ QueryError, QueryIterator }; fn main() { // notice the null byte at the end of the last parameter name // this will report a QueryError::Name error with the byte value that triggered the error let query = b"field1=value1&field2=value2&field3\0"; for (n, (name, value)) in QueryIterator::new(query) .on_error( |error| { match error { QueryError::Name(x) => assert_eq!(x, 0), QueryError::Value(_) => panic!() } } ) .enumerate() { if n == 0 { assert_eq!( name, "field1" ); assert_eq!( value.unwrap(), "value1" ); } else if n == 1 { assert_eq!( name, "field2" ); assert_eq!( value.unwrap(), "value2" ); } } } ```