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; }; diff --git a/include/network/uri/accessors.hpp b/include/network/uri/accessors.hpp index d15b506be..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 = 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 = 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/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++; } 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"); +} +