Make curl writer non-satatic and add static wrapper.

We need to use the mutex, a class member, from within the writer function.
This commit is contained in:
tastytea 2020-01-08 19:55:34 +01:00
parent c93810e241
commit a724006854
Signed by: tastytea
GPG Key ID: CFC39497F1B26E07
2 changed files with 62 additions and 18 deletions

View File

@ -164,8 +164,31 @@ private:
* *
* @since 0.1.0 * @since 0.1.0
*/ */
static int writer(char *data, size_t size, size_t nmemb, size_t writer_body(char *data, size_t size, size_t nmemb);
string *writerData);
/*!
* @brief Wrapper for curl, because it can only call static member
* functions.
*
* <https://curl.haxx.se/docs/faq.html#Using_C_non_static_functions_f>
*
* @since 0.1.0
*/
static inline size_t writer_body_wrapper(char *data, size_t sz,
size_t nmemb, void *f)
{
return static_cast<CURLWrapper*>(f)->writer_body(data, sz, nmemb);
}
//! @copydoc writer_body
size_t writer_header(char *data, size_t size, size_t nmemb);
//! @copydoc writer_body_wrapper
static inline size_t writer_header_wrapper(char *data, size_t sz,
size_t nmemb, void *f)
{
return static_cast<CURLWrapper*>(f)->writer_header(data, sz, nmemb);
}
/*! /*!
* @brief Setup libcurl connection. * @brief Setup libcurl connection.

View File

@ -151,17 +151,28 @@ answer_type CURLWrapper::make_request(const http_method &method, string uri,
return answer; return answer;
} }
int CURLWrapper::writer(char *data, size_t size, size_t nmemb, size_t CURLWrapper::writer_body(char *data, size_t size, size_t nmemb)
string *writerData)
{ {
if(writerData == nullptr) if(data == nullptr)
{ {
return 0; return 0;
} }
writerData->append(data, size*nmemb); _curl_buffer_body.append(data, size * nmemb);
return static_cast<int>(size * nmemb); return size * nmemb;
}
size_t CURLWrapper::writer_header(char *data, size_t size, size_t nmemb)
{
if(data == nullptr)
{
return 0;
}
_curl_buffer_headers.append(data, size * nmemb);
return size * nmemb;
} }
void CURLWrapper::setup_curl() void CURLWrapper::setup_curl()
@ -180,29 +191,39 @@ void CURLWrapper::setup_curl()
} }
// NOLINTNEXTLINE(cppcoreguidelines-pro-type-vararg) // NOLINTNEXTLINE(cppcoreguidelines-pro-type-vararg)
code = curl_easy_setopt(_connection, CURLOPT_WRITEFUNCTION, writer); code = curl_easy_setopt(_connection, CURLOPT_WRITEFUNCTION,
writer_body_wrapper);
if (code != CURLE_OK) if (code != CURLE_OK)
{ {
throw CURLException{code, "Failed to set writer", _curl_buffer_error}; throw CURLException{code, "Failed to set write function",
}
// NOLINTNEXTLINE(cppcoreguidelines-pro-type-vararg)
code = curl_easy_setopt(_connection, CURLOPT_HEADERDATA,
&_curl_buffer_headers);
if (code != CURLE_OK)
{
throw CURLException{code, "Failed to set header data",
_curl_buffer_error}; _curl_buffer_error};
} }
// NOLINTNEXTLINE(cppcoreguidelines-pro-type-vararg) // NOLINTNEXTLINE(cppcoreguidelines-pro-type-vararg)
code = curl_easy_setopt(_connection, CURLOPT_WRITEDATA, &_curl_buffer_body); code = curl_easy_setopt(_connection, CURLOPT_WRITEDATA, this);
if (code != CURLE_OK) if (code != CURLE_OK)
{ {
throw CURLException{code, "Failed to set write data", throw CURLException{code, "Failed to set write data",
_curl_buffer_error}; _curl_buffer_error};
} }
// NOLINTNEXTLINE(cppcoreguidelines-pro-type-vararg)
code = curl_easy_setopt(_connection, CURLOPT_HEADERFUNCTION,
writer_header_wrapper);
if (code != CURLE_OK)
{
throw CURLException{code, "Failed to set header function",
_curl_buffer_error};
}
// NOLINTNEXTLINE(cppcoreguidelines-pro-type-vararg)
code = curl_easy_setopt(_connection, CURLOPT_HEADERDATA, this);
if (code != CURLE_OK)
{
throw CURLException{code, "Failed to set header data",
_curl_buffer_error};
}
// NOLINTNEXTLINE(cppcoreguidelines-pro-type-vararg) // NOLINTNEXTLINE(cppcoreguidelines-pro-type-vararg)
code = curl_easy_setopt(_connection, CURLOPT_USERAGENT, code = curl_easy_setopt(_connection, CURLOPT_USERAGENT,
(string("mastorss/") += version).c_str()); (string("mastorss/") += version).c_str());