curl-cpp
static c++17 wrapper for curl with -fno-exceptions support
curl_url.cc
1 #include "curl_url.hpp"
2 #include <curl/curl.h>
3 #include <cassert>
4 
5 namespace curl {
6 void curl_t::Url_deleter::operator () (char *p) const noexcept
7 {
8  if (p)
9  curl_url_cleanup(static_cast<CURLU*>(static_cast<void*>(p)));
10 }
11 auto curl_t::create_Url() noexcept -> Url_t
12 {
13  return Url_t{static_cast<char*>(static_cast<void*>(curl_url()))};
14 }
15 auto curl_t::dup_Url(const Url_t &url) noexcept -> Url_t
16 {
17  auto *new_curl_url = curl_url_dup(static_cast<CURLU*>(static_cast<void*>(url.get())));
18  return Url_t{static_cast<char*>(static_cast<void*>(new_curl_url))};
19 }
20 
21 void Url_ref_t::curl_string_deleter::operator () (char *p) const noexcept
22 {
23  if (p)
24  curl_free(p);
25 }
26 
27 static auto curl_urlset_wrapper(void *url, CURLUPart part, const char *arg) noexcept ->
28  Ret_except<Url_ref_t::set_code, std::bad_alloc>
29 {
30  auto code = curl_url_set(static_cast<CURLU*>(url), part, arg, 0);
31 
32  switch (code) {
33  case CURLUE_MALFORMED_INPUT:
35  case CURLUE_BAD_PORT_NUMBER:
36  return {Url_ref_t::set_code::bad_port_number};
37  case CURLUE_UNSUPPORTED_SCHEME:
38  return {Url_ref_t::set_code::unsupported_scheme};
39  case CURLUE_OUT_OF_MEMORY:
40  return {std::bad_alloc{}};
41  case CURLUE_OK:
42  return {Url_ref_t::set_code::ok};
43 
44  default:
45  assert(false);
46  break;
47  }
48 }
49 auto Url_ref_t::set_url(const char *url_arg) noexcept -> Ret_except<set_code, std::bad_alloc>
50 {
51  return curl_urlset_wrapper(url, CURLUPART_URL, url_arg);
52 }
53 auto Url_ref_t::set_scheme(const char *scheme) noexcept -> Ret_except<set_code, std::bad_alloc>
54 {
55  return curl_urlset_wrapper(url, CURLUPART_SCHEME, scheme);
56 }
57 auto Url_ref_t::set_options(const char *options) noexcept -> Ret_except<set_code, std::bad_alloc>
58 {
59  return curl_urlset_wrapper(url, CURLUPART_OPTIONS, options);
60 }
61 auto Url_ref_t::set_query(const char *query) noexcept -> Ret_except<set_code, std::bad_alloc>
62 {
63  return curl_urlset_wrapper(url, CURLUPART_QUERY, query);
64 }
65 
66 static auto curl_urlget_wrapper(void *url, CURLUPart part) noexcept ->
67  Ret_except<Url_ref_t::string, Url_ref_t::get_code, std::bad_alloc>
68 {
69  char *result;
70  auto code = curl_url_get(static_cast<CURLU*>(url), part, &result, 0);
71 
72  assert(code != CURLUE_BAD_HANDLE);
73  assert(code != CURLUE_BAD_PARTPOINTER);
74 
75  switch (code) {
76  case CURLUE_OK:
77  return {Url_ref_t::string(result)};
78 
79  case CURLUE_OUT_OF_MEMORY:
80  return {std::bad_alloc{}};
81 
82  case CURLUE_NO_SCHEME:
83  return {Url_ref_t::get_code::no_scheme};
84  case CURLUE_NO_USER:
85  return {Url_ref_t::get_code::no_user};
86  case CURLUE_NO_PASSWORD:
87  return {Url_ref_t::get_code::no_passwd};
88  case CURLUE_NO_OPTIONS:
89  return {Url_ref_t::get_code::no_options};
90  case CURLUE_NO_HOST:
91  return {Url_ref_t::get_code::no_host};
92  case CURLUE_NO_PORT:
93  return {Url_ref_t::get_code::no_port};
94  case CURLUE_NO_QUERY:
95  return {Url_ref_t::get_code::no_query};
96  case CURLUE_NO_FRAGMENT:
97  return {Url_ref_t::get_code::no_fragment};
98 
99  default:
100  assert(false);
101  break;
102  }
103 }
104 auto Url_ref_t::get_url() const noexcept -> Ret_except<string, get_code, std::bad_alloc>
105 {
106  return curl_urlget_wrapper(url, CURLUPART_URL);
107 }
108 auto Url_ref_t::get_scheme() const noexcept -> Ret_except<string, get_code, std::bad_alloc>
109 {
110  return curl_urlget_wrapper(url, CURLUPART_SCHEME);
111 }
112 auto Url_ref_t::get_options() const noexcept -> Ret_except<string, get_code, std::bad_alloc>
113 {
114  return curl_urlget_wrapper(url, CURLUPART_OPTIONS);
115 }
116 auto Url_ref_t::get_query() const noexcept -> Ret_except<string, get_code, std::bad_alloc>
117 {
118  return curl_urlget_wrapper(url, CURLUPART_QUERY);
119 }
120 } /* namespace curl */
curl::Url_ref_t::set_code
set_code
Definition: curl_url.hpp:35
curl::Url_ref_t::curl_string_deleter
Definition: curl_url.hpp:71
curl::Url_ref_t::set_url
auto set_url(const char *url_arg) noexcept -> Ret_except< set_code, std::bad_alloc >
Definition: curl_url.cc:49
curl::Url_ref_t
Definition: curl_url.hpp:24
curl::Url_ref_t::set_options
auto set_options(const char *options) noexcept -> Ret_except< set_code, std::bad_alloc >
Definition: curl_url.cc:57
curl::Url_ref_t::set_query
auto set_query(const char *query) noexcept -> Ret_except< set_code, std::bad_alloc >
Definition: curl_url.cc:61
curl::curl_t::Url_deleter
Definition: curl.hpp:332
curl::curl_t::dup_Url
auto dup_Url(const Url_t &url) noexcept -> Url_t
Definition: curl_url.cc:15
curl::Url_ref_t::set_code::malform_input
@ malform_input
curl::Url_ref_t::set_scheme
auto set_scheme(const char *scheme) noexcept -> Ret_except< set_code, std::bad_alloc >
Definition: curl_url.cc:53
curl::curl_t
Definition: curl.hpp:62
curl::Url_ref_t::get_code
get_code
Definition: curl_url.hpp:83
curl::Url_ref_t::url
char * url
Definition: curl_url.hpp:33
curl::curl_t::create_Url
auto create_Url() noexcept -> Url_t
Definition: curl_url.cc:11
curl::Url_ref_t::get_url
auto get_url() const noexcept -> Ret_except< string, get_code, std::bad_alloc >
Definition: curl_url.cc:104