Prepare for boost::url upgrade
The new boost URL now interops properly with std::string_view, which is
great, and cleans up a bunch of mediocre code to convert one to another.
It has also been pulled into boost-proper, so we no longer need a
boost-url dependency that's separate.
Unfortunately, boost url makes these improvements by changing
boost::string_view for boost::urls::const_string, which causes us to
have some compile errors on the missing type.
The bulk of these changes fall into a couple categories, and have to be
executed in one commit.
string() is replaced with buffer() on the url and url_view types
boost::string_view is replaced by std::string_view for many times, in
many cases removing a temporary that we had in the code previously.
Tested: Code compiles with boost 1.81.0 beta.
Redfish service validator passes.
Pretty good unit test coverage for URL-specific use cases.
Signed-off-by: Ed Tanous <edtanous@google.com>
Change-Id: I8d3dc89b53d1cc390887fe53605d4867f75f76fd
diff --git a/http/utility.hpp b/http/utility.hpp
index b1b38da..4f5cea7 100644
--- a/http/utility.hpp
+++ b/http/utility.hpp
@@ -4,7 +4,9 @@
#include <openssl/crypto.h>
#include <boost/callable_traits.hpp>
+#include <boost/url/parse.hpp>
#include <boost/url/url.hpp>
+#include <boost/url/url_view.hpp>
#include <nlohmann/json.hpp>
#include <array>
@@ -616,13 +618,13 @@
public:
UrlParseResult operator()(std::string& output)
{
- output = std::string_view(segment.data(), segment.size());
+ output = segment;
return UrlParseResult::Continue;
}
UrlParseResult operator()(std::string_view expected)
{
- if (std::string_view(segment.data(), segment.size()) == expected)
+ if (segment == expected)
{
return UrlParseResult::Continue;
}
@@ -634,13 +636,12 @@
return UrlParseResult::Done;
}
- explicit UrlSegmentMatcherVisitor(
- const boost::urls::string_value& segmentIn) :
+ explicit UrlSegmentMatcherVisitor(std::string_view segmentIn) :
segment(segmentIn)
{}
private:
- const boost::urls::string_value& segment;
+ std::string_view segment;
};
inline bool readUrlSegments(const boost::urls::url_view& urlView,
@@ -766,9 +767,8 @@
std::string& host, uint16_t& port,
std::string& path)
{
- boost::string_view urlBoost(destUrl.data(), destUrl.size());
boost::urls::result<boost::urls::url_view> url =
- boost::urls::parse_uri(urlBoost);
+ boost::urls::parse_uri(destUrl);
if (!url)
{
return false;
@@ -781,11 +781,9 @@
port = setPortDefaults(url.value());
- host = std::string_view(url->encoded_host().data(),
- url->encoded_host().size());
+ host = url->encoded_host();
- path = std::string_view(url->encoded_path().data(),
- url->encoded_path().size());
+ path = url->encoded_path();
if (path.empty())
{
path = "/";
@@ -793,15 +791,13 @@
if (url->has_fragment())
{
path += '#';
- path += std::string_view(url->encoded_fragment().data(),
- url->encoded_fragment().size());
+ path += url->encoded_fragment();
}
if (url->has_query())
{
path += '?';
- path += std::string_view(url->encoded_query().data(),
- url->encoded_query().size());
+ path += url->encoded_query();
}
return true;
@@ -819,7 +815,7 @@
// NOLINTNEXTLINE(readability-identifier-naming)
static void to_json(json& j, const boost::urls::url& url)
{
- j = url.string();
+ j = url.buffer();
}
};
@@ -829,7 +825,7 @@
// NOLINTNEXTLINE(readability-identifier-naming)
static void to_json(json& j, const boost::urls::url_view& url)
{
- j = url.string();
+ j = url.buffer();
}
};
} // namespace nlohmann