diff --git a/.gitignore b/.gitignore index 802473c..341fa4b 100644 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,4 @@ debug/ release/ docs/api docs/conf.py +src/revision.hpp diff --git a/include/zeep/http/uri.hpp b/include/zeep/http/uri.hpp index 09ec0d4..9d4cf7b 100644 --- a/include/zeep/http/uri.hpp +++ b/include/zeep/http/uri.hpp @@ -89,11 +89,19 @@ class uri ~uri() = default; uri(const uri &u) = default; - uri(uri &&u) = default; - uri &operator=(const uri &u) = default; - uri &operator=(uri &&u) = default; - void swap(uri &u); + uri(uri &&u) + { + swap(*this, u); + } + + uri &operator=(uri u) noexcept + { + swap(*this, u); + return *this; + } + + friend void swap(uri &lhs, uri &rhs) noexcept; // -------------------------------------------------------------------- diff --git a/lib-http/src/uri.cpp b/lib-http/src/uri.cpp index 977b96a..0e6da56 100644 --- a/lib-http/src/uri.cpp +++ b/lib-http/src/uri.cpp @@ -102,16 +102,16 @@ uri::uri(const std::string &url, const uri &base) remove_dot_segments(); } -void uri::swap(uri &u) +void swap(uri &lhs, uri &rhs) noexcept { - std::swap(m_scheme, u.m_scheme); - std::swap(m_userinfo, u.m_userinfo); - std::swap(m_host, u.m_host); - std::swap(m_port, u.m_port); - std::swap(m_path, u.m_path); - std::swap(m_query, u.m_query); - std::swap(m_fragment, u.m_fragment); - std::swap(m_absolutePath, u.m_absolutePath); + std::swap(lhs.m_scheme, rhs.m_scheme); + std::swap(lhs.m_userinfo, rhs.m_userinfo); + std::swap(lhs.m_host, rhs.m_host); + std::swap(lhs.m_port, rhs.m_port); + std::swap(lhs.m_path, rhs.m_path); + std::swap(lhs.m_query, rhs.m_query); + std::swap(lhs.m_fragment, rhs.m_fragment); + std::swap(lhs.m_absolutePath, rhs.m_absolutePath); } std::string uri::string() const @@ -324,7 +324,7 @@ const char *uri::parse_hierpart(const char *cp) cp = parse_authority(cp); - if (*cp == '/' and cp[1] == '/') + if (*cp == '/') m_absolutePath = true; while (*cp == '/') @@ -332,6 +332,9 @@ const char *uri::parse_hierpart(const char *cp) ++cp; cp = parse_segment(cp); } + + if (m_path.empty() and not m_host.empty() and m_scheme == "file") + throw uri_parse_error(); } else { diff --git a/lib-http/test/uri-test.cpp b/lib-http/test/uri-test.cpp index d6b6767..a2023ba 100644 --- a/lib-http/test/uri-test.cpp +++ b/lib-http/test/uri-test.cpp @@ -59,7 +59,7 @@ BOOST_AUTO_TEST_CASE(uri_2) BOOST_CHECK_EQUAL(url.get_scheme(), "http"); BOOST_CHECK_EQUAL(url.get_host(), "[::1]"); - BOOST_CHECK_EQUAL(url.get_path().string(), "segment/index.html"); + BOOST_CHECK_EQUAL(url.get_path().string(), "/segment/index.html"); BOOST_CHECK_EQUAL(url.get_query(false), "query"); BOOST_CHECK_EQUAL(url.get_fragment(false), "frag"); } @@ -68,14 +68,14 @@ BOOST_AUTO_TEST_CASE(uri_3) { zeep::http::uri url("http://www.example.com/~maarten"); - BOOST_CHECK_EQUAL(url.get_path().string(), "~maarten"); + BOOST_CHECK_EQUAL(url.get_path().string(), "/~maarten"); } BOOST_AUTO_TEST_CASE(uri_4) { zeep::http::uri url("http://www.example.com/%7Emaarten"); - BOOST_CHECK_EQUAL(url.get_path().string(), "~maarten"); + BOOST_CHECK_EQUAL(url.get_path().string(), "/~maarten"); } BOOST_AUTO_TEST_CASE(uri_5) @@ -97,8 +97,16 @@ BOOST_AUTO_TEST_CASE(uri_6a) BOOST_AUTO_TEST_CASE(uri_6b) { zeep::http::uri uri("file://a/b"); - BOOST_CHECK(not uri.is_absolute()); - BOOST_TEST(uri.get_path().string() == "b"); + BOOST_CHECK(uri.is_absolute()); + BOOST_TEST(uri.get_host() == "a"); + BOOST_TEST(uri.get_path().string() == "/b"); +} + +BOOST_AUTO_TEST_CASE(uri_6c) +{ + BOOST_CHECK_THROW(zeep::http::uri("file://a"), zeep::http::uri_parse_error); + BOOST_CHECK_THROW(zeep::http::uri("file://a?b"), zeep::http::uri_parse_error); + BOOST_CHECK_THROW(zeep::http::uri("file://a#c"), zeep::http::uri_parse_error); } BOOST_AUTO_TEST_CASE(normalize_1) @@ -236,7 +244,7 @@ BOOST_AUTO_TEST_CASE(encoding_1) // http://a/höken/Ðuh?¤ zeep::http::uri u("http://a/h%C3%B6ken/%C3%90uh?%C2%A4"); - BOOST_TEST(zeep::http::decode_url(u.get_path().string()) == "höken/Ðuh"); + BOOST_TEST(zeep::http::decode_url(u.get_path().string()) == "/höken/Ðuh"); BOOST_TEST(zeep::http::decode_url(u.get_query(false)) == "¤"); BOOST_TEST(u.get_query(true) == "¤"); } \ No newline at end of file