Enable chose http version, get response headers, http and curl status code

dev v0.5
marcelb 10 months ago
parent 16440a9c71
commit dc26ed563f
  1. 25
      lib/cppurl.hpp
  2. 54
      src/cppurl.cpp
  3. BIN
      test/test
  4. 40
      test/test.cpp

@ -3,6 +3,7 @@
#include <curl/curl.h>
#include <string>
#include <string.h>
#include <map>
#include <iostream>
@ -10,19 +11,28 @@ namespace marcelb {
using namespace std;
static size_t WriteCallback(void *contents, size_t size, size_t nmemb, void *userp);
static size_t bodyCallback(void *contents, size_t size, size_t nmemb, void *body_ptr);
static size_t headerCallback(char* buffer, size_t size, size_t nitems, void* header_ptr);
enum http_version { DEFAULT, HTTP1_0, HTTP1_1, HTTP2, HTTP2TLS, HTTP2PK, HTTP3 = 30};
class Curl {
// input
CURL *curl;
CURLcode res;
string readBuffer;
struct curl_slist *headers = NULL;
string _useragent;
long _timeout = 0;
bool _sslvalidate = true;
bool _sslverifyoff = false;
http_version _protocol_v = DEFAULT;
public:
// output
CURLcode curlStatus;
long httpStatus;
map<string, string> responseHeader;
string body;
/**
* Postavi zaglavlje s ključem i vrijednošću
* Novi pozivi ne brišu stara zaglavlja, ponovljena se prepišu
@ -50,7 +60,14 @@ class Curl {
* Omogući/onemogući validaciju certifikata kod SSL veza
*/
Curl& sslvalidate(const bool sslvalidate_);
Curl& sslverifyoff();
/**
* Postavi verziju HTTP protokola
* HTTP1_0 - HTTP1_1 - HTTP2 - HTTP2TLS - HTTP2PK - HTTP3
*/
Curl& httpv(const http_version protocol_v);
/**
* Izvršiv HTTP GET zahtjev

@ -3,11 +3,26 @@
using namespace marcelb;
static size_t marcelb::WriteCallback(void *contents, size_t size, size_t nmemb, void *userp) {
((std::string*)userp)->append((char*)contents, size * nmemb);
static size_t marcelb::bodyCallback(void *contents, size_t size, size_t nmemb, void *body_ptr) {
((string*)body_ptr)->append((char*)contents, size * nmemb);
return size * nmemb;
}
static size_t marcelb::headerCallback(char* buffer, size_t size, size_t nitems, void* header_ptr) {
string header_member = string(buffer);
string key, value;
auto doublepoint = header_member.find(": ");
if (doublepoint < header_member.length()){
key = header_member.substr(0, doublepoint);
value = header_member.substr(doublepoint+2, header_member.length()-2);
((map<string, string>*)header_ptr)->insert(make_pair(key, value));
}
return nitems * size;
}
Curl& marcelb::Curl::header(const string& key, const string& value) {
headers = curl_slist_append(headers, string(key + ": " + value).c_str());
return *this;
@ -31,15 +46,20 @@ Curl& marcelb::Curl::timeout(const long timeout_) {
return *this;
}
Curl& marcelb::Curl::sslvalidate(const bool sslvalidate_) {
_sslvalidate = sslvalidate_;
Curl& marcelb::Curl::sslverifyoff() {
_sslverifyoff = true;
return *this;
}
Curl& marcelb::Curl::httpv(const http_version protocol_v) {
_protocol_v = protocol_v;
return *this;
}
string marcelb::Curl::get(const string& req){
curl = curl_easy_init();
readBuffer.clear();
body.clear();
if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, req.c_str());
@ -52,17 +72,27 @@ string marcelb::Curl::get(const string& req){
if (_timeout > 0) {
curl_easy_setopt (curl, CURLOPT_TIMEOUT_MS , _timeout);
}
if (!_sslvalidate) {
curl_easy_setopt (curl, CURLOPT_SSL_VERIFYPEER, _sslvalidate ? 1 : 0);
curl_easy_setopt (curl, CURLOPT_SSL_VERIFYHOST, _sslvalidate ? 1 : 0);
if (_sslverifyoff) {
curl_easy_setopt (curl, CURLOPT_SSL_VERIFYPEER, _sslverifyoff ? 0 : 1);
curl_easy_setopt (curl, CURLOPT_SSL_VERIFYHOST, _sslverifyoff ? 0 : 1);
}
if (_protocol_v > DEFAULT) {
curl_easy_setopt(curl, CURLOPT_HTTP_VERSION, (long)_protocol_v);
}
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, bodyCallback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &body);
curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, headerCallback);
curl_easy_setopt(curl, CURLOPT_HEADERDATA, &responseHeader);
curlStatus = curl_easy_perform(curl);
if(curlStatus == CURLE_OK) {
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &httpStatus);
}
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer);
res = curl_easy_perform(curl);
curl_easy_cleanup(curl);
}
return readBuffer;
return body;
}
Curl& marcelb::Curl::clearheader() {

Binary file not shown.

@ -11,10 +11,17 @@ using namespace marcelb;
int main () {
// Curl rest;
// string header_value = "jebiga";
// rest.header("API", header_value);
// cout << rest.get("https://reqres.in/api/users/2") << endl;
Curl rest;
string header_value = "jebiga";
rest.header("API", header_value);
cout << rest.get("https://reqres.in/api/users/2") << endl <<
"Curl status " << rest.curlStatus << endl <<
" http status " << rest.httpStatus << endl;
for (auto header : rest.responseHeader) {
cout << header.first << " " << header.second << endl;
}
// vector<thread> thr;
@ -47,20 +54,21 @@ int main () {
// t1.join();
// t2.join();
vector<future<string>> debx_responses;
// vector<future<string>> debx_responses;
for (uint i=0; i<4; i++) {
debx_responses.push_back(async(launch::async, [&](){
Curl rest;
// rest.timeout(6000);
rest.sslvalidate(false);
return rest.get("https://lab-it.ddns.net");
}));
}
// for (uint i=0; i<4; i++) {
// debx_responses.push_back(async(launch::async, [&](){
// Curl rest;
// // rest.timeout(6000);
// rest.sslverifyoff().httpv(HTTP2);
// return rest.get("https://lab-it.ddns.net");
// }));
// }
for (uint i=0; i<4; i++) {
cout << debx_responses[i].get() << endl << endl;
}
// for (uint i=0; i<4; i++) {
// // cout << debx_responses[i].get() << endl << endl;
// debx_responses[i].get();
// }
}
Loading…
Cancel
Save