]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/jaegertracing/opentelemetry-cpp/third_party/prometheus-cpp/push/src/curl_wrapper.cc
update ceph source to reef 18.1.2
[ceph.git] / ceph / src / jaegertracing / opentelemetry-cpp / third_party / prometheus-cpp / push / src / curl_wrapper.cc
diff --git a/ceph/src/jaegertracing/opentelemetry-cpp/third_party/prometheus-cpp/push/src/curl_wrapper.cc b/ceph/src/jaegertracing/opentelemetry-cpp/third_party/prometheus-cpp/push/src/curl_wrapper.cc
new file mode 100644 (file)
index 0000000..37e5856
--- /dev/null
@@ -0,0 +1,88 @@
+#include "curl_wrapper.h"
+
+#include <stdexcept>
+
+namespace prometheus {
+namespace detail {
+
+static const char CONTENT_TYPE[] =
+    "Content-Type: text/plain; version=0.0.4; charset=utf-8";
+
+CurlWrapper::CurlWrapper(const std::string& username,
+                         const std::string& password) {
+  /* In windows, this will init the winsock stuff */
+  auto error = curl_global_init(CURL_GLOBAL_ALL);
+  if (error) {
+    throw std::runtime_error("Cannot initialize global curl!");
+  }
+
+  curl_ = curl_easy_init();
+  if (!curl_) {
+    curl_global_cleanup();
+    throw std::runtime_error("Cannot initialize easy curl!");
+  }
+
+  if (!username.empty()) {
+    auth_ = username + ":" + password;
+  }
+}
+
+CurlWrapper::~CurlWrapper() {
+  curl_easy_cleanup(curl_);
+  curl_global_cleanup();
+}
+
+int CurlWrapper::performHttpRequest(HttpMethod method, const std::string& uri,
+                                    const std::string& body) {
+  std::lock_guard<std::mutex> l(mutex_);
+
+  curl_easy_reset(curl_);
+  curl_easy_setopt(curl_, CURLOPT_URL, uri.c_str());
+
+  curl_slist* header_chunk = nullptr;
+  header_chunk = curl_slist_append(header_chunk, CONTENT_TYPE);
+  curl_easy_setopt(curl_, CURLOPT_HTTPHEADER, header_chunk);
+
+  if (!body.empty()) {
+    curl_easy_setopt(curl_, CURLOPT_POSTFIELDSIZE, body.size());
+    curl_easy_setopt(curl_, CURLOPT_POSTFIELDS, body.data());
+  }
+
+  if (!auth_.empty()) {
+    curl_easy_setopt(curl_, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
+    curl_easy_setopt(curl_, CURLOPT_USERPWD, auth_.c_str());
+  }
+
+  switch (method) {
+    case HttpMethod::Post:
+      curl_easy_setopt(curl_, CURLOPT_POST, 1L);
+      break;
+
+    case HttpMethod::Put:
+      curl_easy_setopt(curl_, CURLOPT_NOBODY, 0L);
+      curl_easy_setopt(curl_, CURLOPT_CUSTOMREQUEST, "PUT");
+      break;
+
+    case HttpMethod::Delete:
+      curl_easy_setopt(curl_, CURLOPT_HTTPGET, 0L);
+      curl_easy_setopt(curl_, CURLOPT_NOBODY, 0L);
+      curl_easy_setopt(curl_, CURLOPT_CUSTOMREQUEST, "DELETE");
+      break;
+  }
+
+  auto curl_error = curl_easy_perform(curl_);
+
+  long response_code;
+  curl_easy_getinfo(curl_, CURLINFO_RESPONSE_CODE, &response_code);
+
+  curl_slist_free_all(header_chunk);
+
+  if (curl_error != CURLE_OK) {
+    return -curl_error;
+  }
+
+  return response_code;
+}
+
+}  // namespace detail
+}  // namespace prometheus