{"id":49648317,"url":"https://github.com/leventkaragol/libcpp-http-client","last_synced_at":"2026-05-06T03:31:47.278Z","repository":{"id":233760913,"uuid":"787773153","full_name":"leventkaragol/libcpp-http-client","owner":"leventkaragol","description":"Modern, non-blocking and exception free HTTP Client library for C++ (17+)","archived":false,"fork":false,"pushed_at":"2025-08-04T14:43:29.000Z","size":108,"stargazers_count":2,"open_issues_count":13,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-08-04T18:09:48.485Z","etag":null,"topics":["async-http-client","client","curl","exception-free","http","http-client","https","libcurl","non-blocking"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/leventkaragol.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2024-04-17T06:47:03.000Z","updated_at":"2025-08-04T14:43:33.000Z","dependencies_parsed_at":"2024-04-17T10:00:16.591Z","dependency_job_id":"00ca02ea-1cf6-47c6-8b2b-ec21e2f747a2","html_url":"https://github.com/leventkaragol/libcpp-http-client","commit_stats":null,"previous_names":["lk-libs/libcpp-http-client","leventkaragol/libcpp-http-client"],"tags_count":9,"template":false,"template_full_name":null,"purl":"pkg:github/leventkaragol/libcpp-http-client","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/leventkaragol%2Flibcpp-http-client","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/leventkaragol%2Flibcpp-http-client/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/leventkaragol%2Flibcpp-http-client/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/leventkaragol%2Flibcpp-http-client/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/leventkaragol","download_url":"https://codeload.github.com/leventkaragol/libcpp-http-client/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/leventkaragol%2Flibcpp-http-client/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32677900,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-06T02:33:58.958Z","status":"ssl_error","status_checked_at":"2026-05-06T02:33:39.611Z","response_time":117,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["async-http-client","client","curl","exception-free","http","http-client","https","libcurl","non-blocking"],"created_at":"2026-05-06T03:31:44.612Z","updated_at":"2026-05-06T03:31:47.265Z","avatar_url":"https://github.com/leventkaragol.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"# libcpp-http-client\n\nModern, non-blocking and exception free HTTP Client library for C++ (17+)\n\n[![linux](https://github.com/leventkaragol/libcpp-http-client/actions/workflows/linux.yml/badge.svg)](https://github.com/leventkaragol/libcpp-http-client/actions/workflows/linux.yml)\n[![windows](https://github.com/leventkaragol/libcpp-http-client/actions/workflows/windows.yml/badge.svg)](https://github.com/leventkaragol/libcpp-http-client/actions/workflows/windows.yml)\n\n\n\u003e [!TIP]\n\u003e Please read this document before using the library. I know, you don't have time but reading \n\u003e this document will save you time. I mean just this file, it's not long at all. Trial and error \n\u003e will cost you more time.\n\n\n# Table of Contents\n\n* [How to add it to my project](#how-to-add-it-to-my-project)\n* [How to use? (Simplest way)](#how-to-use-simplest-way)\n* [What does non-blocking mean?](#what-does-non-blocking-mean)\n* [What does exception free mean?](#what-does-exception-free-mean)\n* [What about binary data?](#what-about-binary-data)\n* [Sending Custom HTTP Headers](#sending-custom-http-headers)\n* [POST request with form data](#post-request-with-form-data)\n* [POST request with JSON data](#post-request-with-json-data)\n* [What about others? (PUT, DELETE, PATCH)](#what-about-others-put-delete-patch)\n* [How to ignore SSL certificate errors?](#how-to-ignore-ssl-certificate-errors)\n* [Setting the TLS version](#setting-the-tls-version)\n* [How to set timeout?](#how-to-set-timeout)\n* [Setting the User Agent](#setting-the-user-agent)\n* [How can I limit download and upload bandwidth?](#how-can-i-limit-download-and-upload-bandwidth)\n* [How do I get the request as a curl command?](#how-do-i-get-the-request-as-a-curl-command)\n* [How to stream data?](#how-to-stream-data)\n* [Semantic Versioning](#semantic-versioning)\n* [Full function list](#full-function-list)\n* [License](#license)\n* [Contact](#contact)\n\n\n## How to add it to my project?\n\nThis is a header only library. So actually, all you need is to add the libcpp-http-client.hpp file \nin src folder to your project and start using it with #include.\n\nBut this library is a kind of Curl wrapper that uses Curl under the hood. So, you also need to add Curl to \nyour project before to use it.\n\nYou can find usage examples in the examples folder, also find a sample CMakeLists.txt file content below.\n\n```cmake\ncmake_minimum_required(VERSION 3.14)\n\nproject(myProject)\n\nfind_package(CURL CONFIG REQUIRED)\n\nadd_executable(myProject main.cpp libcpp-http-client.hpp)\n\ntarget_link_libraries(myProject PRIVATE CURL::libcurl)\n\n```\n\n\n## How to use? (Simplest way)\n\nBelow you can see the simplest use case sending QueryString parameters to an API via HTTP GET.\n\n\u003e [!IMPORTANT]\n\u003e Please do not use it this way, if more than one call will be made. You do not use the non-blocking\n\u003e feature in this way. Just keep reading...\n\n```cpp\n#include \u003cfstream\u003e\n#include \"libcpp-http-client.hpp\"\n\nusing namespace lklibs;\n\nint main() {\n\n    HttpRequest httpRequest(\"https://api.myproject.com\");\n\n    // The simplest but slowest method if multiple calls will be made\n    auto response = httpRequest\n            .setQueryString(\"param1=7\u0026param2=test\")\n            .send()\n            .get();\n\n    std::cout \u003c\u003c \"Succeed: \" \u003c\u003c response.succeed \u003c\u003c std::endl;\n    std::cout \u003c\u003c \"Http Status Code: \" \u003c\u003c response.statusCode \u003c\u003c std::endl;\n    std::cout \u003c\u003c \"Data: \" \u003c\u003c response.textData \u003c\u003c std::endl;\n\n    return 0;\n}\n```\n\n\n## What does non-blocking mean?\n\nLet's talk about this through an example. Let's say, we call 5 different API methods when our \nscreen opens and each one takes an average of 500 ms. If we call these methods one after another \nas follows, we will get all the answers in 2.5 seconds in total.\n\n```cpp\n#include \u003cfstream\u003e\n#include \"libcpp-http-client.hpp\"\n\nusing namespace lklibs;\n\nint main() {\n    \n    HttpRequest httpRequest1(\"https://api.myproject.com/foo\");\n    HttpRequest httpRequest2(\"https://api.myproject.com/bar\");\n    HttpRequest httpRequest3(\"https://api.myproject.com/baz\");\n    HttpRequest httpRequest4(\"https://api.myproject.com/qux\");\n    HttpRequest httpRequest5(\"https://api.myproject.com/quux\");\n\n    auto response1 = httpRequest1.send().get();\n    auto response2 = httpRequest2.send().get();\n    auto response3 = httpRequest3.send().get();\n    auto response4 = httpRequest4.send().get();\n    auto response5 = httpRequest5.send().get();\n\n    // Takes 2.5 seconds in total\n\n    return 0;\n}\n```\n\n\".get()\" call at the end of each line causes us to wait until the server responds. However, \nif we make the same call as follows, all requests will be processed in parallel and the total \ntime will take approximately 0.5 seconds.\n\n```cpp\n#include \u003cfstream\u003e\n#include \"libcpp-http-client.hpp\"\n\nusing namespace lklibs;\n\nint main() {\n    \n    HttpRequest httpRequest1(\"https://api.myproject.com/foo\");\n    HttpRequest httpRequest2(\"https://api.myproject.com/bar\");\n    HttpRequest httpRequest3(\"https://api.myproject.com/baz\");\n    HttpRequest httpRequest4(\"https://api.myproject.com/qux\");\n    HttpRequest httpRequest5(\"https://api.myproject.com/quux\");\n\n    auto future1 = httpRequest.send();\n    auto future2 = httpRequest.send();\n    auto future3 = httpRequest.send();\n    auto future4 = httpRequest.send();\n    auto future5 = httpRequest.send();\n    \n    auto response1 = future1.get();\n    auto response2 = future2.get();\n    auto response3 = future3.get();\n    auto response4 = future4.get();\n    auto response5 = future5.get();\n\n    // Takes 0.5 seconds in total\n\n    return 0;\n}\n```\n\n**\"send\"** function in the library return a future and allow the next line to run without blocking the flow.\n\n\n## What does exception free mean?\n\nException Free means that no exception will be thrown for any call you make to this library.\nIf the URL cannot be found, there is a timeout, there is an authorization problem or another\nerror occurs on the server, the bool typed \"succeed\" field of the response is returned as false.\nIn addition, the HTTP Status Code value returned from the server is returned in the int typed\n\"statusCode\" field and possibly additional error information that may be returned from the server\nis returned in the string typed \"errorMessage\" field.\n\nYou can see an example use case below...\n\n```cpp\n#include \u003cfstream\u003e\n#include \"libcpp-http-client.hpp\"\n\nusing namespace lklibs;\n\nint main() {\n    \n    HttpRequest httpRequest(\"https://www.myinvalidurl.com\");\n\n    auto response = httpRequest.send().get();\n\n    // Instead of throwing an exception, the succeed field of the response object is set to false\n    std::cout \u003c\u003c \"Succeed: \" \u003c\u003c response.succeed \u003c\u003c std::endl;\n\n    // And the http status code is set to the statusCode field (404 in this case)\n    std::cout \u003c\u003c \"Http Status Code: \" \u003c\u003c response.statusCode \u003c\u003c std::endl;\n\n    // Also if any error message is available, it is set to the errorMessage field\n    std::cout \u003c\u003c \"Error Message: \" \u003c\u003c response.errorMessage \u003c\u003c std::endl;\n\n    return 0;\n}\n```\n\n\n## What about binary data?\n\nIn the examples so far, we have used the **\"textData\"** property of the returning response object.\nHowever, we need binary data for requests made to binary files such as images. In such cases, \nwe can ensure that the returned data is returned in **\"binaryData\"** of type \n***\"std::vector\u0026lt;unsigned char\u0026gt;\"*** instead of **\"textData\"** by calling **\"returnAsBinary()\"** method before send as follow.\n\n```cpp\n#include \u003cfstream\u003e\n#include \"libcpp-http-client.hpp\"\n\nusing namespace lklibs;\n\nint main() {\n    \n    HttpRequest httpRequest(\"https://api.myproject.com/image/7\");\n\n    // If you need to retrieve binary data such as an image, just call the \"returnAsBinary\" method before send\n    auto response = httpRequest\n            .returnAsBinary()\n            .send()\n            .get();\n    \n    std::cout \u003c\u003c \"Succeed: \" \u003c\u003c response.succeed \u003c\u003c std::endl;\n    std::cout \u003c\u003c \"Http Status Code: \" \u003c\u003c response.statusCode \u003c\u003c std::endl;\n\n    // In this case, you can get the data via binaryData instead of textData\n    std::cout \u003c\u003c \"Data Size: \" \u003c\u003c response.binaryData.size() \u003c\u003c std::endl;\n\n    return 0;\n}\n```\n\n\n## Sending custom HTTP headers\n\nIf you need to send custom HTTP HEADERs during the request, you can add them to the request as key-value pairs with **\"addHeader()\"** method.\n\n```cpp\n#include \u003cfstream\u003e\n#include \"libcpp-http-client.hpp\"\n\nusing namespace lklibs;\n\nint main() {\n    \n    HttpRequest httpRequest(\"https://api.myproject.com\");\n\n    // You can send custom headers as key-value pairs\n    auto response = httpRequest\n            .addHeader(\"Custom-Header1\", \"value1\")\n            .addHeader(\"Custom-Header2\", \"value2\")\n            .send()\n            .get();\n    \n    std::cout \u003c\u003c \"Succeed: \" \u003c\u003c response.succeed \u003c\u003c std::endl;\n\n    return 0;\n}\n```\n\n\n## POST request with form data\n\nNext is submitting form data via HTTP POST. All you have to do is use **\"setMethod\"** to change HTTP method type. You can pass the form data with **\"setPaylod\"** method as seen in the sample code below.\n\n```cpp\n#include \u003cfstream\u003e\n#include \"libcpp-http-client.hpp\"\n\nusing namespace lklibs;\n\nint main() {\n    \n    HttpRequest httpRequest(\"https://api.myproject.com\");\n\n    // You can send a POST request with form data in the payload\n    auto response = httpRequest\n            .setMethod(HttpMethod::POST)\n            .setPayload(\"param1=7\u0026param2=test\")\n            .send()\n            .get();\n\n    std::cout \u003c\u003c \"Succeed: \" \u003c\u003c response.succeed \u003c\u003c std::endl;\n    std::cout \u003c\u003c \"Http Status Code: \" \u003c\u003c response.statusCode \u003c\u003c std::endl;\n    std::cout \u003c\u003c \"Data: \" \u003c\u003c response.textData \u003c\u003c std::endl;\n\n    return 0;\n}\n```\n\n\n## POST request with JSON data\n\nSending JSON data via HTTP POST is not much different. Just remember to send **\"Content-Type\"** \nas **\"application/json\"** via HTTP HEADER.\n\n```cpp\n#include \u003cfstream\u003e\n#include \"libcpp-http-client.hpp\"\n\nusing namespace lklibs;\n\nint main() {\n    \n    HttpRequest httpRequest(\"https://api.myproject.com\");\n    \n    // You need to send the \"Content-Type\" as \"application/json\" in the HTTP Header, if you need to send json data in the payload\n    auto response = httpRequest\n            .setMethod(HttpMethod::POST)\n            .setPayload(R\"({\"param1\": 7, \"param2\": \"test\"})\")\n            .addHeader(\"Content-Type\", \"application/json\")\n            .send()\n            .get();\n\n    std::cout \u003c\u003c \"Succeed: \" \u003c\u003c response.succeed \u003c\u003c std::endl;\n    std::cout \u003c\u003c \"Http Status Code: \" \u003c\u003c response.statusCode \u003c\u003c std::endl;\n    std::cout \u003c\u003c \"Data: \" \u003c\u003c response.textData \u003c\u003c std::endl;\n\n    return 0;\n}\n```\n\n\n## What about others? (PUT, DELETE, PATCH)\n\nYou can also find the usage of other methods in the sample code below.\n\n```cpp\n#include \u003cfstream\u003e\n#include \"libcpp-http-client.hpp\"\n\nusing namespace lklibs;\n\nint main() {\n    \n    HttpRequest httpRequest1(\"https://api.myproject.com\");\n\n    auto future1 = httpRequest\n            .setMethod(HttpMethod::PUT)\n            .setPayload(\"param1=7\u0026param2=test\")\n            .send();\n    \n    HttpRequest httpRequest2(\"https://api.myproject.com\");\n\n    auto future2 = httpRequest\n            .setMethod(HttpMethod::DELETE_)\n            .setPayload(\"param1=7\u0026param2=test\")\n            .send();\n    \n    HttpRequest httpRequest3(\"https://api.myproject.com\");\n    \n    auto future3 = httpRequest\n            .setMethod(HttpMethod::PATCH)\n            .setQueryString(\"param1=7\u0026param2=test\")\n            .send();\n\n    auto response1 = future1.get();\n    auto response2 = future2.get();\n    auto response3 = future3.get();\n\n    return 0;\n}\n```\n\n\n## How to ignore SSL certificate errors?\n\nIf you need to ignore SSL certificate errors for any valid reason, you can call \"ignoreSslErrors\" \nmethod before sending the request.\n\n```cpp\n#include \u003cfstream\u003e\n#include \"libcpp-http-client.hpp\"\n\nusing namespace lklibs;\n\nint main() {\n    \n    HttpRequest httpRequest(\"https://api.myinvalidssl.com\");\n\n    // If you need to ignore SSL errors, you can call \"ignoreSslErrors\" method before sending the request\n    auto response = httpRequest\n            .ignoreSslErrors()\n            .send()\n            .get();\n\n    return 0;\n}\n```\n\n\n## Setting the TLS version\n\nYou can set the TLS version used during the request with the setTLSVersion method\n\n```cpp\n#include \u003cfstream\u003e\n#include \"libcpp-http-client.hpp\"\n\nusing namespace lklibs;\n\nint main() {\n    HttpRequest httpRequest(\"https://api.myproject.com\");\n    \n    // You can set the TLS version to be used for the request with setTLSVersion method\n    auto response = httpRequest\n                    .setTLSVersion(TLSVersion::TLSv1_3)\n                    .send()\n                    .get();\n    \n    return 0;\n}\n```\n\n\n## How to set timeout?\n\nYou can use the setTimeout method to set the timeout duration in seconds during requests.\n\n```cpp\n#include \u003cfstream\u003e\n#include \"libcpp-http-client.hpp\"\n\nusing namespace lklibs;\n\nint main() {\n    HttpRequest httpRequest(\"https://api.myproject.com\");\n    \n    // You can set the timeout in seconds\n    auto response = httpRequest\n                    .setTimeout(3) // 3 sec\n                    .send()\n                    .get();\n    \n    return 0;\n}\n```\n\n\n## Setting the User Agent\n\nYou can set the User Agent information to be sent during the request with the setUserAgent method.\n\n```cpp\n#include \u003cfstream\u003e\n#include \"libcpp-http-client.hpp\"\n\nusing namespace lklibs;\n\nint main() {\n    HttpRequest httpRequest(\"https://api.myproject.com\");\n    \n    // You can set the user agent to be used for the request with setUserAgent method\n    auto response = httpRequest\n                    .setUserAgent(\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0\")\n                    .send()\n                    .get();\n    \n    return 0;\n}\n```\n\n\n## How can I limit download and upload bandwidth?\n\nIf you do not want the bandwidth to exceed a certain limit during the download and upload process, you can determine the maximum limit that can be used in Bytes with the setDownloadBandwidthLimit and setUploadBandwidthLimit methods.\n\n```cpp\n#include \u003cfstream\u003e\n#include \"libcpp-http-client.hpp\"\n\nusing namespace lklibs;\n\nint main() {\n    HttpRequest httpRequest(\"https://api.myproject.com\");\n    \n    // You can set the download and upload bandwidth limit in bytes per second\n    auto response = httpRequest\n                    .setDownloadBandwidthLimit(10240) // 10 KB/sec\n                    .setUploadBandwidthLimit(20480) // 20 KB/sec\n                    .send()\n                    .get();\n    \n    return 0;\n}\n```\n\n\n## How do I get the request as a curl command?\n\nIf you want to receive the request as a curl command, you can call the toCurlCommand method after making the necessary preparations.\n\n```cpp\n#include \u003cfstream\u003e\n#include \"libcpp-http-client.hpp\"\n\nusing namespace lklibs;\n\nint main() {\n    HttpRequest httpRequest(\"https://api.myproject.com\");\n    \n    auto response = httpRequest\n                    .setMethod(HttpMethod::POST)\n                    .setPayload(R\"({\"param1\": 7, \"param2\": \"test\"})\")\n                    .addHeader(\"Content-Type\", \"application/json\")\n                    .setTimeout(3)\n                    .setUserAgent(\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0\")\n                    .setDownloadBandwidthLimit(10240)\n                    .setUploadBandwidthLimit(20480);\n                    \n    std::string curlCommand = response.toCurlCommand();\n    \n    return 0;\n}\n```\n\n\n## How to stream data?\n\nInstead of receiving the data all at once, you can also receive it in parts using the **\"onDataReceived\"** callback method.\n\n```cpp\n#include \u003cfstream\u003e\n#include \"libcpp-http-client.hpp\"\n\nusing namespace lklibs;\n\nint main() {\n    \n    HttpRequest httpRequest(\"https://api.myproject.com/image/5000\");\n\n    // You can stream the data by onDataReceived methods\n    httpRequest.onDataReceived([\u0026](const unsigned char* chunk, const size_t dataLength)\n    {\n        std::cout \u003c\u003c \"Received chunk of size: \" \u003c\u003c dataLength \u003c\u003c std::endl;\n    });\n\n    auto response = httpRequest\n            .returnAsBinary()\n            .send()\n            .get();\n    \n    std::cout \u003c\u003c \"Succeed: \" \u003c\u003c response.succeed \u003c\u003c std::endl;\n    std::cout \u003c\u003c \"Http Status Code: \" \u003c\u003c response.statusCode \u003c\u003c std::endl;\n\n    return 0;\n}\n```\n\n\n## Semantic Versioning\n\nVersioning of the library is done using conventional semantic versioning. Accordingly, \nin the versioning made as **MAJOR.MINOR.PATCH**;\n\n**PATCH:** Includes possible Bug\u0026Fixes and improvements. You definitely want to get this.\n\n**MINOR:** Additional functionality added via backwards compatibility. You probably want to \nget this, it doesn't hurt.\n\n**MAJOR:** Additional functionality that breaks backwards compatibility. You'll need to know \nwhat's changed before you get it, and you'll probably have to make changes to your own code. \nIf I publish something like this, I will definitely add the changes required for migration \nsection to the documentation.\n\n\n## Full function list\n\nYou can find the complete list of functions in the library below. Since all methods except \nsend return the class itself, so they can be added one after the other like a chain.\n\n\u003e [!TIP]\n\u003e All methods and parameters descriptions are also available within the code as comment for IDEs.\n\n```cpp\nHttpRequest\u0026 setMethod(const HttpMethod\u0026 method) noexcept;\n\nHttpRequest\u0026 setQueryString(const std::string\u0026 queryString) noexcept;\n\nHttpRequest\u0026 setPayload(const std::string\u0026 payload) noexcept;\n\nHttpRequest\u0026 addMultipartFormData(const std::string\u0026 name, const std::string\u0026 data, const std::optional\u003cstd::string\u003e\u0026 mimeType = std::nullopt) noexcept;\n\nHttpRequest\u0026 returnAsBinary() noexcept;\n\nHttpRequest\u0026 addHeader(const std::string\u0026 key, const std::string\u0026 value) noexcept;\n\nHttpRequest\u0026 setTimeout(const int timeout) noexcept;\n\nHttpRequest\u0026 ignoreSslErrors() noexcept;\n\nHttpRequest\u0026 setTLSVersion(const TLSVersion version) noexcept;\n\nHttpRequest\u0026 setUserAgent(const std::string\u0026 userAgent) noexcept;\n\nHttpRequest\u0026 setDownloadBandwidthLimit(const int limit) noexcept;\n\nHttpRequest\u0026 setUploadBandwidthLimit(const int limit) noexcept;\n\nstd::future\u003cHttpResult\u003e send() noexcept;\n```\n\n\n## License\n\nMIT License\n\nCopyright (c) 2024 Levent KARAGÖL\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n## Contact\n\nIf you have problems regarding the library, please open an \n[issue on GitHub](https://github.com/leventkaragol/libcpp-http-client/issues/new). \nPlease describe your request, issue, or question in as much detail as possible \nand also include the version of your compiler and operating system, as well as \nthe version of the library you are using. Before opening a new issue, please \nconfirm that the topic is not already exists in closed issues.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fleventkaragol%2Flibcpp-http-client","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fleventkaragol%2Flibcpp-http-client","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fleventkaragol%2Flibcpp-http-client/lists"}