35 #include <curl/curl.h>
48 CURLcode ret = curl_global_init(CURL_GLOBAL_ALL);
51 ROS_ERROR(
"Error initializing libcurl! retcode = %d", ret);
63 curl_global_cleanup();
86 std::vector<uint8_t>
v;
89 size_t curlWriteFunc(
void* buffer,
size_t size,
size_t nmemb,
void* userp)
93 size_t prev_size = membuf->
v.size();
94 membuf->
v.resize(prev_size + size * nmemb);
95 memcpy(&membuf->
v[prev_size], buffer, size * nmemb);
102 std::string mod_url = url;
103 if (url.find(
"package://") == 0)
105 mod_url.erase(0, strlen(
"package://"));
106 size_t pos = mod_url.find(
"/");
107 if (pos == std::string::npos)
109 throw Exception(url,
"Could not parse package:// format into file:// format");
112 std::string
package = mod_url.substr(0, pos);
113 mod_url.erase(0, pos);
116 if (package_path.empty())
121 mod_url =
"file://" + package_path + mod_url;
125 mod_url = std::regex_replace(mod_url, std::regex(
" "),
"%20");
127 curl_easy_setopt(
curl_handle_, CURLOPT_URL, mod_url.c_str());
130 char error_buffer[CURL_ERROR_SIZE];
131 curl_easy_setopt(
curl_handle_, CURLOPT_ERRORBUFFER , error_buffer);
135 curl_easy_setopt(
curl_handle_, CURLOPT_WRITEDATA, &buf);
142 else if (!buf.
v.empty())
144 res.
size = buf.
v.size();
145 res.
data.reset(
new uint8_t[res.
size+1]);
146 memcpy(res.
data.get(), &buf.
v[0], res.
size);