diff --git a/boost/network/uri/accessors.hpp b/boost/network/uri/accessors.hpp index 0462150f5..d31d526f9 100644 --- a/boost/network/uri/accessors.hpp +++ b/boost/network/uri/accessors.hpp @@ -34,8 +34,8 @@ struct key_value_sequence { query = pair >> *((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/%"); } spirit::qi::rule query; diff --git a/boost/network/uri/decode.hpp b/boost/network/uri/decode.hpp index 2f950dfad..e9e80e984 100644 --- a/boost/network/uri/decode.hpp +++ b/boost/network/uri/decode.hpp @@ -3,28 +3,21 @@ // (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) - #ifndef __BOOST_NETWORK_URI_DECODE_INC__ -# define __BOOST_NETWORK_URI_DECODE_INC__ - - -# include -# include -# include -# include +#define __BOOST_NETWORK_URI_DECODE_INC__ +#include +#include +#include +#include namespace boost { namespace network { namespace uri { namespace detail { -template < - typename CharT - > -CharT letter_to_hex(CharT in) -{ - switch (in) - { +template +CharT letter_to_hex(CharT in) { + switch (in) { case '0': case '1': case '2': @@ -35,74 +28,65 @@ CharT letter_to_hex(CharT in) case '7': case '8': case '9': - return in - '0'; + return in - '0'; case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': - return in + 10 - 'a'; + return in + 10 - 'a'; case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': - return in + 10 - 'A'; - } - return CharT(); + return in + 10 - 'A'; + } + return CharT(); } -} // namespace detail +} // namespace detail -template < - class InputIterator, - class OutputIterator - > +template OutputIterator decode(const InputIterator &in_begin, const InputIterator &in_end, const OutputIterator &out_begin) { - typedef typename boost::iterator_value::type value_type; + typedef typename boost::iterator_value::type value_type; - InputIterator it = in_begin; - OutputIterator out = out_begin; - while (it != in_end) { - if (*it == '%') - { - ++it; - value_type v0 = detail::letter_to_hex(*it); - ++it; - value_type v1 = detail::letter_to_hex(*it); - ++it; - *out++ = 0x10 * v0 + v1; - } - else - { - *out++ = *it++; - } + InputIterator it = in_begin; + OutputIterator out = out_begin; + while (it != in_end) { + if (*it == '%') { + ++it; + value_type v0 = detail::letter_to_hex(*it); + ++it; + value_type v1 = detail::letter_to_hex(*it); + ++it; + *out++ = 0x10 * v0 + v1; + } else if (*it == '+') { + *out++ = ' '; + ++it; + } else { + *out++ = *it++; } - return out; + } + return out; } -template < - class SinglePassRange, - class OutputIterator - > -inline -OutputIterator decode(const SinglePassRange &range, - const OutputIterator &out) { - return decode(boost::begin(range), boost::end(range), out); +template +inline OutputIterator decode(const SinglePassRange &range, + const OutputIterator &out) { + return decode(boost::begin(range), boost::end(range), out); } -inline -std::string decoded(const std::string &input) { - std::string decoded; - decode(input, std::back_inserter(decoded)); - return decoded; +inline std::string decoded(const std::string &input) { + std::string decoded; + decode(input, std::back_inserter(decoded)); + return decoded; } -} // namespace uri -} // namespace network -} // namespace boost - +} // namespace uri +} // namespace network +} // namespace boost -#endif // __BOOST_NETWORK_URI_DECODE_INC__ +#endif // __BOOST_NETWORK_URI_DECODE_INC__ diff --git a/libs/network/doc/reference/http_client.rst b/libs/network/doc/reference/http_client.rst index b32f00cca..7fd8c5211 100644 --- a/libs/network/doc/reference/http_client.rst +++ b/libs/network/doc/reference/http_client.rst @@ -168,40 +168,50 @@ initialization. Constructor taking a ``client_options`` object. The following table shows the options you can set on a ``client_options`` instance. -+---------------------+----------------------------+--------------------------+ -| Parameter Name | Type | Description | -+=====================+============================+==========================+ -| follow_redirects | ``bool`` | Boolean to specify | -| | | whether the client | -| | | should follow HTTP | -| | | redirects. Default is | -| | | ``false``. | -+---------------------+----------------------------+--------------------------+ -| cache_resolved | ``bool`` | Boolean to specify | -| | | whether the client | -| | | should cache resolved | -| | | endpoints. The default | -| | | is ``false``. | -+---------------------+----------------------------+--------------------------+ -| io_service | ``shared_ptr`` | Shared pointer to a | -| | | Boost.Asio | -| | | ``io_service``. | -+---------------------+----------------------------+--------------------------+ -| openssl_certificate | ``string`` | The filename of the | -| | | certificate to load for | -| | | the SSL connection for | -| | | verification. | -+---------------------+----------------------------+--------------------------+ -| openssl_verify_path | ``string`` | The directory from | -| | | which the certificate | -| | | authority files are | -| | | located. | -+---------------------+----------------------------+--------------------------+ -| always_verify_peer | ``bool`` | Boolean to specify | -| | | whether the client | -| | | should always verify | -| | | peers in SSL connections | -+---------------------+----------------------------+--------------------------+ ++--------------------------+----------------------------+--------------------------+ +| Parameter Name | Type | Description | ++==========================+============================+==========================+ +| follow_redirects | ``bool`` | Boolean to specify | +| | | whether the client | +| | | should follow HTTP | +| | | redirects. Default is | +| | | ``false``. | ++--------------------------+----------------------------+--------------------------+ +| cache_resolved | ``bool`` | Boolean to specify | +| | | whether the client | +| | | should cache resolved | +| | | endpoints. The default | +| | | is ``false``. | ++--------------------------+----------------------------+--------------------------+ +| io_service | ``shared_ptr`` | Shared pointer to a | +| | | Boost.Asio | +| | | ``io_service``. | ++--------------------------+----------------------------+--------------------------+ +| openssl_certificate | ``string`` | The filename of the | +| | | certificate to load for | +| | | the SSL connection for | +| | | verification. | ++--------------------------+----------------------------+--------------------------+ +| openssl_verify_path | ``string`` | The directory from | +| | | which the certificate | +| | | authority files are | +| | | located. | ++--------------------------+----------------------------+--------------------------+ +| always_verify_peer | ``bool`` | Boolean to specify | +| | | whether the client | +| | | should always verify | +| | | peers in SSL connections | ++--------------------------+----------------------------+--------------------------+ +| openssl_certificate_file | ``string`` | Filename of the | +| | | certificate to use for | +| | | client-side SSL session | +| | | establishment. | ++--------------------------+----------------------------+--------------------------+ +| openssl_private_key_file | ``string`` | Filename of the | +| | | private key to use for | +| | | client-side SSL session | +| | | establishment. | ++--------------------------+----------------------------+--------------------------+ To use the above supported named parameters, you'll have code that looks like diff --git a/libs/network/doc/whats_new.rst b/libs/network/doc/whats_new.rst index 754c36d51..890b6bfee 100644 --- a/libs/network/doc/whats_new.rst +++ b/libs/network/doc/whats_new.rst @@ -27,8 +27,11 @@ v0.11.0 ``cpp-netlib-utils_base64_test`` still fails in this platform. (`#287`_) * Provide a client option to always validate peers for HTTPS requests made by the client. (`#349`_) +* Back-port fix for `#163`_ for improved URI parsing. +* Added support for client-side certificates and private keys (`#361`_). .. _`#129`: https://github.com/cpp-netlib/cpp-netlib/issues/129 +.. _`#163`: https://github.com/cpp-netlib/cpp-netlib/issues/163 .. _`#245`: https://github.com/cpp-netlib/cpp-netlib/issues/245 .. _`#277`: https://github.com/cpp-netlib/cpp-netlib/issues/277 .. _`#279`: https://github.com/cpp-netlib/cpp-netlib/issues/279 @@ -40,6 +43,7 @@ v0.11.0 .. _`#349`: https://github.com/cpp-netlib/cpp-netlib/issues/349 .. _`#69`: https://github.com/cpp-netlib/cpp-netlib/issues/69 .. _`#86`: https://github.com/cpp-netlib/cpp-netlib/issues/86 +.. _`#361`: https://github.com/cpp-netlib/cpp-netlib/pull/361 :mod:`cpp-netlib` 0.10 ---------------------- diff --git a/libs/network/test/uri/uri_test.cpp b/libs/network/test/uri/uri_test.cpp index 7a601991d..fab7c1b35 100644 --- a/libs/network/test/uri/uri_test.cpp +++ b/libs/network/test/uri/uri_test.cpp @@ -1,4 +1,5 @@ -// Copyright 2009, 2010, 2011 Dean Michael Berris, Jeroen Habraken, Glyn Matthews. +// Copyright 2009, 2010, 2011 Dean Michael Berris, Jeroen Habraken, Glyn +// Matthews. // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE_1_0.txt of copy at // http://www.boost.org/LICENSE_1_0.txt) @@ -15,49 +16,48 @@ #include #include - using namespace boost::network; BOOST_AUTO_TEST_CASE(basic_uri_scheme_test) { - uri::uri instance("http://www.example.com/"); - BOOST_REQUIRE(uri::valid(instance)); - BOOST_CHECK_EQUAL(uri::scheme(instance), "http"); + uri::uri instance("http://www.example.com/"); + BOOST_REQUIRE(uri::valid(instance)); + BOOST_CHECK_EQUAL(uri::scheme(instance), "http"); } BOOST_AUTO_TEST_CASE(basic_uri_user_info_test) { - uri::uri instance("http://www.example.com/"); - BOOST_REQUIRE(uri::valid(instance)); - BOOST_CHECK_EQUAL(uri::user_info(instance), ""); + uri::uri instance("http://www.example.com/"); + BOOST_REQUIRE(uri::valid(instance)); + BOOST_CHECK_EQUAL(uri::user_info(instance), ""); } BOOST_AUTO_TEST_CASE(basic_uri_host_test) { - uri::uri instance("http://www.example.com/"); - BOOST_REQUIRE(uri::valid(instance)); - BOOST_CHECK_EQUAL(uri::host(instance), "www.example.com"); + uri::uri instance("http://www.example.com/"); + BOOST_REQUIRE(uri::valid(instance)); + BOOST_CHECK_EQUAL(uri::host(instance), "www.example.com"); } BOOST_AUTO_TEST_CASE(basic_uri_port_test) { - uri::uri instance("http://www.example.com/"); - BOOST_REQUIRE(uri::valid(instance)); - BOOST_CHECK_EQUAL(uri::port(instance), ""); + uri::uri instance("http://www.example.com/"); + BOOST_REQUIRE(uri::valid(instance)); + BOOST_CHECK_EQUAL(uri::port(instance), ""); } BOOST_AUTO_TEST_CASE(basic_uri_path_test) { - uri::uri instance("http://www.example.com/"); - BOOST_REQUIRE(uri::valid(instance)); - BOOST_CHECK_EQUAL(uri::path(instance), "/"); + uri::uri instance("http://www.example.com/"); + BOOST_REQUIRE(uri::valid(instance)); + BOOST_CHECK_EQUAL(uri::path(instance), "/"); } BOOST_AUTO_TEST_CASE(basic_uri_query_test) { - uri::uri instance("http://www.example.com/"); - BOOST_REQUIRE(uri::valid(instance)); - BOOST_CHECK_EQUAL(uri::query(instance), ""); + uri::uri instance("http://www.example.com/"); + BOOST_REQUIRE(uri::valid(instance)); + BOOST_CHECK_EQUAL(uri::query(instance), ""); } BOOST_AUTO_TEST_CASE(basic_uri_fragment_test) { - uri::uri instance("http://www.example.com/"); - BOOST_REQUIRE(uri::valid(instance)); - BOOST_CHECK_EQUAL(uri::fragment(instance), ""); + uri::uri instance("http://www.example.com/"); + BOOST_REQUIRE(uri::valid(instance)); + BOOST_CHECK_EQUAL(uri::fragment(instance), ""); } BOOST_AUTO_TEST_CASE(basic_uri_value_semantics_test) { @@ -72,210 +72,234 @@ BOOST_AUTO_TEST_CASE(basic_uri_value_semantics_test) { } BOOST_AUTO_TEST_CASE(basic_uri_range_scheme_test) { - uri::uri instance("http://www.example.com/"); - BOOST_REQUIRE(uri::valid(instance)); - BOOST_CHECK(instance.scheme_range()); - BOOST_CHECK(instance.begin() == boost::begin(instance.scheme_range())); - BOOST_CHECK(boost::equal(instance.scheme_range(), boost::as_literal("http"))); + uri::uri instance("http://www.example.com/"); + BOOST_REQUIRE(uri::valid(instance)); + BOOST_CHECK(instance.scheme_range()); + BOOST_CHECK(instance.begin() == boost::begin(instance.scheme_range())); + BOOST_CHECK(boost::equal(instance.scheme_range(), boost::as_literal("http"))); } BOOST_AUTO_TEST_CASE(basic_uri_range_user_info_test) { - uri::uri instance("http://www.example.com/"); - BOOST_REQUIRE(uri::valid(instance)); - BOOST_CHECK(!instance.user_info_range()); - BOOST_CHECK(boost::begin(instance.host_range()) == boost::begin(instance.user_info_range())); - BOOST_CHECK(boost::begin(instance.host_range()) == boost::end(instance.user_info_range())); + uri::uri instance("http://www.example.com/"); + BOOST_REQUIRE(uri::valid(instance)); + BOOST_CHECK(!instance.user_info_range()); + BOOST_CHECK(boost::begin(instance.host_range()) == + boost::begin(instance.user_info_range())); + BOOST_CHECK(boost::begin(instance.host_range()) == + boost::end(instance.user_info_range())); } BOOST_AUTO_TEST_CASE(basic_uri_range_host_test) { - uri::uri instance("http://www.example.com/"); - BOOST_REQUIRE(uri::valid(instance)); - BOOST_CHECK(instance.host_range()); - BOOST_CHECK(boost::equal(instance.host_range(), boost::as_literal("www.example.com"))); + uri::uri instance("http://www.example.com/"); + BOOST_REQUIRE(uri::valid(instance)); + BOOST_CHECK(instance.host_range()); + BOOST_CHECK(boost::equal(instance.host_range(), + boost::as_literal("www.example.com"))); } BOOST_AUTO_TEST_CASE(basic_uri_range_port_test) { - uri::uri instance("http://www.example.com/"); - BOOST_REQUIRE(uri::valid(instance)); - BOOST_CHECK(!instance.port_range()); - BOOST_CHECK(boost::end(instance.host_range()) == boost::begin(instance.port_range())); - BOOST_CHECK(boost::end(instance.host_range()) == boost::end(instance.port_range())); + uri::uri instance("http://www.example.com/"); + BOOST_REQUIRE(uri::valid(instance)); + BOOST_CHECK(!instance.port_range()); + BOOST_CHECK(boost::end(instance.host_range()) == + boost::begin(instance.port_range())); + BOOST_CHECK(boost::end(instance.host_range()) == + boost::end(instance.port_range())); } BOOST_AUTO_TEST_CASE(basic_uri_range_path_test) { - uri::uri instance("http://www.example.com/"); - BOOST_REQUIRE(uri::valid(instance)); - BOOST_CHECK(instance.path_range()); - BOOST_CHECK(boost::equal(instance.path_range(), boost::as_literal("/"))); - BOOST_CHECK(instance.end() == boost::end(instance.path_range())); + uri::uri instance("http://www.example.com/"); + BOOST_REQUIRE(uri::valid(instance)); + BOOST_CHECK(instance.path_range()); + BOOST_CHECK(boost::equal(instance.path_range(), boost::as_literal("/"))); + BOOST_CHECK(instance.end() == boost::end(instance.path_range())); } BOOST_AUTO_TEST_CASE(basic_uri_range_query_test) { - uri::uri instance("http://www.example.com/"); - BOOST_REQUIRE(uri::valid(instance)); - BOOST_CHECK(!instance.query_range()); - BOOST_CHECK(instance.end() == boost::begin(instance.query_range())); - BOOST_CHECK(instance.end() == boost::end(instance.query_range())); + uri::uri instance("http://www.example.com/"); + BOOST_REQUIRE(uri::valid(instance)); + BOOST_CHECK(!instance.query_range()); + BOOST_CHECK(instance.end() == boost::begin(instance.query_range())); + BOOST_CHECK(instance.end() == boost::end(instance.query_range())); } BOOST_AUTO_TEST_CASE(basic_uri_range_fragment_test) { - uri::uri instance("http://www.example.com/"); - BOOST_REQUIRE(uri::valid(instance)); - BOOST_CHECK(!instance.fragment_range()); - BOOST_CHECK(instance.end() == boost::begin(instance.fragment_range())); - BOOST_CHECK(instance.end() == boost::end(instance.fragment_range())); + uri::uri instance("http://www.example.com/"); + BOOST_REQUIRE(uri::valid(instance)); + BOOST_CHECK(!instance.fragment_range()); + BOOST_CHECK(instance.end() == boost::begin(instance.fragment_range())); + BOOST_CHECK(instance.end() == boost::end(instance.fragment_range())); } BOOST_AUTO_TEST_CASE(full_uri_scheme_test) { - uri::uri instance("http://user:password@www.example.com:80/path?query#fragment"); - BOOST_REQUIRE(uri::valid(instance)); - BOOST_CHECK_EQUAL(uri::scheme(instance), "http"); + uri::uri instance( + "http://user:password@www.example.com:80/path?query#fragment"); + BOOST_REQUIRE(uri::valid(instance)); + BOOST_CHECK_EQUAL(uri::scheme(instance), "http"); } BOOST_AUTO_TEST_CASE(full_uri_user_info_test) { - uri::uri instance("http://user:password@www.example.com:80/path?query#fragment"); - BOOST_REQUIRE(uri::valid(instance)); - BOOST_CHECK_EQUAL(uri::user_info(instance), "user:password"); + uri::uri instance( + "http://user:password@www.example.com:80/path?query#fragment"); + BOOST_REQUIRE(uri::valid(instance)); + BOOST_CHECK_EQUAL(uri::user_info(instance), "user:password"); } BOOST_AUTO_TEST_CASE(full_uri_host_test) { - uri::uri instance("http://user:password@www.example.com:80/path?query#fragment"); - BOOST_REQUIRE(uri::valid(instance)); - BOOST_CHECK_EQUAL(uri::host(instance), "www.example.com"); + uri::uri instance( + "http://user:password@www.example.com:80/path?query#fragment"); + BOOST_REQUIRE(uri::valid(instance)); + BOOST_CHECK_EQUAL(uri::host(instance), "www.example.com"); } BOOST_AUTO_TEST_CASE(full_uri_port_test) { - uri::uri instance("http://user:password@www.example.com:80/path?query#fragment"); - BOOST_REQUIRE(uri::valid(instance)); - BOOST_CHECK_EQUAL(uri::port(instance), "80"); - BOOST_CHECK(uri::port_us(instance)); - BOOST_CHECK_EQUAL(uri::port_us(instance).get(), 80); + uri::uri instance( + "http://user:password@www.example.com:80/path?query#fragment"); + BOOST_REQUIRE(uri::valid(instance)); + BOOST_CHECK_EQUAL(uri::port(instance), "80"); + BOOST_CHECK(uri::port_us(instance)); + BOOST_CHECK_EQUAL(uri::port_us(instance).get(), 80); } BOOST_AUTO_TEST_CASE(full_uri_path_test) { - uri::uri instance("http://user:password@www.example.com:80/path?query#fragment"); - BOOST_REQUIRE(uri::valid(instance)); - BOOST_CHECK_EQUAL(uri::path(instance), "/path"); + uri::uri instance( + "http://user:password@www.example.com:80/path?query#fragment"); + BOOST_REQUIRE(uri::valid(instance)); + BOOST_CHECK_EQUAL(uri::path(instance), "/path"); } BOOST_AUTO_TEST_CASE(full_uri_query_test) { - uri::uri instance("http://user:password@www.example.com:80/path?query#fragment"); - BOOST_REQUIRE(uri::valid(instance)); - BOOST_CHECK_EQUAL(uri::query(instance), "query"); + uri::uri instance( + "http://user:password@www.example.com:80/path?query#fragment"); + BOOST_REQUIRE(uri::valid(instance)); + BOOST_CHECK_EQUAL(uri::query(instance), "query"); } BOOST_AUTO_TEST_CASE(full_uri_fragment_test) { - uri::uri instance("http://user:password@www.example.com:80/path?query#fragment"); - BOOST_REQUIRE(uri::valid(instance)); - BOOST_CHECK_EQUAL(uri::fragment(instance), "fragment"); + uri::uri instance( + "http://user:password@www.example.com:80/path?query#fragment"); + BOOST_REQUIRE(uri::valid(instance)); + BOOST_CHECK_EQUAL(uri::fragment(instance), "fragment"); } BOOST_AUTO_TEST_CASE(full_uri_range_scheme_test) { - uri::uri instance("http://user:password@www.example.com:80/path?query#fragment"); - BOOST_REQUIRE(uri::valid(instance)); - BOOST_CHECK(instance.scheme_range()); - BOOST_CHECK(instance.begin() == boost::begin(instance.scheme_range())); - BOOST_CHECK(boost::equal(instance.scheme_range(), boost::as_literal("http"))); + uri::uri instance( + "http://user:password@www.example.com:80/path?query#fragment"); + BOOST_REQUIRE(uri::valid(instance)); + BOOST_CHECK(instance.scheme_range()); + BOOST_CHECK(instance.begin() == boost::begin(instance.scheme_range())); + BOOST_CHECK(boost::equal(instance.scheme_range(), boost::as_literal("http"))); } BOOST_AUTO_TEST_CASE(full_uri_range_user_info_test) { - uri::uri instance("http://user:password@www.example.com:80/path?query#fragment"); - BOOST_REQUIRE(uri::valid(instance)); - BOOST_CHECK(instance.user_info_range()); - BOOST_CHECK(boost::equal(instance.user_info_range(), boost::as_literal("user:password"))); + uri::uri instance( + "http://user:password@www.example.com:80/path?query#fragment"); + BOOST_REQUIRE(uri::valid(instance)); + BOOST_CHECK(instance.user_info_range()); + BOOST_CHECK(boost::equal(instance.user_info_range(), + boost::as_literal("user:password"))); } BOOST_AUTO_TEST_CASE(full_uri_range_host_test) { - uri::uri instance("http://user:password@www.example.com:80/path?query#fragment"); - BOOST_REQUIRE(uri::valid(instance)); - BOOST_CHECK(instance.host_range()); - BOOST_CHECK(boost::equal(instance.host_range(), boost::as_literal("www.example.com"))); + uri::uri instance( + "http://user:password@www.example.com:80/path?query#fragment"); + BOOST_REQUIRE(uri::valid(instance)); + BOOST_CHECK(instance.host_range()); + BOOST_CHECK(boost::equal(instance.host_range(), + boost::as_literal("www.example.com"))); } BOOST_AUTO_TEST_CASE(full_uri_range_port_test) { - uri::uri instance("http://user:password@www.example.com:80/path?query#fragment"); - BOOST_REQUIRE(uri::valid(instance)); - BOOST_CHECK(instance.port_range()); - BOOST_CHECK(boost::equal(instance.port_range(), boost::as_literal("80"))); + uri::uri instance( + "http://user:password@www.example.com:80/path?query#fragment"); + BOOST_REQUIRE(uri::valid(instance)); + BOOST_CHECK(instance.port_range()); + BOOST_CHECK(boost::equal(instance.port_range(), boost::as_literal("80"))); } BOOST_AUTO_TEST_CASE(full_uri_range_path_test) { - uri::uri instance("http://user:password@www.example.com:80/path?query#fragment"); - BOOST_REQUIRE(uri::valid(instance)); - BOOST_CHECK(instance.path_range()); - BOOST_CHECK(boost::equal(instance.path_range(), boost::as_literal("/path"))); + uri::uri instance( + "http://user:password@www.example.com:80/path?query#fragment"); + BOOST_REQUIRE(uri::valid(instance)); + BOOST_CHECK(instance.path_range()); + BOOST_CHECK(boost::equal(instance.path_range(), boost::as_literal("/path"))); } BOOST_AUTO_TEST_CASE(full_uri_range_query_test) { - uri::uri instance("http://user:password@www.example.com:80/path?query#fragment"); - BOOST_REQUIRE(uri::valid(instance)); - BOOST_CHECK(instance.query_range()); - BOOST_CHECK(boost::equal(instance.query_range(), boost::as_literal("query"))); + uri::uri instance( + "http://user:password@www.example.com:80/path?query#fragment"); + BOOST_REQUIRE(uri::valid(instance)); + BOOST_CHECK(instance.query_range()); + BOOST_CHECK(boost::equal(instance.query_range(), boost::as_literal("query"))); } BOOST_AUTO_TEST_CASE(full_uri_range_fragment_test) { - uri::uri instance("http://user:password@www.example.com:80/path?query#fragment"); - BOOST_REQUIRE(uri::valid(instance)); - BOOST_CHECK(instance.fragment_range()); - BOOST_CHECK(boost::equal(instance.fragment_range(), boost::as_literal("fragment"))); - BOOST_CHECK(instance.end() == boost::end(instance.fragment_range())); + uri::uri instance( + "http://user:password@www.example.com:80/path?query#fragment"); + BOOST_REQUIRE(uri::valid(instance)); + BOOST_CHECK(instance.fragment_range()); + BOOST_CHECK( + boost::equal(instance.fragment_range(), boost::as_literal("fragment"))); + BOOST_CHECK(instance.end() == boost::end(instance.fragment_range())); } BOOST_AUTO_TEST_CASE(mailto_test) { - uri::uri instance("mailto:john.doe@example.com"); - BOOST_REQUIRE(uri::valid(instance)); - BOOST_CHECK_EQUAL(uri::scheme(instance), "mailto"); - BOOST_CHECK_EQUAL(uri::path(instance), "john.doe@example.com"); + uri::uri instance("mailto:john.doe@example.com"); + BOOST_REQUIRE(uri::valid(instance)); + BOOST_CHECK_EQUAL(uri::scheme(instance), "mailto"); + BOOST_CHECK_EQUAL(uri::path(instance), "john.doe@example.com"); } BOOST_AUTO_TEST_CASE(file_test) { - uri::uri instance("file:///bin/bash"); - BOOST_REQUIRE(uri::valid(instance)); - BOOST_CHECK_EQUAL(uri::scheme(instance), "file"); - BOOST_CHECK_EQUAL(uri::path(instance), "/bin/bash"); + uri::uri instance("file:///bin/bash"); + BOOST_REQUIRE(uri::valid(instance)); + BOOST_CHECK_EQUAL(uri::scheme(instance), "file"); + BOOST_CHECK_EQUAL(uri::path(instance), "/bin/bash"); } BOOST_AUTO_TEST_CASE(xmpp_test) { - uri::uri instance("xmpp:example-node@example.com?message;subject=Hello%20World"); - BOOST_REQUIRE(uri::valid(instance)); - BOOST_CHECK_EQUAL(uri::scheme(instance), "xmpp"); - BOOST_CHECK_EQUAL(uri::path(instance), "example-node@example.com"); - BOOST_CHECK_EQUAL(uri::query(instance), "message;subject=Hello%20World"); + uri::uri instance( + "xmpp:example-node@example.com?message;subject=Hello%20World"); + BOOST_REQUIRE(uri::valid(instance)); + BOOST_CHECK_EQUAL(uri::scheme(instance), "xmpp"); + BOOST_CHECK_EQUAL(uri::path(instance), "example-node@example.com"); + BOOST_CHECK_EQUAL(uri::query(instance), "message;subject=Hello%20World"); } BOOST_AUTO_TEST_CASE(ipv4_address_test) { - uri::uri instance("http://129.79.245.252/"); - BOOST_REQUIRE(uri::valid(instance)); - BOOST_CHECK_EQUAL(uri::scheme(instance), "http"); - BOOST_CHECK_EQUAL(uri::host(instance), "129.79.245.252"); - BOOST_CHECK_EQUAL(uri::path(instance), "/"); + uri::uri instance("http://129.79.245.252/"); + BOOST_REQUIRE(uri::valid(instance)); + BOOST_CHECK_EQUAL(uri::scheme(instance), "http"); + BOOST_CHECK_EQUAL(uri::host(instance), "129.79.245.252"); + BOOST_CHECK_EQUAL(uri::path(instance), "/"); } BOOST_AUTO_TEST_CASE(ipv4_loopback_test) { - uri::uri instance("http://127.0.0.1/"); - BOOST_REQUIRE(uri::valid(instance)); - BOOST_CHECK_EQUAL(uri::scheme(instance), "http"); - BOOST_CHECK_EQUAL(uri::host(instance), "127.0.0.1"); - BOOST_CHECK_EQUAL(uri::path(instance), "/"); + uri::uri instance("http://127.0.0.1/"); + BOOST_REQUIRE(uri::valid(instance)); + BOOST_CHECK_EQUAL(uri::scheme(instance), "http"); + BOOST_CHECK_EQUAL(uri::host(instance), "127.0.0.1"); + BOOST_CHECK_EQUAL(uri::path(instance), "/"); } BOOST_AUTO_TEST_CASE(ipv6_address_test_1) { - uri::uri instance("http://[1080:0:0:0:8:800:200C:417A]/"); - BOOST_REQUIRE(uri::valid(instance)); - BOOST_CHECK_EQUAL(uri::scheme(instance), "http"); - BOOST_CHECK_EQUAL(uri::host(instance), "[1080:0:0:0:8:800:200C:417A]"); - BOOST_CHECK_EQUAL(uri::path(instance), "/"); + uri::uri instance("http://[1080:0:0:0:8:800:200C:417A]/"); + BOOST_REQUIRE(uri::valid(instance)); + BOOST_CHECK_EQUAL(uri::scheme(instance), "http"); + BOOST_CHECK_EQUAL(uri::host(instance), "[1080:0:0:0:8:800:200C:417A]"); + BOOST_CHECK_EQUAL(uri::path(instance), "/"); } BOOST_AUTO_TEST_CASE(ipv6_address_test_2) { - uri::uri instance("http://[2001:db8:85a3:8d3:1319:8a2e:370:7348]/"); - BOOST_REQUIRE(uri::valid(instance)); - BOOST_CHECK_EQUAL(uri::scheme(instance), "http"); - BOOST_CHECK_EQUAL(uri::host(instance), "[2001:db8:85a3:8d3:1319:8a2e:370:7348]"); - BOOST_CHECK_EQUAL(uri::path(instance), "/"); + uri::uri instance("http://[2001:db8:85a3:8d3:1319:8a2e:370:7348]/"); + BOOST_REQUIRE(uri::valid(instance)); + BOOST_CHECK_EQUAL(uri::scheme(instance), "http"); + BOOST_CHECK_EQUAL(uri::host(instance), + "[2001:db8:85a3:8d3:1319:8a2e:370:7348]"); + BOOST_CHECK_EQUAL(uri::path(instance), "/"); } -//BOOST_AUTO_TEST_CASE(ipv6_loopback_test) { +// BOOST_AUTO_TEST_CASE(ipv6_loopback_test) { // uri::uri instance("http://[::1]/"); // BOOST_REQUIRE(uri::valid(instance)); // BOOST_CHECK_EQUAL(uri::scheme(instance), "http"); @@ -284,221 +308,251 @@ BOOST_AUTO_TEST_CASE(ipv6_address_test_2) { //} BOOST_AUTO_TEST_CASE(ftp_test) { - uri::uri instance("ftp://john.doe@ftp.example.com/"); - BOOST_REQUIRE(uri::valid(instance)); - BOOST_CHECK_EQUAL(uri::scheme(instance), "ftp"); - BOOST_CHECK_EQUAL(uri::user_info(instance), "john.doe"); - BOOST_CHECK_EQUAL(uri::host(instance), "ftp.example.com"); - BOOST_CHECK_EQUAL(uri::path(instance), "/"); + uri::uri instance("ftp://john.doe@ftp.example.com/"); + BOOST_REQUIRE(uri::valid(instance)); + BOOST_CHECK_EQUAL(uri::scheme(instance), "ftp"); + BOOST_CHECK_EQUAL(uri::user_info(instance), "john.doe"); + BOOST_CHECK_EQUAL(uri::host(instance), "ftp.example.com"); + BOOST_CHECK_EQUAL(uri::path(instance), "/"); } BOOST_AUTO_TEST_CASE(news_test) { - uri::uri instance("news:comp.infosystems.www.servers.unix"); - BOOST_REQUIRE(uri::valid(instance)); - BOOST_CHECK_EQUAL(uri::scheme(instance), "news"); - BOOST_CHECK_EQUAL(uri::path(instance), "comp.infosystems.www.servers.unix"); + uri::uri instance("news:comp.infosystems.www.servers.unix"); + BOOST_REQUIRE(uri::valid(instance)); + BOOST_CHECK_EQUAL(uri::scheme(instance), "news"); + BOOST_CHECK_EQUAL(uri::path(instance), "comp.infosystems.www.servers.unix"); } BOOST_AUTO_TEST_CASE(tel_test) { - uri::uri instance("tel:+1-816-555-1212"); - BOOST_REQUIRE(uri::valid(instance)); - BOOST_CHECK_EQUAL(uri::scheme(instance), "tel"); - BOOST_CHECK_EQUAL(uri::path(instance), "+1-816-555-1212"); + uri::uri instance("tel:+1-816-555-1212"); + BOOST_REQUIRE(uri::valid(instance)); + BOOST_CHECK_EQUAL(uri::scheme(instance), "tel"); + BOOST_CHECK_EQUAL(uri::path(instance), "+1-816-555-1212"); } BOOST_AUTO_TEST_CASE(encoded_uri_test) { - uri::uri instance("http://www.example.com/Path%20With%20%28Some%29%20Encoded%20Characters%21"); - BOOST_REQUIRE(uri::valid(instance)); - BOOST_CHECK_EQUAL(uri::scheme(instance), "http"); - BOOST_CHECK_EQUAL(uri::host(instance), "www.example.com"); - BOOST_CHECK_EQUAL(uri::path(instance), "/Path%20With%20%28Some%29%20Encoded%20Characters%21"); - BOOST_CHECK_EQUAL(uri::decoded_path(instance), "/Path With (Some) Encoded Characters!"); + uri::uri instance( + "http://www.example.com/" + "Path%20With%20%28Some%29%20Encoded%20Characters%21"); + BOOST_REQUIRE(uri::valid(instance)); + BOOST_CHECK_EQUAL(uri::scheme(instance), "http"); + BOOST_CHECK_EQUAL(uri::host(instance), "www.example.com"); + BOOST_CHECK_EQUAL(uri::path(instance), + "/Path%20With%20%28Some%29%20Encoded%20Characters%21"); + BOOST_CHECK_EQUAL(uri::decoded_path(instance), + "/Path With (Some) Encoded Characters!"); } BOOST_AUTO_TEST_CASE(copy_constructor_test) { - uri::uri instance("http://www.example.com/"); - uri::uri copy = instance; - BOOST_CHECK_EQUAL(instance, copy); + uri::uri instance("http://www.example.com/"); + uri::uri copy = instance; + BOOST_CHECK_EQUAL(instance, copy); } BOOST_AUTO_TEST_CASE(assignment_test) { - uri::uri instance("http://www.example.com/"); - uri::uri copy; - copy = instance; - BOOST_CHECK_EQUAL(instance, copy); + uri::uri instance("http://www.example.com/"); + uri::uri copy; + copy = instance; + BOOST_CHECK_EQUAL(instance, copy); } BOOST_AUTO_TEST_CASE(swap_test) { - uri::uri instance("http://www.example.com/"); - uri::uri copy("http://www.example.org/"); - uri::swap(instance, copy); - BOOST_CHECK_EQUAL(instance.string(), "http://www.example.org/"); - BOOST_CHECK_EQUAL(copy.string(), "http://www.example.com/"); + uri::uri instance("http://www.example.com/"); + uri::uri copy("http://www.example.org/"); + uri::swap(instance, copy); + BOOST_CHECK_EQUAL(instance.string(), "http://www.example.org/"); + BOOST_CHECK_EQUAL(copy.string(), "http://www.example.com/"); } BOOST_AUTO_TEST_CASE(equality_test) { - uri::uri uri_1("http://www.example.com/"); - uri::uri uri_2("http://www.example.com/"); - BOOST_CHECK(uri_1 == uri_2); + uri::uri uri_1("http://www.example.com/"); + uri::uri uri_2("http://www.example.com/"); + BOOST_CHECK(uri_1 == uri_2); } BOOST_AUTO_TEST_CASE(equality_test_1) { - uri::uri uri_1("http://www.example.com/"); - std::string uri_2("http://www.example.com/"); - BOOST_CHECK(uri_1 == uri_2); + uri::uri uri_1("http://www.example.com/"); + std::string uri_2("http://www.example.com/"); + BOOST_CHECK(uri_1 == uri_2); } BOOST_AUTO_TEST_CASE(equality_test_2) { - std::string uri_1("http://www.example.com/"); - uri::uri uri_2("http://www.example.com/"); - BOOST_CHECK(uri_1 == uri_2); + std::string uri_1("http://www.example.com/"); + uri::uri uri_2("http://www.example.com/"); + BOOST_CHECK(uri_1 == uri_2); } BOOST_AUTO_TEST_CASE(equality_test_3) { - uri::uri uri_1("http://www.example.com/"); - std::string uri_2("http://www.example.com/"); - BOOST_CHECK(uri_1 == uri_2.c_str()); + uri::uri uri_1("http://www.example.com/"); + std::string uri_2("http://www.example.com/"); + BOOST_CHECK(uri_1 == uri_2.c_str()); } BOOST_AUTO_TEST_CASE(equality_test_4) { - std::string uri_1("http://www.example.com/"); - uri::uri uri_2("http://www.example.com/"); - BOOST_CHECK(uri_1.c_str() == uri_2); + std::string uri_1("http://www.example.com/"); + uri::uri uri_2("http://www.example.com/"); + BOOST_CHECK(uri_1.c_str() == uri_2); } BOOST_AUTO_TEST_CASE(inequality_test) { - uri::uri uri_1("http://www.example.com/"); - uri::uri uri_2("http://www.example.com/"); - BOOST_CHECK(!(uri_1 != uri_2)); + uri::uri uri_1("http://www.example.com/"); + uri::uri uri_2("http://www.example.com/"); + BOOST_CHECK(!(uri_1 != uri_2)); } BOOST_AUTO_TEST_CASE(less_than_test) { - // uri_1 is lexicographically less than uri_2 - uri::uri uri_1("http://www.example.com/"); - uri::uri uri_2("http://www.example.org/"); - BOOST_CHECK(uri_1 < uri_2); + // uri_1 is lexicographically less than uri_2 + uri::uri uri_1("http://www.example.com/"); + uri::uri uri_2("http://www.example.org/"); + BOOST_CHECK(uri_1 < uri_2); } BOOST_AUTO_TEST_CASE(username_test) { - uri::uri instance("ftp://john.doe@ftp.example.com/"); - BOOST_REQUIRE(uri::valid(instance)); - BOOST_CHECK_EQUAL(uri::username(instance), "john.doe"); + uri::uri instance("ftp://john.doe@ftp.example.com/"); + BOOST_REQUIRE(uri::valid(instance)); + BOOST_CHECK_EQUAL(uri::username(instance), "john.doe"); } BOOST_AUTO_TEST_CASE(pasword_test) { - uri::uri instance("ftp://john.doe:password@ftp.example.com/"); - BOOST_REQUIRE(uri::valid(instance)); - BOOST_CHECK_EQUAL(uri::password(instance), "password"); + uri::uri instance("ftp://john.doe:password@ftp.example.com/"); + BOOST_REQUIRE(uri::valid(instance)); + BOOST_CHECK_EQUAL(uri::password(instance), "password"); } BOOST_AUTO_TEST_CASE(hierarchical_part_test) { - uri::uri instance("http://user:password@www.example.com:80/path?query#fragment"); - BOOST_REQUIRE(uri::valid(instance)); - BOOST_CHECK_EQUAL(uri::hierarchical_part(instance), "user:password@www.example.com:80/path"); + uri::uri instance( + "http://user:password@www.example.com:80/path?query#fragment"); + BOOST_REQUIRE(uri::valid(instance)); + BOOST_CHECK_EQUAL(uri::hierarchical_part(instance), + "user:password@www.example.com:80/path"); } BOOST_AUTO_TEST_CASE(partial_hierarchical_part_test) { - uri::uri instance("http://www.example.com?query#fragment"); - BOOST_REQUIRE(uri::valid(instance)); - BOOST_CHECK_EQUAL(uri::hierarchical_part(instance), "www.example.com"); + uri::uri instance("http://www.example.com?query#fragment"); + BOOST_REQUIRE(uri::valid(instance)); + BOOST_CHECK_EQUAL(uri::hierarchical_part(instance), "www.example.com"); } BOOST_AUTO_TEST_CASE(authority_test) { - uri::uri instance("http://user:password@www.example.com:80/path?query#fragment"); - BOOST_REQUIRE(uri::valid(instance)); - BOOST_CHECK_EQUAL(uri::authority(instance), "user:password@www.example.com:80"); + uri::uri instance( + "http://user:password@www.example.com:80/path?query#fragment"); + BOOST_REQUIRE(uri::valid(instance)); + BOOST_CHECK_EQUAL(uri::authority(instance), + "user:password@www.example.com:80"); } BOOST_AUTO_TEST_CASE(partial_authority_test) { - uri::uri instance("http://www.example.com/path?query#fragment"); - BOOST_REQUIRE(uri::valid(instance)); - BOOST_CHECK_EQUAL(uri::authority(instance), "www.example.com"); + uri::uri instance("http://www.example.com/path?query#fragment"); + BOOST_REQUIRE(uri::valid(instance)); + BOOST_CHECK_EQUAL(uri::authority(instance), "www.example.com"); } BOOST_AUTO_TEST_CASE(http_query_map_test) { - uri::uri instance("http://user:password@www.example.com:80/path?query=something#fragment"); - BOOST_REQUIRE(uri::valid(instance)); + uri::uri instance( + "http://user:password@www.example.com:80/path?query=something#fragment"); + BOOST_REQUIRE(uri::valid(instance)); - std::map queries; - uri::query_map(instance, queries); - BOOST_REQUIRE_EQUAL(queries.size(), std::size_t(1)); - BOOST_CHECK_EQUAL(queries.begin()->first, "query"); - BOOST_CHECK_EQUAL(queries.begin()->second, "something"); + std::map queries; + uri::query_map(instance, queries); + BOOST_REQUIRE_EQUAL(queries.size(), std::size_t(1)); + BOOST_CHECK_EQUAL(queries.begin()->first, "query"); + BOOST_CHECK_EQUAL(queries.begin()->second, "something"); } BOOST_AUTO_TEST_CASE(xmpp_query_map_test) { - uri::uri instance("xmpp:example-node@example.com?message;subject=Hello%20World"); - BOOST_REQUIRE(uri::valid(instance)); + uri::uri instance( + "xmpp:example-node@example.com?message;subject=Hello%20World"); + BOOST_REQUIRE(uri::valid(instance)); - std::map queries; - uri::query_map(instance, queries); - BOOST_REQUIRE_EQUAL(queries.size(), std::size_t(2)); - BOOST_CHECK_EQUAL(queries.begin()->first, "message"); - BOOST_CHECK_EQUAL(queries.begin()->second, ""); - BOOST_CHECK_EQUAL((++queries.begin())->first, "subject"); - BOOST_CHECK_EQUAL((++queries.begin())->second, "Hello%20World"); + std::map queries; + uri::query_map(instance, queries); + BOOST_REQUIRE_EQUAL(queries.size(), std::size_t(2)); + BOOST_CHECK_EQUAL(queries.begin()->first, "message"); + BOOST_CHECK_EQUAL(queries.begin()->second, ""); + BOOST_CHECK_EQUAL((++queries.begin())->first, "subject"); + BOOST_CHECK_EQUAL((++queries.begin())->second, "Hello%20World"); } BOOST_AUTO_TEST_CASE(range_test) { - const std::string url("http://www.example.com/"); - uri::uri instance(url); - BOOST_REQUIRE(uri::valid(instance)); - BOOST_CHECK(boost::equal(instance, url)); + const std::string url("http://www.example.com/"); + uri::uri instance(url); + BOOST_REQUIRE(uri::valid(instance)); + BOOST_CHECK(boost::equal(instance, url)); } BOOST_AUTO_TEST_CASE(issue_67_test) { - // https://github.com/cpp-netlib/cpp-netlib/issues/67 - const std::string site_name("http://www.google.com"); - uri::uri bar0; - uri::uri bar1 = site_name; - bar0 = site_name; - BOOST_CHECK(uri::is_valid(bar0)); - BOOST_CHECK(uri::is_valid(bar1)); + // https://github.com/cpp-netlib/cpp-netlib/issues/67 + const std::string site_name("http://www.google.com"); + uri::uri bar0; + uri::uri bar1 = site_name; + bar0 = site_name; + BOOST_CHECK(uri::is_valid(bar0)); + BOOST_CHECK(uri::is_valid(bar1)); } BOOST_AUTO_TEST_CASE(from_parts_1) { - BOOST_CHECK_EQUAL(uri::uri("http://www.example.com/path?query#fragment"), - uri::from_parts(uri::uri("http://www.example.com"), "/path", "query", "fragment")); + BOOST_CHECK_EQUAL(uri::uri("http://www.example.com/path?query#fragment"), + uri::from_parts(uri::uri("http://www.example.com"), "/path", + "query", "fragment")); } BOOST_AUTO_TEST_CASE(from_parts_2) { - BOOST_CHECK_EQUAL(uri::uri("http://www.example.com/path?query#fragment"), - uri::from_parts("http://www.example.com", "/path", "query", "fragment")); + BOOST_CHECK_EQUAL( + uri::uri("http://www.example.com/path?query#fragment"), + uri::from_parts("http://www.example.com", "/path", "query", "fragment")); } BOOST_AUTO_TEST_CASE(from_parts_3) { - BOOST_CHECK_EQUAL(uri::uri("http://www.example.com/path?query"), - uri::from_parts("http://www.example.com", "/path", "query")); + BOOST_CHECK_EQUAL( + uri::uri("http://www.example.com/path?query"), + uri::from_parts("http://www.example.com", "/path", "query")); } BOOST_AUTO_TEST_CASE(from_parts_4) { - BOOST_CHECK_EQUAL(uri::uri("http://www.example.com/path"), - uri::from_parts("http://www.example.com", "/path")); + BOOST_CHECK_EQUAL(uri::uri("http://www.example.com/path"), + uri::from_parts("http://www.example.com", "/path")); } BOOST_AUTO_TEST_CASE(from_file) { - boost::filesystem::path path("/a/path/to/a/file.txt"); - BOOST_CHECK_EQUAL(uri::uri("file:///a/path/to/a/file.txt"), uri::from_file(path)); + boost::filesystem::path path("/a/path/to/a/file.txt"); + BOOST_CHECK_EQUAL(uri::uri("file:///a/path/to/a/file.txt"), + uri::from_file(path)); } BOOST_AUTO_TEST_CASE(issue_104_test) { - // https://github.com/cpp-netlib/cpp-netlib/issues/104 - boost::scoped_ptr instance(new uri::uri("http://www.example.com/")); - uri::uri copy = *instance; - instance.reset(); - BOOST_CHECK_EQUAL(uri::scheme(copy), "http"); + // https://github.com/cpp-netlib/cpp-netlib/issues/104 + boost::scoped_ptr instance(new uri::uri("http://www.example.com/")); + uri::uri copy = *instance; + instance.reset(); + BOOST_CHECK_EQUAL(uri::scheme(copy), "http"); } BOOST_AUTO_TEST_CASE(uri_set_test) { - std::set uri_set; - uri_set.insert(uri::uri("http://www.example.com/")); - BOOST_REQUIRE(!uri_set.empty()); - BOOST_CHECK_EQUAL((*uri_set.begin()), uri::uri("http://www.example.com/")); + std::set uri_set; + uri_set.insert(uri::uri("http://www.example.com/")); + BOOST_REQUIRE(!uri_set.empty()); + BOOST_CHECK_EQUAL((*uri_set.begin()), uri::uri("http://www.example.com/")); } BOOST_AUTO_TEST_CASE(uri_unordered_set_test) { - boost::unordered_set uri_set; - uri_set.insert(uri::uri("http://www.example.com/")); - BOOST_REQUIRE(!uri_set.empty()); - BOOST_CHECK_EQUAL((*uri_set.begin()), uri::uri("http://www.example.com/")); + boost::unordered_set uri_set; + uri_set.insert(uri::uri("http://www.example.com/")); + BOOST_REQUIRE(!uri_set.empty()); + BOOST_CHECK_EQUAL((*uri_set.begin()), uri::uri("http://www.example.com/")); +} + +BOOST_AUTO_TEST_CASE(issue_161_test) { + uri::uri instance( + "http://www.example.com/" + "path?param1=-¶m2=some+plus+encoded+text¶m3=~"); + BOOST_REQUIRE(uri::valid(instance)); + + std::map queries; + uri::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(uri::decoded(queries["param2"]), + "some plus encoded text"); }