From b1555de21cf5c660b9b23e56fc9ab793071b2a9f Mon Sep 17 00:00:00 2001 From: ky Date: Tue, 30 Oct 2012 18:25:30 +0400 Subject: [PATCH 1/4] fix uri decoding and query string parsing --- include/network/uri/accessors.hpp | 4 ++-- include/network/uri/decode.hpp | 6 ++++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/include/network/uri/accessors.hpp b/include/network/uri/accessors.hpp index d15b506be..1c0b68432 100644 --- a/include/network/uri/accessors.hpp +++ b/include/network/uri/accessors.hpp @@ -32,8 +32,8 @@ struct key_value_sequence { query = pair >> *((boost::spirit::qi::lit(';') | '&') >> pair); pair = key >> -('=' >> value); - key = boost::spirit::qi::char_("a-zA-Z_") >> *boost::spirit::qi::char_("a-zA-Z_0-9/%"); - value = +boost::spirit::qi::char_("a-zA-Z_0-9/%"); + key = spirit::qi::char_("a-zA-Z_") >> *spirit::qi::char_("a-zA-Z_0-9/%\\-_~\\."); + value = *spirit::qi::char_("a-zA-Z_0-9/%\\-_~\\.+"); } boost::spirit::qi::rule query; diff --git a/include/network/uri/decode.hpp b/include/network/uri/decode.hpp index c49e95755..40c50acaa 100644 --- a/include/network/uri/decode.hpp +++ b/include/network/uri/decode.hpp @@ -74,6 +74,12 @@ OutputIterator decode(const InputIterator &in_begin, *out++ = 0x10 * v0 + v1; } else + if (*it == '+') + { + *out++ = ' '; + ++ it; + } + else { *out++ = *it++; } From 0d00b3f10d5070e143db7a0d96e9694b7493a265 Mon Sep 17 00:00:00 2001 From: ky Date: Fri, 7 Dec 2012 15:35:46 +0400 Subject: [PATCH 2/4] fix minus handling in query string grammar --- include/network/uri/accessors.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/network/uri/accessors.hpp b/include/network/uri/accessors.hpp index 1c0b68432..ef52030f6 100644 --- a/include/network/uri/accessors.hpp +++ b/include/network/uri/accessors.hpp @@ -32,8 +32,8 @@ struct key_value_sequence { query = pair >> *((boost::spirit::qi::lit(';') | '&') >> pair); pair = key >> -('=' >> value); - key = spirit::qi::char_("a-zA-Z_") >> *spirit::qi::char_("a-zA-Z_0-9/%\\-_~\\."); - value = *spirit::qi::char_("a-zA-Z_0-9/%\\-_~\\.+"); + key = spirit::qi::char_("a-zA-Z_") >> *spirit::qi::char_("-+.~a-zA-Z_0-9/%"); + value = *spirit::qi::char_("-+.~a-zA-Z_0-9/%"); } boost::spirit::qi::rule query; From f77a94f97703b58afaa6501a842599689645d0ce Mon Sep 17 00:00:00 2001 From: ky Date: Fri, 7 Dec 2012 16:49:56 +0400 Subject: [PATCH 3/4] add tests to issue 161 --- include/network/uri/accessors.hpp | 4 ++-- libs/network/test/uri/uri_test.cpp | 14 ++++++++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/include/network/uri/accessors.hpp b/include/network/uri/accessors.hpp index ef52030f6..4d0f67d83 100644 --- a/include/network/uri/accessors.hpp +++ b/include/network/uri/accessors.hpp @@ -32,8 +32,8 @@ struct key_value_sequence { query = pair >> *((boost::spirit::qi::lit(';') | '&') >> pair); pair = key >> -('=' >> value); - key = spirit::qi::char_("a-zA-Z_") >> *spirit::qi::char_("-+.~a-zA-Z_0-9/%"); - value = *spirit::qi::char_("-+.~a-zA-Z_0-9/%"); + key = boost::spirit::qi::char_("a-zA-Z_") >> *boost::spirit::qi::char_("-+.~a-zA-Z_0-9/%"); + value = *boost::spirit::qi::char_("-+.~a-zA-Z_0-9/%"); } boost::spirit::qi::rule query; diff --git a/libs/network/test/uri/uri_test.cpp b/libs/network/test/uri/uri_test.cpp index 360ee0be0..72c12246d 100644 --- a/libs/network/test/uri/uri_test.cpp +++ b/libs/network/test/uri/uri_test.cpp @@ -691,3 +691,17 @@ BOOST_AUTO_TEST_CASE(uri_unordered_set_test) { BOOST_REQUIRE(!uri_set.empty()); BOOST_CHECK_EQUAL((*uri_set.begin()), network::uri("http://www.example.com/")); } + +BOOST_AUTO_TEST_CASE(issue_161_test) { + network::uri instance("http://www.example.com/path?param1=-¶m2=some+plus+encoded+text¶m3=~"); + BOOST_REQUIRE(network::valid(instance)); + + std::map queries; + network::query_map(instance, queries); + BOOST_REQUIRE_EQUAL(queries.size(), std::size_t(3)); + BOOST_CHECK_EQUAL(queries["param1"], "-"); + BOOST_CHECK_EQUAL(queries["param2"], "some+plus+encoded+text"); + BOOST_CHECK_EQUAL(queries["param3"], "~"); + BOOST_CHECK_EQUAL(network::decoded(queries["param2"]), "some plus encoded text"); +} + From 2f1dee8b1ae230b930113940a3f02a3bd45cdfd4 Mon Sep 17 00:00:00 2001 From: ky Date: Fri, 7 Dec 2012 19:00:28 +0400 Subject: [PATCH 4/4] add to network::http::request_header/response_header typedef string_type (for header concept) --- include/network/protocol/http/message/header.hpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/include/network/protocol/http/message/header.hpp b/include/network/protocol/http/message/header.hpp index 86dc791dd..815a38569 100644 --- a/include/network/protocol/http/message/header.hpp +++ b/include/network/protocol/http/message/header.hpp @@ -24,6 +24,7 @@ namespace network { namespace http { struct request_header { + typedef std::string string_type; std::string name, value; }; @@ -33,6 +34,7 @@ inline void swap(request_header & l, request_header & r) { } struct response_header { + typedef std::string string_type; std::string name, value; };