diff --git a/src/requester.cpp b/src/requester.cpp index c5fdacb..36cd20d 100644 --- a/src/requester.cpp +++ b/src/requester.cpp @@ -1,16 +1,9 @@ -// -// requester.cpp -// curly -// -// Created by Bob Polis at 2020-09-01 -// Copyright (c) 2020 SwiftCoder. All rights reserved. -// - #include "requester.hpp" -#include +#include #include #include #include +#include extern sc::logger logger; @@ -38,5 +31,27 @@ std::string requester::get(const std::string &url) { curl_easy_setopt(_h.get(), CURLOPT_WRITEDATA, &text); auto success = curl_easy_perform(_h.get()); if (success != CURLE_OK) throw std::runtime_error("could not get remote data"); + long status; + success = curl_easy_getinfo(_h.get(), CURLINFO_RESPONSE_CODE, &status); + if (success != CURLE_OK || status != 200) throw std::runtime_error("could not get remote data"); return text; } + +std::string requester::post(const std::string& url, const std::string& json) { + curl_easy_setopt(_h.get(), CURLOPT_URL, url.c_str()); + curl_easy_setopt(_h.get(), CURLOPT_POST, 1L); + curl_easy_setopt(_h.get(), CURLOPT_POSTFIELDS, json.c_str()); + curl_easy_setopt(_h.get(), CURLOPT_POSTFIELDSIZE, json.size()); + + struct curl_slist* headers {nullptr}; + headers = curl_slist_append(headers, "Content-Type: application/json"); + std::unique_ptr hdrs {headers, curl_slist_free_all}; + curl_easy_setopt(_h.get(), CURLOPT_HTTPHEADER, headers); + + std::string response; + curl_easy_setopt(_h.get(), CURLOPT_WRITEDATA, &response); + + auto success = curl_easy_perform(_h.get()); + if (success != CURLE_OK) throw std::runtime_error("could not post data"); + return response; +} diff --git a/src/requester.hpp b/src/requester.hpp index a4392f3..ce735bc 100644 --- a/src/requester.hpp +++ b/src/requester.hpp @@ -1,11 +1,3 @@ -// -// requester.hpp -// curly -// -// Created by Bob Polis at 2020-09-01 -// Copyright (c) 2020 SwiftCoder. All rights reserved. -// - #ifndef _requester_H_ #define _requester_H_ @@ -31,6 +23,9 @@ class requester { // perform a http get request std::string get(const std::string& url); + // perform a http post request + std::string post(const std::string& url, const std::string& json); + private: std::unique_ptr _h {nullptr, curl_easy_cleanup}; };