KiCad PCB EDA Suite
KICAD_CURL_EASY Class Reference

#include <kicad_curl_easy.h>

Public Member Functions

 KICAD_CURL_EASY ()
 
 ~KICAD_CURL_EASY ()
 
int Perform ()
 Equivalent to curl_easy_perform. More...
 
void SetHeader (const std::string &aName, const std::string &aValue)
 Set an arbitrary header for the HTTP(s) request. More...
 
bool SetUserAgent (const std::string &aAgent)
 Set the request user agent. More...
 
bool SetURL (const std::string &aURL)
 Set the request URL. More...
 
bool SetFollowRedirects (bool aFollow)
 Enable the following of HTTP(s) and other redirects, by default curl does not follow redirects. More...
 
const std::string GetErrorText (int aCode)
 Fetch CURL's "friendly" error string for a given error code. More...
 
int GetTransferTotal (uint64_t &aDownloadedBytes) const
 
const std::string & GetBuffer ()
 Return a reference to the received data buffer. More...
 
std::string Escape (const std::string &aUrl)
 Escapes a string for use as a URL. More...
 
bool SetTransferCallback (const TRANSFER_CALLBACK &aCallback, size_t aInterval)
 
bool SetOutputStream (const std::ostream *aOutput)
 
CURLGetCurl ()
 

Private Member Functions

template<typename T >
int setOption (int aOption, T aArg)
 Set a curl option, only supports single parameter curl options. More...
 

Private Attributes

CURLm_CURL
 
curl_slist * m_headers
 
std::string m_buffer
 
std::unique_ptr< CURL_PROGRESSprogress
 

Detailed Description

Definition at line 66 of file kicad_curl_easy.h.

Constructor & Destructor Documentation

◆ KICAD_CURL_EASY()

KICAD_CURL_EASY::KICAD_CURL_EASY ( )

Definition at line 111 of file kicad_curl_easy.cpp.

111 :
112 m_headers( nullptr )
113{
114 // Call KICAD_CURL::Init() from in here every time, but only the first time
115 // will incur any overhead. This strategy ensures that libcurl is never loaded
116 // unless it is needed.
117
119
120 m_CURL = curl_easy_init();
121
122 if( !m_CURL )
123 THROW_IO_ERROR( "Unable to initialize CURL session" );
124
125 curl_easy_setopt( m_CURL, CURLOPT_WRITEFUNCTION, write_callback );
126 curl_easy_setopt( m_CURL, CURLOPT_WRITEDATA, static_cast<void*>( &m_buffer ) );
127
128 // Only allow HTTP and HTTPS protocols
129 curl_easy_setopt( m_CURL, CURLOPT_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTPS );
130
131 #ifdef _WIN32
132 // We need this to use the Windows Certificate store
133 curl_easy_setopt( m_CURL, CURLOPT_SSL_OPTIONS, CURLSSLOPT_NATIVE_CA );
134 #endif
135
136 wxPlatformInfo platformInfo;
137 wxString application( Pgm().App().GetAppName() );
138 wxString version( GetBuildVersion() );
139 wxString platform = "(" + wxGetOsDescription() + ";" + GetPlatformGetBitnessName();
140
141#if defined( KICAD_BUILD_ARCH_X64 )
142 platform << ";64-bit";
143#elif defined( KICAD_BUILD_ARCH_X86 )
144 platform << ";32-bit";
145#elif defined( KICAD_BUILD_ARCH_ARM )
146 platform << ";ARM 32-bit";
147#elif defined( KICAD_BUILD_ARCH_ARM64 )
148 platform << ";ARM 64-bit";
149#endif
150
151 platform << ")";
152
153 wxString user_agent = "KiCad/" + version + " " + platform + " " + application;
154
155 user_agent << "/" << GetBuildDate();
156 setOption<const char*>( CURLOPT_USERAGENT, user_agent.ToStdString().c_str() );
157 setOption( CURLOPT_ACCEPT_ENCODING, "gzip,deflate" );
158}
wxString GetBuildVersion()
Get the full KiCad version string.
wxString GetPlatformGetBitnessName()
wxString GetBuildDate()
Get the build date as a string.
std::string m_buffer
curl_slist * m_headers
int setOption(int aOption, T aArg)
Set a curl option, only supports single parameter curl options.
static void Init()
Call curl_global_init for the application.
Definition: kicad_curl.cpp:50
#define THROW_IO_ERROR(msg)
Definition: ki_exception.h:38
static size_t write_callback(void *aContents, size_t aSize, size_t aNmemb, void *aUserp)
KIWAY Kiway & Pgm(), KFCTL_STANDALONE
The global Program "get" accessor.
Definition: single_top.cpp:111

References GetBuildDate(), GetBuildVersion(), GetPlatformGetBitnessName(), KICAD_CURL::Init(), m_buffer, m_CURL, Pgm(), setOption(), THROW_IO_ERROR, and write_callback().

◆ ~KICAD_CURL_EASY()

KICAD_CURL_EASY::~KICAD_CURL_EASY ( )

Definition at line 161 of file kicad_curl_easy.cpp.

162{
163 if( m_headers )
164 curl_slist_free_all( m_headers );
165
166 curl_easy_cleanup( m_CURL );
167}

References m_CURL, and m_headers.

Member Function Documentation

◆ Escape()

std::string KICAD_CURL_EASY::Escape ( const std::string &  aUrl)

Escapes a string for use as a URL.

Definition at line 252 of file kicad_curl_easy.cpp.

253{
254 char* escaped = curl_easy_escape( m_CURL, aUrl.c_str(), aUrl.length() );
255
256 std::string ret( escaped );
257 curl_free( escaped );
258
259 return ret;
260}

References m_CURL.

Referenced by COMMON_CONTROL::ReportBug().

◆ GetBuffer()

const std::string & KICAD_CURL_EASY::GetBuffer ( )
inline

Return a reference to the received data buffer.

Definition at line 123 of file kicad_curl_easy.h.

123{ return m_buffer; }

References m_buffer.

◆ GetCurl()

CURL * KICAD_CURL_EASY::GetCurl ( )
inline

Definition at line 132 of file kicad_curl_easy.h.

132{ return m_CURL; }

References m_CURL.

Referenced by xferinfo().

◆ GetErrorText()

const std::string KICAD_CURL_EASY::GetErrorText ( int  aCode)

Fetch CURL's "friendly" error string for a given error code.

Parameters
aCodeis CURL error code.
Returns
The corresponding error string for the given code.

Definition at line 196 of file kicad_curl_easy.cpp.

197{
198 return curl_easy_strerror( static_cast<CURLcode>( aCode ) );
199}

Referenced by PCM_TASK_MANAGER::downloadFile(), and PLUGIN_CONTENT_MANAGER::DownloadToStream().

◆ GetTransferTotal()

int KICAD_CURL_EASY::GetTransferTotal ( uint64_t &  aDownloadedBytes) const

Definition at line 287 of file kicad_curl_easy.cpp.

288{
289#ifdef CURLINFO_SIZE_DOWNLOAD_T
290 curl_off_t dl;
291 int result = curl_easy_getinfo( m_CURL, CURLINFO_SIZE_DOWNLOAD_T, &dl );
292 aDownloadedBytes = static_cast<uint64_t>( dl );
293#else
294 double dl;
295 int result = curl_easy_getinfo( m_CURL, CURLINFO_SIZE_DOWNLOAD, &dl );
296 aDownloadedBytes = static_cast<uint64_t>( dl );
297#endif
298 return result;
299}

References m_CURL.

Referenced by PCM_TASK_MANAGER::downloadFile().

◆ Perform()

int KICAD_CURL_EASY::Perform ( )

Equivalent to curl_easy_perform.

Executes the request that was previously setup.

Definition at line 170 of file kicad_curl_easy.cpp.

171{
172 if( m_headers )
173 curl_easy_setopt( m_CURL, CURLOPT_HTTPHEADER, m_headers );
174
175 // bonus: retain worst case memory allocation, should re-use occur
176 m_buffer.clear();
177
178 return curl_easy_perform( m_CURL );
179}

References m_buffer, m_CURL, and m_headers.

Referenced by PCM_TASK_MANAGER::downloadFile(), and PLUGIN_CONTENT_MANAGER::DownloadToStream().

◆ SetFollowRedirects()

bool KICAD_CURL_EASY::SetFollowRedirects ( bool  aFollow)

Enable the following of HTTP(s) and other redirects, by default curl does not follow redirects.

Parameters
aFollowis a boolean where true will enable following redirects.
Returns
True if successful, false if not.

Definition at line 243 of file kicad_curl_easy.cpp.

244{
245 if( setOption<long>( CURLOPT_FOLLOWLOCATION, ( aFollow ? 1 : 0 ) ) == CURLE_OK )
246 return true;
247
248 return false;
249}

Referenced by PCM_TASK_MANAGER::downloadFile(), and PLUGIN_CONTENT_MANAGER::DownloadToStream().

◆ SetHeader()

void KICAD_CURL_EASY::SetHeader ( const std::string &  aName,
const std::string &  aValue 
)

Set an arbitrary header for the HTTP(s) request.

Parameters
aNameis the left hand side of the header, i.e. Accept without the colon.
aValueis the right hand side of the header, i.e. application/json.

Definition at line 182 of file kicad_curl_easy.cpp.

183{
184 std::string header = aName + ':' + aValue;
185 m_headers = curl_slist_append( m_headers, header.c_str() );
186}

References m_headers.

◆ setOption()

template<typename T >
int KICAD_CURL_EASY::setOption ( int  aOption,
aArg 
)
private

Set a curl option, only supports single parameter curl options.

Parameters
aOptionis CURL option, see CURL manual for options.
aArgis the argument being passed to CURL, ensure it is the right type per manual.
Returns
A CURL error code, will return CURLE_OK unless a problem was encountered.

Definition at line 190 of file kicad_curl_easy.cpp.

191{
192 return curl_easy_setopt( m_CURL, static_cast<CURLoption>( aOption ), aArg );
193}

References m_CURL.

Referenced by KICAD_CURL_EASY(), and SetTransferCallback().

◆ SetOutputStream()

bool KICAD_CURL_EASY::SetOutputStream ( const std::ostream *  aOutput)

Definition at line 279 of file kicad_curl_easy.cpp.

280{
281 curl_easy_setopt( m_CURL, CURLOPT_WRITEFUNCTION, stream_write_callback );
282 curl_easy_setopt( m_CURL, CURLOPT_WRITEDATA, reinterpret_cast<const void*>( aOutput ) );
283 return true;
284}
static size_t stream_write_callback(void *aContents, size_t aSize, size_t aNmemb, void *aUserp)

References m_CURL, and stream_write_callback().

Referenced by PCM_TASK_MANAGER::downloadFile(), and PLUGIN_CONTENT_MANAGER::DownloadToStream().

◆ SetTransferCallback()

bool KICAD_CURL_EASY::SetTransferCallback ( const TRANSFER_CALLBACK aCallback,
size_t  aInterval 
)

Definition at line 263 of file kicad_curl_easy.cpp.

264{
265 progress = std::make_unique<CURL_PROGRESS>( this, aCallback,
266 static_cast<curl_off_t>( aInterval ) );
267#ifdef CURLOPT_XFERINFOFUNCTION
268 setOption( CURLOPT_XFERINFOFUNCTION, xferinfo );
269 setOption( CURLOPT_XFERINFODATA, progress.get() );
270#else
271 setOption( CURLOPT_PROGRESSFUNCTION, progressinfo );
272 setOption( CURLOPT_PROGRESSDATA, progress.get() );
273#endif
274 setOption( CURLOPT_NOPROGRESS, 0L );
275 return true;
276}
std::unique_ptr< CURL_PROGRESS > progress
static int progressinfo(void *aProgress, double aDLtotal, double aDLnow, double aULtotal, double aULnow)
static int xferinfo(void *aProgress, curl_off_t aDLtotal, curl_off_t aDLnow, curl_off_t aULtotal, curl_off_t aULnow)

References progress, progressinfo(), setOption(), and xferinfo().

Referenced by PCM_TASK_MANAGER::downloadFile(), and PLUGIN_CONTENT_MANAGER::DownloadToStream().

◆ SetURL()

bool KICAD_CURL_EASY::SetURL ( const std::string &  aURL)

Set the request URL.

Parameters
aURLis the URL.
Returns
True if successful, false if not.

Definition at line 211 of file kicad_curl_easy.cpp.

212{
213 if( setOption<const char*>( CURLOPT_URL, aURL.c_str() ) == CURLE_OK )
214 {
216
217 // Unfortunately on Windows land, proxies can be configured depending on destination url
218 // So we also check and set any proxy config here
220 {
221 curl_easy_setopt( m_CURL, CURLOPT_PROXY, static_cast<const char*>( cfg.host.c_str() ) );
222
223 if( !cfg.username.empty() )
224 {
225 curl_easy_setopt( m_CURL, CURLOPT_PROXYUSERNAME,
226 static_cast<const char*>( cfg.username.c_str() ) );
227 }
228
229 if( !cfg.password.empty() )
230 {
231 curl_easy_setopt( m_CURL, CURLOPT_PROXYPASSWORD,
232 static_cast<const char*>( cfg.password.c_str() ) );
233 }
234 }
235
236 return true;
237 }
238
239 return false;
240}
bool GetSystemProxyConfig(const wxString &aURL, PROXY_CONFIG &aCfg)
Retrieves platform level proxying requirements to reach the given url.

References KIPLATFORM::ENV::GetSystemProxyConfig(), KIPLATFORM::ENV::PROXY_CONFIG::host, m_CURL, KIPLATFORM::ENV::PROXY_CONFIG::password, and KIPLATFORM::ENV::PROXY_CONFIG::username.

Referenced by PCM_TASK_MANAGER::downloadFile(), and PLUGIN_CONTENT_MANAGER::DownloadToStream().

◆ SetUserAgent()

bool KICAD_CURL_EASY::SetUserAgent ( const std::string &  aAgent)

Set the request user agent.

Parameters
aAgentis the string to set for the user agent.
Returns
True if successful, false if not.

Definition at line 202 of file kicad_curl_easy.cpp.

203{
204 if( setOption<const char*>( CURLOPT_USERAGENT, aAgent.c_str() ) == CURLE_OK )
205 return true;
206
207 return false;
208}

Member Data Documentation

◆ m_buffer

std::string KICAD_CURL_EASY::m_buffer
private

Definition at line 148 of file kicad_curl_easy.h.

Referenced by GetBuffer(), KICAD_CURL_EASY(), and Perform().

◆ m_CURL

CURL* KICAD_CURL_EASY::m_CURL
private

◆ m_headers

curl_slist* KICAD_CURL_EASY::m_headers
private

Definition at line 147 of file kicad_curl_easy.h.

Referenced by Perform(), SetHeader(), and ~KICAD_CURL_EASY().

◆ progress

std::unique_ptr<CURL_PROGRESS> KICAD_CURL_EASY::progress
private

Definition at line 149 of file kicad_curl_easy.h.

Referenced by SetTransferCallback().


The documentation for this class was generated from the following files: