curl-cpp
static c++17 wrapper for curl with -fno-exceptions support
curl_url.cc
Precondition
for using this class: curl_t::has_CURLU()

Why make Url_ref_t RAII-less?

Since url can be used by multiple Easy_ref_t, users might want to manage it using std::shared_ptr.

It Url_ref_t is RAII-ed, then user would have to write std::shared_ptr<Url_ref_t>, introducing another layer of indirection while it doesn't have to.

Url_ref_t's member function cannot be called in multiple threads simultaneously.

"<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<fragment>"

#include "../curl_url.hpp"
#include "utility.hpp"
#include <cassert>
using namespace std::literals;
using set_code = Url_ref_t::set_code;
using get_code = Url_ref_t::get_code;
static constexpr const auto malform_scheme = "1111111111111111111111111111111111111111111111111111111";
int main(int argc, char* argv[])
{
curl::curl_t curl{stderr};
assert(curl.has_CURLU());
auto url1 = curl.create_Url();
assert(url1.get());
auto url_ref1 = curl::Url_ref_t{url1.get()};
assert_same(url_ref1.set_url("wwww.google.com").get_return_value(), set_code::malform_input);
assert_same(url_ref1.set_url("").get_return_value(), set_code::malform_input);
assert_same(url_ref1.set_url("https://localhost:99999999999999").get_return_value(),
set_code::bad_port_number);
assert_same(url_ref1.set_url("random://localhost:99999999999999").get_return_value(),
set_code::unsupported_scheme);
assert_same(url_ref1.set_url("http://wwww.google.com").get_return_value(), set_code::ok);
assert_same(url_ref1.set_scheme("nonexistent").get_return_value(), set_code::unsupported_scheme);
assert_same(url_ref1.set_scheme(malform_scheme).get_return_value(), set_code::malform_input);
assert_same(url_ref1.set_scheme("https").get_return_value(), set_code::ok);
auto url2 = curl.dup_Url(url1);
assert(url2.get());
auto url_ref2 = curl::Url_ref_t{url2.get()};
assert_same(std::string_view{url_ref2.get_url().get_return_value().get()}, "https://wwww.google.com/"sv);
assert_same(std::string_view{url_ref2.get_scheme().get_return_value().get()}, "https"sv);
url_ref2.get_options().Catch([](get_code code) noexcept {
assert_same(code, get_code::no_options);
});
url_ref2.get_query().Catch([](get_code code) noexcept {
assert_same(code, get_code::no_query);
});
assert_same(url_ref2.set_query("a=b").get_return_value(), set_code::ok);
assert_same(std::string_view{url_ref2.get_url().get_return_value().get()}, "https://wwww.google.com/?a=b"sv);
assert_same(std::string_view{url_ref2.get_query().get_return_value().get()}, "a=b"sv);
return 0;
}
curl::Url_ref_t
Definition: curl_url.hpp:24
curl::curl_t
Definition: curl.hpp:62