curl: add
Signed-off-by: Simon Rozman <simon@rozman.si>
This commit is contained in:
parent
582438ac61
commit
6379065f15
131
include/stdex/curl.hpp
Normal file
131
include/stdex/curl.hpp
Normal file
@ -0,0 +1,131 @@
|
|||||||
|
/*
|
||||||
|
SPDX-License-Identifier: MIT
|
||||||
|
Copyright © 2016-2024 Amebis
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "compat.hpp"
|
||||||
|
#include <curl/curl.h>
|
||||||
|
#include <string>
|
||||||
|
#include <stdexcept>
|
||||||
|
|
||||||
|
namespace stdex
|
||||||
|
{
|
||||||
|
///
|
||||||
|
/// CURL runtime error
|
||||||
|
///
|
||||||
|
class curl_runtime_error : public std::runtime_error
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
///
|
||||||
|
/// Constructs an exception
|
||||||
|
///
|
||||||
|
/// \param[in] num CURL error code
|
||||||
|
///
|
||||||
|
curl_runtime_error(_In_ CURLcode num) :
|
||||||
|
runtime_error(curl_easy_strerror(num)),
|
||||||
|
m_num(num)
|
||||||
|
{}
|
||||||
|
|
||||||
|
///
|
||||||
|
/// Constructs an exception
|
||||||
|
///
|
||||||
|
/// \param[in] num CURL error code
|
||||||
|
/// \param[in] msg Error message
|
||||||
|
///
|
||||||
|
curl_runtime_error(_In_ CURLcode num, _In_ const std::string& msg) :
|
||||||
|
runtime_error(msg + ": " + curl_easy_strerror(num)),
|
||||||
|
m_num(num)
|
||||||
|
{}
|
||||||
|
|
||||||
|
///
|
||||||
|
/// Constructs an exception
|
||||||
|
///
|
||||||
|
/// \param[in] num CURL error code
|
||||||
|
/// \param[in] msg Error message
|
||||||
|
///
|
||||||
|
curl_runtime_error(_In_ CURLcode num, _In_z_ const char *msg) :
|
||||||
|
runtime_error(std::string(msg) + ": " + curl_easy_strerror(num)),
|
||||||
|
m_num(num)
|
||||||
|
{}
|
||||||
|
|
||||||
|
///
|
||||||
|
/// Returns the error number
|
||||||
|
///
|
||||||
|
CURLcode number() const
|
||||||
|
{
|
||||||
|
return m_num;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
CURLcode m_num; ///< Numeric error code
|
||||||
|
};
|
||||||
|
|
||||||
|
///
|
||||||
|
/// Deleter for unique_ptr using curl_easy_cleanup
|
||||||
|
///
|
||||||
|
struct curl_easy_cleanup_delete
|
||||||
|
{
|
||||||
|
///
|
||||||
|
/// Delete a pointer
|
||||||
|
///
|
||||||
|
void operator()(_In_ CURL* ptr) const
|
||||||
|
{
|
||||||
|
curl_easy_cleanup(ptr);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
///
|
||||||
|
/// CURL handle
|
||||||
|
///
|
||||||
|
using curl = std::unique_ptr<CURL, curl_easy_cleanup_delete>;
|
||||||
|
|
||||||
|
///
|
||||||
|
/// Deleter for unique_ptr using curl_slist_free_all
|
||||||
|
///
|
||||||
|
struct curl_slist_free_all_delete
|
||||||
|
{
|
||||||
|
///
|
||||||
|
/// Delete a pointer
|
||||||
|
///
|
||||||
|
void operator()(_In_ struct ::curl_slist* ptr) const
|
||||||
|
{
|
||||||
|
curl_slist_free_all(ptr);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
///
|
||||||
|
/// curl_slist struct
|
||||||
|
///
|
||||||
|
using curl_slist = std::unique_ptr<struct ::curl_slist, curl_slist_free_all_delete>;
|
||||||
|
|
||||||
|
///
|
||||||
|
/// Context scope automatic CURL (un)initialization
|
||||||
|
///
|
||||||
|
class curl_initializer
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
///
|
||||||
|
/// Initializes the CURL library.
|
||||||
|
///
|
||||||
|
/// \sa [curl_global_init function](https://curl.se/libcurl/c/curl_global_init.html)
|
||||||
|
///
|
||||||
|
curl_initializer(_In_ long flags)
|
||||||
|
{
|
||||||
|
auto code = curl_global_init(flags);
|
||||||
|
if (code != CURLE_OK) _Unlikely_
|
||||||
|
throw curl_runtime_error(code, "CURL failed to initialize");
|
||||||
|
}
|
||||||
|
|
||||||
|
///
|
||||||
|
/// Uninitializes CURL.
|
||||||
|
///
|
||||||
|
/// \sa [curl_global_cleanup function](https://curl.se/libcurl/c/curl_global_cleanup.html)
|
||||||
|
///
|
||||||
|
virtual ~curl_initializer()
|
||||||
|
{
|
||||||
|
curl_global_cleanup();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user