#include <CurlInterface.h>
Public Types | |
typedef std::vector< char > | Content |
Public Member Functions | |
CURLcode | getContent (const std::string &url, const std::string &user, Content &content) |
CURLcode | postBinaryMessage (const std::string &url, void *buf, size_t size, Content &content) |
~CurlInterface () | |
Static Public Member Functions | |
static boost::shared_ptr < CurlInterface > | getInterface () |
Private Member Functions | |
CurlInterface () | |
CURLcode | do_curl (CURL *, const std::string &url, Content &content) |
Static Private Member Functions | |
static unsigned long | sslIdFunction () |
static void | sslLockingFunction (int mode, int n, const char *file, int line) |
static size_t | writeToString (char *data, size_t size, size_t nmemb, Content *buffer) |
Static Private Attributes | |
static boost::shared_ptr < CurlInterface > | interface_ |
static pthread_mutex_t * | mutexes_ = 0 |
Helper class to interact with curl
Definition at line 26 of file CurlInterface.h.
typedef std::vector<char> stor::CurlInterface::Content |
Definition at line 31 of file CurlInterface.h.
CurlInterface::~CurlInterface | ( | ) |
CurlInterface::CurlInterface | ( | ) | [private] |
Definition at line 13 of file CurlInterface.cc.
References Exception, i, mutexes_, sslIdFunction(), and sslLockingFunction().
Referenced by getInterface().
{ curl_global_init(CURL_GLOBAL_ALL); const int cryptoNumLocks = CRYPTO_num_locks(); //setup array to store all of the mutexes available to OpenSSL. mutexes_ = (pthread_mutex_t*)malloc( cryptoNumLocks * sizeof(pthread_mutex_t) ); if ( ! mutexes_ ) XCEPT_RAISE(stor::exception::Exception, "Failed to allocate memory for SSL mutexes"); for (int i = 0; i < cryptoNumLocks; ++i) pthread_mutex_init(&mutexes_[i],0); CRYPTO_set_id_callback(sslIdFunction); CRYPTO_set_locking_callback(sslLockingFunction); }
CURLcode CurlInterface::do_curl | ( | CURL * | curl, |
const std::string & | url, | ||
Content & | content | ||
) | [private] |
Definition at line 98 of file CurlInterface.cc.
References i, runEdmFileComparison::returnCode, and writeToString().
{ char errorBuffer[CURL_ERROR_SIZE]; curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); curl_easy_setopt(curl, CURLOPT_TIMEOUT, 4); // seconds curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1); // do not send any signals curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, stor::CurlInterface::writeToString); curl_easy_setopt(curl, CURLOPT_WRITEDATA, &content); curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errorBuffer); curl_easy_setopt(curl, CURLOPT_FAILONERROR,1); const CURLcode returnCode = curl_easy_perform(curl); curl_easy_cleanup(curl); if (returnCode != CURLE_OK) { size_t i = 0; content.clear(); while ( errorBuffer[i] != '\0' ) { content.push_back( errorBuffer[i] ); ++i; } content.push_back('\0'); } return returnCode; }
CURLcode CurlInterface::getContent | ( | const std::string & | url, |
const std::string & | user, | ||
Content & | content | ||
) |
Get webpage content from specified URL using the user/password specified. If the return value is CURLE_OK, the webpage could be fetched and the content is in the content string. Otherwise, the content string contains the error message.
Definition at line 57 of file CurlInterface.cc.
boost::shared_ptr< CurlInterface > CurlInterface::getInterface | ( | ) | [static] |
Return a shared pointer to the singleton
Definition at line 45 of file CurlInterface.cc.
References CurlInterface(), and interface_.
Referenced by stor::ResourceMonitorCollection::checkSataDisks(), and stor::EventServerProxy< RegInfo >::getInitMsgFromEventServer().
{ if (interface_.get() == 0) { interface_.reset( new CurlInterface() ); } return interface_; }
CURLcode CurlInterface::postBinaryMessage | ( | const std::string & | url, |
void * | buf, | ||
size_t | size, | ||
Content & | content | ||
) |
Post message a message at the given location. If the return value is CURLE_OK, the post succeeded and the reply is in the content string. Otherwise, the content string contains the error message.
Definition at line 73 of file CurlInterface.cc.
References NULL, and ntuplemaker::status.
{ CURL* curl = curl_easy_init(); if ( ! curl ) return CURLE_FAILED_INIT; curl_easy_setopt(curl, CURLOPT_POSTFIELDS, buf); curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, size); struct curl_slist *headers=NULL; headers = curl_slist_append(headers, "Content-Type: application/octet-stream"); headers = curl_slist_append(headers, "Content-Transfer-Encoding: binary"); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); const CURLcode status = do_curl(curl, url, content); curl_slist_free_all(headers); return status; }
unsigned long CurlInterface::sslIdFunction | ( | void | ) | [static, private] |
Definition at line 149 of file CurlInterface.cc.
Referenced by CurlInterface().
{ return ( (unsigned long)pthread_self() ); }
void CurlInterface::sslLockingFunction | ( | int | mode, |
int | n, | ||
const char * | file, | ||
int | line | ||
) | [static, private] |
Definition at line 140 of file CurlInterface.cc.
References mutexes_.
Referenced by CurlInterface().
size_t CurlInterface::writeToString | ( | char * | data, |
size_t | size, | ||
size_t | nmemb, | ||
Content * | buffer | ||
) | [static, private] |
CurlInterfacePtr CurlInterface::interface_ [static, private] |
Definition at line 67 of file CurlInterface.h.
Referenced by getInterface().
pthread_mutex_t * CurlInterface::mutexes_ = 0 [static, private] |
Definition at line 68 of file CurlInterface.h.
Referenced by CurlInterface(), sslLockingFunction(), and ~CurlInterface().