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 );
 
  143    long sslOpts = CURLSSLOPT_NATIVE_CA;
 
  150        sslOpts |= CURLSSLOPT_REVOKE_BEST_EFFORT;
 
  154        sslOpts |= CURLSSLOPT_NO_REVOKE;
 
  158    curl_easy_setopt( 
m_CURL, CURLOPT_SSL_OPTIONS, sslOpts );
 
  161    if( wxGetEnv( wxT( 
"KICAD_CURL_VERBOSE" ), 
nullptr ) )
 
  164        curl_easy_setopt( 
m_CURL, CURLOPT_VERBOSE, 1L );
 
  167    wxString application( wxS( 
"KiCad" ) );
 
  171#if defined( KICAD_BUILD_ARCH_X64 ) 
  172    platform << wxS( 
";64-bit" );
 
  173#elif defined( KICAD_BUILD_ARCH_X86 ) 
  174    platform << wxS( 
";32-bit" );
 
  175#elif defined( KICAD_BUILD_ARCH_ARM ) 
  176    platform << wxS( 
";ARM 32-bit" );
 
  177#elif defined( KICAD_BUILD_ARCH_ARM64 ) 
  178    platform << wxS( 
";ARM 64-bit" );
 
  181    platform << wxS( 
")" );
 
  183    wxString user_agent = wxS( 
"KiCad/" ) + version + wxS( 
" " ) + platform + wxS( 
" " ) + application;
 
  187    setOption( CURLOPT_ACCEPT_ENCODING, 
"gzip,deflate" );
 
 
  196    curl_easy_cleanup( 
m_CURL );
 
 
  208    return curl_easy_perform( 
m_CURL );
 
 
  214    std::string header = aName + 
':' + aValue;
 
 
  222    return curl_easy_setopt( 
m_CURL, 
static_cast<CURLoption
>( aOption ), aArg );
 
 
  228    return curl_easy_strerror( 
static_cast<CURLcode
>( aCode ) );
 
 
  243    std::string postfields;
 
  245    for( 
size_t i = 0; i < aFields.size(); i++ )
 
  250        postfields += 
Escape( aFields[i].first );
 
  252        postfields += 
Escape( aFields[i].second );
 
 
  281            curl_easy_setopt( 
m_CURL, CURLOPT_PROXY, 
static_cast<const char*
>( cfg.
host.c_str() ) );
 
  285                curl_easy_setopt( 
m_CURL, CURLOPT_PROXYUSERNAME,
 
  286                                  static_cast<const char*
>( cfg.
username.c_str() ) );
 
  291                curl_easy_setopt( 
m_CURL, CURLOPT_PROXYPASSWORD,
 
  292                                  static_cast<const char*
>( cfg.
password.c_str() ) );
 
 
  305    if( 
setOption<long>( CURLOPT_FOLLOWLOCATION, ( aFollow ? 1 : 0 ) ) == CURLE_OK )
 
 
  314    char* escaped = curl_easy_escape( 
m_CURL, aUrl.c_str(), aUrl.length() );
 
  316    std::string ret( escaped );
 
  317    curl_free( escaped );
 
 
  325    progress = std::make_unique<CURL_PROGRESS>( 
this, aCallback, 
static_cast<curl_off_t
>( aInterval ) );
 
  327#if LIBCURL_VERSION_NUM >= 0x072000  
  328    setOption( CURLOPT_XFERINFOFUNCTION, xferinfo );
 
 
  343    curl_easy_setopt( 
m_CURL, CURLOPT_WRITEDATA, 
reinterpret_cast<const void*
>( aOutput ) );
 
 
  350#if LIBCURL_VERSION_NUM >= 0x073700  
  352    int        result = curl_easy_getinfo( 
m_CURL, CURLINFO_SIZE_DOWNLOAD_T, &dl );
 
  353    aDownloadedBytes  = 
static_cast<uint64_t
>( dl );
 
  356    int    result = curl_easy_getinfo( 
m_CURL, CURLINFO_SIZE_DOWNLOAD, &dl );
 
  357    aDownloadedBytes = 
static_cast<uint64_t
>( dl );
 
 
  367    curl_easy_getinfo( 
m_CURL, CURLINFO_RESPONSE_CODE, &http_code );
 
  369    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.
 
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.