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 );
87#if LIBCURL_VERSION_NUM >= 0x072000
89static int xferinfo(
void* aProgress, curl_off_t aDLtotal, curl_off_t aDLnow, curl_off_t aULtotal,
93 curl_off_t curtime = 0;
95 curl_easy_getinfo( progress->
m_Curl->
GetCurl(), CURLINFO_TOTAL_TIME, &curtime );
100 return progress->
m_Callback( aDLtotal, aDLnow, aULtotal, aULnow );
108static int progressinfo(
void* aProgress,
double aDLtotal,
double aDLnow,
double aULtotal,
double aULnow )
110 return xferinfo( aProgress,
static_cast<curl_off_t
>( aDLtotal ),
static_cast<curl_off_t
>( aDLnow ),
111 static_cast<curl_off_t
>( aULtotal ),
static_cast<curl_off_t
>( aULnow ) );
120 m_CURL = curl_easy_init();
126 curl_easy_setopt(
m_CURL, CURLOPT_WRITEDATA,
static_cast<void*
>( &
m_buffer ) );
129#if LIBCURL_VERSION_NUM >= 0x075500
130 curl_easy_setopt(
m_CURL, CURLOPT_PROTOCOLS_STR,
"http,https");
132 curl_easy_setopt(
m_CURL, CURLOPT_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTPS );
136 long sslOpts = CURLSSLOPT_NATIVE_CA;
139 if( policyState == POLICY_CURL_SSL_REVOKE::BEST_EFFORT )
141 sslOpts |= CURLSSLOPT_REVOKE_BEST_EFFORT;
143 else if( policyState == POLICY_CURL_SSL_REVOKE::NONE )
145 sslOpts |= CURLSSLOPT_NO_REVOKE;
149 curl_easy_setopt(
m_CURL, CURLOPT_SSL_OPTIONS, sslOpts );
152 if( wxGetEnv( wxT(
"KICAD_CURL_VERBOSE" ),
nullptr ) )
155 curl_easy_setopt(
m_CURL, CURLOPT_VERBOSE, 1L );
158 wxPlatformInfo platformInfo;
159 wxString application(
Pgm().App().GetAppName() );
163#if defined( KICAD_BUILD_ARCH_X64 )
164 platform << wxS(
";64-bit" );
165#elif defined( KICAD_BUILD_ARCH_X86 )
166 platform << wxS(
";32-bit" );
167#elif defined( KICAD_BUILD_ARCH_ARM )
168 platform << wxS(
";ARM 32-bit" );
169#elif defined( KICAD_BUILD_ARCH_ARM64 )
170 platform << wxS(
";ARM 64-bit" );
173 platform << wxS(
")" );
175 wxString user_agent = wxS(
"KiCad/" ) + version + wxS(
" " ) + platform + wxS(
" " ) + application;
178 setOption<const char*>( CURLOPT_USERAGENT, user_agent.ToStdString().c_str() );
179 setOption( CURLOPT_ACCEPT_ENCODING,
"gzip,deflate" );
188 curl_easy_cleanup(
m_CURL );
200 return curl_easy_perform(
m_CURL );
206 std::string header = aName +
':' + aValue;
214 return curl_easy_setopt(
m_CURL,
static_cast<CURLoption
>( aOption ), aArg );
220 return curl_easy_strerror(
static_cast<CURLcode
>( aCode ) );
226 if( setOption<const char*>( CURLOPT_USERAGENT, aAgent.c_str() ) == CURLE_OK )
234 const std::vector<std::pair<std::string, std::string>>& aFields )
236 std::string postfields;
238 for(
size_t i = 0; i < aFields.size(); i++ )
243 postfields +=
Escape( aFields[i].first );
245 postfields +=
Escape( aFields[i].second );
248 if( setOption<const char*>( CURLOPT_COPYPOSTFIELDS, postfields.c_str() ) != CURLE_OK )
257 if( setOption<const char*>( CURLOPT_URL, aURL.c_str() ) == CURLE_OK )
265 curl_easy_setopt(
m_CURL, CURLOPT_PROXY,
static_cast<const char*
>( cfg.
host.c_str() ) );
269 curl_easy_setopt(
m_CURL, CURLOPT_PROXYUSERNAME,
270 static_cast<const char*
>( cfg.
username.c_str() ) );
275 curl_easy_setopt(
m_CURL, CURLOPT_PROXYPASSWORD,
276 static_cast<const char*
>( cfg.
password.c_str() ) );
289 if( setOption<long>( CURLOPT_FOLLOWLOCATION, ( aFollow ? 1 : 0 ) ) == CURLE_OK )
298 char* escaped = curl_easy_escape(
m_CURL, aUrl.c_str(), aUrl.length() );
300 std::string ret( escaped );
301 curl_free( escaped );
309 progress = std::make_unique<CURL_PROGRESS>(
this, aCallback,
310 static_cast<curl_off_t
>( aInterval ) );
311#if LIBCURL_VERSION_NUM >= 0x072000
312 setOption( CURLOPT_XFERINFOFUNCTION, xferinfo );
326 curl_easy_setopt(
m_CURL, CURLOPT_WRITEDATA,
reinterpret_cast<const void*
>( aOutput ) );
333#if LIBCURL_VERSION_NUM >= 0x073700
335 int result = curl_easy_getinfo(
m_CURL, CURLINFO_SIZE_DOWNLOAD_T, &dl );
336 aDownloadedBytes =
static_cast<uint64_t
>( dl );
339 int result = curl_easy_getinfo(
m_CURL, CURLINFO_SIZE_DOWNLOAD, &dl );
340 aDownloadedBytes =
static_cast<uint64_t
>( dl );
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.
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
KIWAY Kiway & Pgm(), KFCTL_STANDALONE
The global Program "get" accessor.
CURL_PROGRESS(KICAD_CURL_EASY *aCURL, TRANSFER_CALLBACK aCallback, curl_off_t aInterval)
TRANSFER_CALLBACK m_Callback
curl_off_t m_Last_run_time