36#include <shared_mutex>
64static size_t write_callback(
void* aContents,
size_t aSize,
size_t aNmemb,
void* aUserp )
66 size_t realsize = aSize * aNmemb;
68 std::string* p =
static_cast<std::string*
>( aUserp );
70 p->append(
static_cast<const char*
>( aContents ), realsize );
78 size_t realsize = aSize * aNmemb;
80 std::ostream* p =
static_cast<std::ostream*
>( aUserp );
82 p->write(
static_cast<const char*
>( aContents ), realsize );
88#if LIBCURL_VERSION_NUM >= 0x072000
90static int xferinfo(
void* aProgress, curl_off_t aDLtotal, curl_off_t aDLnow, curl_off_t aULtotal,
97 curl_off_t curtime = 0;
99 curl_easy_getinfo( progress->
m_Curl->
GetCurl(), CURLINFO_TOTAL_TIME, &curtime );
104 return progress->
m_Callback( aDLtotal, aDLnow, aULtotal, aULnow );
112static int progressinfo(
void* aProgress,
double aDLtotal,
double aDLnow,
double aULtotal,
115 return xferinfo( aProgress,
static_cast<curl_off_t
>( aDLtotal ),
116 static_cast<curl_off_t
>( aDLnow ),
static_cast<curl_off_t
>( aULtotal ),
117 static_cast<curl_off_t
>( aULnow ) );
127 m_CURL = curl_easy_init();
133 curl_easy_setopt(
m_CURL, CURLOPT_WRITEDATA,
static_cast<void*
>( &
m_buffer ) );
136#if LIBCURL_VERSION_NUM >= 0x075500
137 curl_easy_setopt(
m_CURL, CURLOPT_PROTOCOLS_STR,
"http,https");
139 curl_easy_setopt(
m_CURL, CURLOPT_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTPS );
146 curl_easy_setopt(
m_CURL, CURLOPT_CONNECTTIMEOUT, 30L );
149 long sslOpts = CURLSSLOPT_NATIVE_CA;
156 sslOpts |= CURLSSLOPT_REVOKE_BEST_EFFORT;
160 sslOpts |= CURLSSLOPT_NO_REVOKE;
164 curl_easy_setopt(
m_CURL, CURLOPT_SSL_OPTIONS, sslOpts );
167 if( wxGetEnv( wxT(
"KICAD_CURL_VERBOSE" ),
nullptr ) )
170 curl_easy_setopt(
m_CURL, CURLOPT_VERBOSE, 1L );
173 wxString application( wxS(
"KiCad" ) );
177#if defined( KICAD_BUILD_ARCH_X64 )
178 platform << wxS(
";64-bit" );
179#elif defined( KICAD_BUILD_ARCH_X86 )
180 platform << wxS(
";32-bit" );
181#elif defined( KICAD_BUILD_ARCH_ARM )
182 platform << wxS(
";ARM 32-bit" );
183#elif defined( KICAD_BUILD_ARCH_ARM64 )
184 platform << wxS(
";ARM 64-bit" );
187 platform << wxS(
")" );
189 wxString user_agent = wxS(
"KiCad/" ) + version + wxS(
" " ) + platform + wxS(
" " ) + application;
193 setOption( CURLOPT_ACCEPT_ENCODING,
"gzip,deflate" );
202 curl_easy_cleanup(
m_CURL );
214 return curl_easy_perform(
m_CURL );
220 std::string header = aName +
':' + aValue;
228 return curl_easy_setopt(
m_CURL,
static_cast<CURLoption
>( aOption ), aArg );
234 return curl_easy_strerror(
static_cast<CURLcode
>( aCode ) );
249 std::string postfields;
251 for(
size_t i = 0; i < aFields.size(); i++ )
256 postfields +=
Escape( aFields[i].first );
258 postfields +=
Escape( aFields[i].second );
287 curl_easy_setopt(
m_CURL, CURLOPT_PROXY,
static_cast<const char*
>( cfg.
host.c_str() ) );
291 curl_easy_setopt(
m_CURL, CURLOPT_PROXYUSERNAME,
292 static_cast<const char*
>( cfg.
username.c_str() ) );
297 curl_easy_setopt(
m_CURL, CURLOPT_PROXYPASSWORD,
298 static_cast<const char*
>( cfg.
password.c_str() ) );
311 if(
setOption<long>( CURLOPT_FOLLOWLOCATION, ( aFollow ? 1 : 0 ) ) == CURLE_OK )
320 char* escaped = curl_easy_escape(
m_CURL, aUrl.c_str(), aUrl.length() );
322 std::string ret( escaped );
323 curl_free( escaped );
331 progress = std::make_unique<CURL_PROGRESS>(
this, aCallback,
static_cast<curl_off_t
>( aInterval ) );
333#if LIBCURL_VERSION_NUM >= 0x072000
334 setOption( CURLOPT_XFERINFOFUNCTION, xferinfo );
349 curl_easy_setopt(
m_CURL, CURLOPT_WRITEDATA,
reinterpret_cast<const void*
>( aOutput ) );
356 return setOption( CURLOPT_CONNECTTIMEOUT, aTimeoutSecs ) == CURLE_OK;
362#if LIBCURL_VERSION_NUM >= 0x073700
364 int result = curl_easy_getinfo(
m_CURL, CURLINFO_SIZE_DOWNLOAD_T, &dl );
365 aDownloadedBytes =
static_cast<uint64_t
>( dl );
368 int result = curl_easy_getinfo(
m_CURL, CURLINFO_SIZE_DOWNLOAD, &dl );
369 aDownloadedBytes =
static_cast<uint64_t
>( dl );
379 curl_easy_getinfo(
m_CURL, CURLINFO_RESPONSE_CODE, &http_code );
381 return static_cast<int>( http_code );
wxString GetBuildVersion()
Get the full KiCad version string.
wxString GetPlatformGetBitnessName()
wxString GetBuildDate()
Get the build date as a string.
int Perform()
Equivalent to curl_easy_perform.
bool SetPostFields(const std::vector< std::pair< std::string, std::string > > &aFields)
Set fields for application/x-www-form-urlencoded POST request.
std::unique_ptr< CURL_PROGRESS > progress
std::string Escape(const std::string &aUrl)
Escapes a string for use as a URL.
bool SetUserAgent(const std::string &aAgent)
Set the request user agent.
std::shared_lock< std::shared_mutex > m_curlSharedLock
int GetResponseStatusCode()
void SetHeader(const std::string &aName, const std::string &aValue)
Set an arbitrary header for the HTTP(s) request.
bool SetTransferCallback(const TRANSFER_CALLBACK &aCallback, size_t aInterval)
bool SetURL(const std::string &aURL)
Set the request URL.
bool SetFollowRedirects(bool aFollow)
Enable the following of HTTP(s) and other redirects, by default curl does not follow redirects.
bool SetConnectTimeout(long aTimeoutSecs)
Set the connection timeout in seconds.
int GetTransferTotal(uint64_t &aDownloadedBytes) const
int setOption(int aOption, T aArg)
Set a curl option, only supports single parameter curl options.
bool SetOutputStream(const std::ostream *aOutput)
const std::string GetErrorText(int aCode)
Fetch CURL's "friendly" error string for a given error code.
Simple wrapper class to call curl_global_init and curl_global_cleanup for KiCad.
static bool IsShuttingDown()
Returns true if all curl operations should terminate.
#define THROW_IO_ERROR(msg)
macro which captures the "call site" values of FILE_, __FUNCTION & LINE
static int progressinfo(void *aProgress, double aDLtotal, double aDLnow, double aULtotal, double aULnow)
static size_t write_callback(void *aContents, size_t aSize, size_t aNmemb, void *aUserp)
static size_t stream_write_callback(void *aContents, size_t aSize, size_t aNmemb, void *aUserp)
std::function< int(size_t, size_t, size_t, size_t)> TRANSFER_CALLBACK
Wrapper interface around the curl_easy API/.
#define POLICY_KEY_REQUESTS_CURL_REVOKE
CURL_PROGRESS(KICAD_CURL_EASY *aCURL, TRANSFER_CALLBACK aCallback, curl_off_t aInterval)
TRANSFER_CALLBACK m_Callback
curl_off_t m_Last_run_time
wxString result
Test unit parsing edge cases and error handling.