summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZach Mullen <zach.mullen@kitware.com>2009-12-21 20:19:57 (GMT)
committerZach Mullen <zach.mullen@kitware.com>2009-12-21 20:19:57 (GMT)
commit3ff0b940556f5e310daa1160c5d2844e63ffeb38 (patch)
tree3d843e45b73935199fa3347f19237c592624793a
parent0bfb954cf8c4b0cbc111c3381916fedfd382b1c0 (diff)
downloadCMake-3ff0b940556f5e310daa1160c5d2844e63ffeb38.zip
CMake-3ff0b940556f5e310daa1160c5d2844e63ffeb38.tar.gz
CMake-3ff0b940556f5e310daa1160c5d2844e63ffeb38.tar.bz2
Added functionality to allow CTest to easily access web APIs. This will be used for better communication with CDash.
-rw-r--r--Source/cmSystemTools.cxx52
-rw-r--r--Source/cmSystemTools.h12
2 files changed, 64 insertions, 0 deletions
diff --git a/Source/cmSystemTools.cxx b/Source/cmSystemTools.cxx
index 89a241d..5a0dafc 100644
--- a/Source/cmSystemTools.cxx
+++ b/Source/cmSystemTools.cxx
@@ -38,6 +38,8 @@
# include <sys/wait.h>
#endif
+#include "cm_curl.h"
+
#include <sys/stat.h>
#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<std::string*>(data);
+ const char* chPtr = static_cast<char*>(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<int>(res);
+}
diff --git a/Source/cmSystemTools.h b/Source/cmSystemTools.h
index e5bb305..ae397e9 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.