Skip to content

Commit

Permalink
Fix URI parser (paths were incorrect)
Browse files Browse the repository at this point in the history
  • Loading branch information
mhekkel committed Apr 8, 2024
1 parent ed9cf27 commit 37fcbb9
Show file tree
Hide file tree
Showing 4 changed files with 40 additions and 20 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,4 @@ debug/
release/
docs/api
docs/conf.py
src/revision.hpp
16 changes: 12 additions & 4 deletions include/zeep/http/uri.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;

// --------------------------------------------------------------------

Expand Down
23 changes: 13 additions & 10 deletions lib-http/src/uri.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -324,14 +324,17 @@ const char *uri::parse_hierpart(const char *cp)

cp = parse_authority(cp);

if (*cp == '/' and cp[1] == '/')
if (*cp == '/')
m_absolutePath = true;

while (*cp == '/')
{
++cp;
cp = parse_segment(cp);
}

if (m_path.empty() and not m_host.empty() and m_scheme == "file")
throw uri_parse_error();
}
else
{
Expand Down
20 changes: 14 additions & 6 deletions lib-http/test/uri-test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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");
}
Expand All @@ -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)
Expand All @@ -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)
Expand Down Expand Up @@ -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) == "¤");
}

0 comments on commit 37fcbb9

Please sign in to comment.