From beaddd239b1c9beb7aaf4a940fc9e0256a69a443 Mon Sep 17 00:00:00 2001 From: marcelb Date: Mon, 8 Jan 2024 18:47:06 +0100 Subject: [PATCH] Comments, README --- README.md | 60 +++++++++++++++++++++++++++++++++++++++++++++++-- lib/cppurl.hpp | 49 +++++++++++++++++++++++++++------------- test/test | Bin 55040 -> 55040 bytes test/test.cpp | 7 +++--- 4 files changed, 95 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index 15f3f03..76b0f2d 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,59 @@ -# cppurl -C++ libcurl framework \ No newline at end of file +# Rest client library, using libcurl + +A small framework for simple client-side REST API requests for C++. It uses libcurl. It got its name from a play on the words curl and cpp. + +## Features + +- Object oriented +- Adjustable headers +- Configurable user agent +- Adjustable timeout +- Native C++ containers: map, string +- QA object +- Curl and HTTP code status +- It is possible to turn off certificate validation +- A configurable version of the HTTP protocol + +## Installation + +Just download the latest release and unzip it into your project. You can turn it on with: + +``` +#include "cppurl/lib/cppurl.hpp" +using namespace marcelb; +``` + +## Usage + +```c++ +// init, and sets +Curl rest; +string header_value = "3849f438uf9uedu8ejweoijwejd09230"; +rest.header("API", header_value).timeout(700) + .httpv(HTTP2).sslverifyoff(); +// execute and print +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; +} + +``` +## License + +[APACHE 2.0](http://www.apache.org/licenses/LICENSE-2.0/) + + +## Support & Feedback + +For support and any feedback, contact the address: marcelb96@yahoo.com. + +## Contributing + +Contributions are always welcome! + +Feel free to fork and start working with or without a later pull request. Or contact for suggest and request an option. + diff --git a/lib/cppurl.hpp b/lib/cppurl.hpp index 5c79323..f8dca85 100644 --- a/lib/cppurl.hpp +++ b/lib/cppurl.hpp @@ -11,12 +11,27 @@ namespace marcelb { using namespace std; +/** + * Callback function for parsing the HTTP body +*/ static size_t bodyCallback(void *contents, size_t size, size_t nmemb, void *body_ptr); + +/** + * Callback function for parsing HTTP headers +*/ static size_t headerCallback(char* buffer, size_t size, size_t nitems, void* header_ptr); + +/** + * HTTP supported protocols +*/ enum http_version { DEFAULT, HTTP1_0, HTTP1_1, HTTP2, HTTP2TLS, HTTP2PK, HTTP3 = 30}; +/** + * Class for curl request and response +*/ class Curl { // input + CURL *curl; CURLcode res; struct curl_slist *headers = NULL; @@ -28,60 +43,62 @@ class Curl { public: // output + + // Curl code response status CURLcode curlStatus; + // HTTP code response status long httpStatus; + // HTTP response headers map responseHeader; + // HTTP body string body; /** - * Postavi zaglavlje s ključem i vrijednošću - * Novi pozivi ne brišu stara zaglavlja, ponovljena se prepišu + * Set header with key and value + * New calls do not delete old headers, repeated ones are overwritten */ Curl& header(const string& key, const string& value); /** - * Postavi zaglavlja iz mape - * Ponovan poziv prepisat će ona zaglavlja koja postoje + * Set headers from folder + * The redial will overwrite those headers that exist */ Curl& header(const map &_headers); /** - * Postavi u zaglavlje User-Agent + * Set in User-Agent header */ Curl& useragent(const string& useragent_); /** - * Postavi vrijeme isteka zahtjeva + * Set request timeout */ - Curl& timeout(const long _timeout); /** - * Omogući/onemogući validaciju certifikata kod SSL veza + * Disable certificate validation for SSL connections */ - Curl& sslverifyoff(); /** - * Postavi verziju HTTP protokola - * HTTP1_0 - HTTP1_1 - HTTP2 - HTTP2TLS - HTTP2PK - HTTP3 + * Set HTTP protocol version + * HTTP1_0 - HTTP1_1 - HTTP2 - HTTP2TLS - HTTP2PK - HTTP3 */ - Curl& httpv(const http_version protocol_v); /** - * Izvršiv HTTP GET zahtjev - * Vraća string HTTP tjela + * Executable HTTP GET request + * Returns the HTTP body as string */ string get(const string& req); /** - * Obriši spremljeno zaglavlje + * Clear saved headers */ Curl& clearheader(); /** - * Obrši trenutnog User-Agent -a + * Clear the current User-Agent */ Curl& clearuseragent(); diff --git a/test/test b/test/test index 1dc0ef38cf382740909fd32b36a8382312a32b89..5231ea9c615ce622b864ac3b533b1d54b231224c 100755 GIT binary patch delta 6247 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 AxBvhE diff --git a/test/test.cpp b/test/test.cpp index c5e654c..f44ca7f 100644 --- a/test/test.cpp +++ b/test/test.cpp @@ -12,11 +12,12 @@ using namespace marcelb; int main () { Curl rest; - string header_value = "jebiga"; - rest.header("API", header_value); + string header_value = "3849f438uf9uedu8ejweoijwejd09230"; + rest.header("API", header_value).timeout(700) + .httpv(HTTP2).sslverifyoff(); cout << rest.get("https://reqres.in/api/users/2") << endl << "Curl status " << rest.curlStatus << endl << - " http status " << rest.httpStatus << endl; + "HTTP status " << rest.httpStatus << endl; for (auto header : rest.responseHeader) { cout << header.first << " " << header.second << endl;