63static size_t write_callback(
void* aContents,
size_t aSize,
size_t aNmemb,
void* aUserp )
65 size_t realsize = aSize * aNmemb;
67 std::string* p =
static_cast<std::string*
>( aUserp );
69 p->append(
static_cast<const char*
>( aContents ), realsize );
77 size_t realsize = aSize * aNmemb;
79 std::ostream* p =
static_cast<std::ostream*
>( aUserp );
81 p->write(
static_cast<const char*
>( aContents ), realsize );
86#if LIBCURL_VERSION_NUM >= 0x072000
88static int xferinfo(
void* aProgress, curl_off_t aDLtotal, curl_off_t aDLnow, curl_off_t aULtotal,
92 curl_off_t curtime = 0;
94 curl_easy_getinfo( progress->
m_Curl->
GetCurl(), CURLINFO_TOTAL_TIME, &curtime );
99 return progress->
m_Callback( aDLtotal, aDLnow, aULtotal, aULnow );
107static int progressinfo(
void* aProgress,
double aDLtotal,
double aDLnow,
double aULtotal,
double aULnow )
109 return xferinfo( aProgress,
static_cast<curl_off_t
>( aDLtotal ),
static_cast<curl_off_t
>( aDLnow ),
110 static_cast<curl_off_t
>( aULtotal ),
static_cast<curl_off_t
>( aULnow ) );
119 m_CURL = curl_easy_init();
125 curl_easy_setopt(
m_CURL, CURLOPT_WRITEDATA,
static_cast<void*
>( &
m_buffer ) );
128#if LIBCURL_VERSION_NUM >= 0x075500
129 curl_easy_setopt(
m_CURL, CURLOPT_PROTOCOLS_STR,
"http,https");
131 curl_easy_setopt(
m_CURL, CURLOPT_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTPS );
135 long sslOpts = CURLSSLOPT_NATIVE_CA;
138 if( policyState == POLICY_CURL_SSL_REVOKE::BEST_EFFORT )
140 sslOpts |= CURLSSLOPT_REVOKE_BEST_EFFORT;
142 else if( policyState == POLICY_CURL_SSL_REVOKE::NONE )
144 sslOpts |= CURLSSLOPT_NO_REVOKE;
148 curl_easy_setopt(
m_CURL, CURLOPT_SSL_OPTIONS, sslOpts );
151 if( wxGetEnv( wxT(
"KICAD_CURL_VERBOSE" ),
nullptr ) )
154 curl_easy_setopt(
m_CURL, CURLOPT_VERBOSE, 1L );
157 wxPlatformInfo platformInfo;
158 wxString application( wxS(
"KiCad" ) );
162#if defined( KICAD_BUILD_ARCH_X64 )
163 platform << wxS(
";64-bit" );
164#elif defined( KICAD_BUILD_ARCH_X86 )
165 platform << wxS(
";32-bit" );
166#elif defined( KICAD_BUILD_ARCH_ARM )
167 platform << wxS(
";ARM 32-bit" );
168#elif defined( KICAD_BUILD_ARCH_ARM64 )
169 platform << wxS(
";ARM 64-bit" );
172 platform << wxS(
")" );
174 wxString user_agent = wxS(
"KiCad/" ) + version + wxS(
" " ) + platform + wxS(
" " ) + application;
177 setOption<const char*>( CURLOPT_USERAGENT, user_agent.ToStdString().c_str() );
178 setOption( CURLOPT_ACCEPT_ENCODING,
"gzip,deflate" );
187 curl_easy_cleanup(
m_CURL );
199 return curl_easy_perform(
m_CURL );
205 std::string header = aName +
':' + aValue;
213 return curl_easy_setopt(
m_CURL,
static_cast<CURLoption
>( aOption ), aArg );
219 return curl_easy_strerror(
static_cast<CURLcode
>( aCode ) );
225 if( setOption<const char*>( CURLOPT_USERAGENT, aAgent.c_str() ) == CURLE_OK )
233 const std::vector<std::pair<std::string, std::string>>& aFields )
235 std::string postfields;
237 for(
size_t i = 0; i < aFields.size(); i++ )
242 postfields +=
Escape( aFields[i].first );
244 postfields +=
Escape( aFields[i].second );
247 if( setOption<const char*>( CURLOPT_COPYPOSTFIELDS, postfields.c_str() ) != CURLE_OK )
256 if( setOption<const char*>( CURLOPT_COPYPOSTFIELDS, aField.c_str() ) != CURLE_OK )
265 if( setOption<const char*>( CURLOPT_URL, aURL.c_str() ) == CURLE_OK )
273 curl_easy_setopt(
m_CURL, CURLOPT_PROXY,
static_cast<const char*
>( cfg.
host.c_str() ) );
277 curl_easy_setopt(
m_CURL, CURLOPT_PROXYUSERNAME,
278 static_cast<const char*
>( cfg.
username.c_str() ) );
283 curl_easy_setopt(
m_CURL, CURLOPT_PROXYPASSWORD,
284 static_cast<const char*
>( cfg.
password.c_str() ) );
297 if( setOption<long>( CURLOPT_FOLLOWLOCATION, ( aFollow ? 1 : 0 ) ) == CURLE_OK )
306 char* escaped = curl_easy_escape(
m_CURL, aUrl.c_str(), aUrl.length() );
308 std::string ret( escaped );
309 curl_free( escaped );
317 progress = std::make_unique<CURL_PROGRESS>(
this, aCallback,
318 static_cast<curl_off_t
>( aInterval ) );
319#if LIBCURL_VERSION_NUM >= 0x072000
320 setOption( CURLOPT_XFERINFOFUNCTION, xferinfo );
334 curl_easy_setopt(
m_CURL, CURLOPT_WRITEDATA,
reinterpret_cast<const void*
>( aOutput ) );
341#if LIBCURL_VERSION_NUM >= 0x073700
343 int result = curl_easy_getinfo(
m_CURL, CURLINFO_SIZE_DOWNLOAD_T, &dl );
344 aDownloadedBytes =
static_cast<uint64_t
>( dl );
347 int result = curl_easy_getinfo(
m_CURL, CURLINFO_SIZE_DOWNLOAD, &dl );
348 aDownloadedBytes =
static_cast<uint64_t
>( dl );
357 curl_easy_getinfo(
m_CURL, CURLINFO_RESPONSE_CODE, &http_code );
359 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.
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.
#define THROW_IO_ERROR(msg)
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