diff --git a/Source/cmSystemTools.cxx b/Source/cmSystemTools.cxx index 89a241ded..5a0dafc21 100644 --- a/Source/cmSystemTools.cxx +++ b/Source/cmSystemTools.cxx @@ -38,6 +38,8 @@ # include #endif +#include "cm_curl.h" + #include #if defined(_WIN32) && \ @@ -2925,3 +2927,53 @@ bool cmSystemTools::CheckRPath(std::string const& file, return false; #endif } + +//---------------------------------------------------------------------------- +static size_t +HTTPResponseCallback(void *ptr, size_t size, size_t nmemb, void *data) +{ + register int realsize = (int)(size * nmemb); + + std::string *response + = static_cast(data); + const char* chPtr = static_cast(ptr); + *response += chPtr; + + return realsize; +} + +//---------------------------------------------------------------------------- +int cmSystemTools::HTTPRequest(std::string url, HTTPMethod method, + std::string& response, + std::string fields, int timeout) +{ + CURL* curl; + ::curl_global_init(CURL_GLOBAL_ALL); + curl = ::curl_easy_init(); + + //set request options + if(method == cmSystemTools::HTTP_GET && fields.size()) + { + url += "?" + fields; + } + else + { + ::curl_easy_setopt(curl, CURLOPT_POST, 1); + ::curl_easy_setopt(curl, CURLOPT_POSTFIELDS, fields.c_str()); + } + ::curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); + ::curl_easy_setopt(curl, CURLOPT_TIMEOUT, timeout); + ::curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1); + + //set response options + ::curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, HTTPResponseCallback); + ::curl_easy_setopt(curl, CURLOPT_FILE, (void *)&response); + ::curl_easy_setopt(curl, CURLOPT_FAILONERROR, 1); + + CURLcode res = ::curl_easy_perform(curl); + + ::curl_easy_cleanup(curl); + ::curl_global_cleanup(); + + return static_cast(res); +} diff --git a/Source/cmSystemTools.h b/Source/cmSystemTools.h index e5bb305d7..ae397e936 100644 --- a/Source/cmSystemTools.h +++ b/Source/cmSystemTools.h @@ -46,6 +46,18 @@ public: static void ExpandRegistryValues(std::string& source, KeyWOW64 view = KeyWOW64_Default); + enum HTTPMethod { + HTTP_GET, + HTTP_POST + }; + + /** + * Perform an HTTP request. + */ + static int HTTPRequest(std::string url, HTTPMethod method, + std::string& response, + std::string fields = "", int timeout = 10); + /** * Platform independent escape spaces, unix uses backslash, * windows double quotes the string.