{"id":19534858,"url":"https://github.com/newyaroslav/kurlyk","last_synced_at":"2025-08-12T05:11:09.371Z","repository":{"id":162735367,"uuid":"349589676","full_name":"NewYaroslav/kurlyk","owner":"NewYaroslav","description":"C++ library for simplified HTTP and WebSocket handling, with plans to support email and webhook integration.","archived":false,"fork":false,"pushed_at":"2025-08-08T00:19:26.000Z","size":1598,"stargazers_count":2,"open_issues_count":0,"forks_count":1,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-08-08T00:21:52.554Z","etag":null,"topics":["api","cpp11","cpp17","curl","curl-library","curl-utility","curl-wrapper","http","websocket"],"latest_commit_sha":null,"homepage":"https://newyaroslav.github.io/kurlyk/","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/NewYaroslav.png","metadata":{"files":{"readme":"README-RU.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}},"created_at":"2021-03-20T00:32:29.000Z","updated_at":"2025-08-08T00:18:52.000Z","dependencies_parsed_at":null,"dependency_job_id":"5363dce6-2326-45b5-a5cb-4a748427efd5","html_url":"https://github.com/NewYaroslav/kurlyk","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/NewYaroslav/kurlyk","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NewYaroslav%2Fkurlyk","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NewYaroslav%2Fkurlyk/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NewYaroslav%2Fkurlyk/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NewYaroslav%2Fkurlyk/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/NewYaroslav","download_url":"https://codeload.github.com/NewYaroslav/kurlyk/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NewYaroslav%2Fkurlyk/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":270005591,"owners_count":24510939,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-12T02:00:09.011Z","response_time":80,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["api","cpp11","cpp17","curl","curl-library","curl-utility","curl-wrapper","http","websocket"],"created_at":"2024-11-11T02:16:20.823Z","updated_at":"2025-08-12T05:11:09.356Z","avatar_url":"https://github.com/NewYaroslav.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"# kurlyk\n![logo](docs/logo-mini.png)\n\n**C++ library for easy networking**\n\n[Do you speak English?](README.md)\n\n## Описание\n\n**kurlyk** — это ещё одна библиотека, реализующая HTTP и WebSocket клиенты для C++. Построена как обертка над `curl` и `Simple-WebSocket-Server`, предоставляя упрощённый интерфейс для работы с HTTP и WebSocket в C++ приложениях. Она поддерживает асинхронное выполнение HTTP-запросов с ограничением скорости и повторными попытками, а также работу с WebSocket-соединениями.\n\nЕсли вам не подошли другие библиотеки, такие как *easyhttp-cpp, curl_request, curlpp-async, curlwrapper, curl-Easy-cpp, curlpp11, easycurl, curl-cpp-wrapper…* возможно, стоит попробовать `kurlyk`.\n\n### Особенности\n\n- Асинхронное выполнение HTTP и WebSocket запросов\n- Поддержка ограничения скорости для предотвращения перегрузки сети\n- Автоматическое переподключение с настраиваемыми параметрами\n- Простота использования через интуитивно понятный интерфейс классов\n- Ориентация на использование в небольших приложениях\n- Поддержка С++11\n\n## Примеры использования\n\nПримеры находятся в папке `examples`. Ниже приведены основные примеры использования библиотеки.\n\n### Пример использования WebSocket клиента\n\nЭтот пример показывает, как подключиться к WebSocket серверу, отправить сообщение и обработать различные события (открытие соединения, получение сообщения, закрытие соединения и ошибки).:\n\n```cpp\n#include \u003ckurlyk.hpp\u003e\n\nint main() {\n    // Создаём клиент WebSocket с указанным URL сервера\n    kurlyk::WebSocketClient client(\"wss://echo-websocket.fly.dev/\");\n\n    // Настраиваем обработчик событий WebSocket\n    client.on_event([](std::unique_ptr\u003ckurlyk::WebSocketEventData\u003e event) {\n        switch (event-\u003eevent_type) {\n            case kurlyk::WebSocketEventType::WS_OPEN:\n                KURLYK_PRINT \u003c\u003c \"Соединение установлено\" \u003c\u003c std::endl;\n\n                // Выводим HTTP версию и заголовки\n                KURLYK_PRINT \u003c\u003c \"HTTP версия: \" \u003c\u003c event-\u003esender-\u003eget_http_version() \u003c\u003c std::endl;\n                KURLYK_PRINT \u003c\u003c \"Заголовки:\" \u003c\u003c std::endl;\n                for (const auto\u0026 header : event-\u003esender-\u003eget_headers()) {\n                    KURLYK_PRINT \u003c\u003c header.first \u003c\u003c \": \" \u003c\u003c header.second \u003c\u003c std::endl;\n                }\n\n                // Отправляем сообщение\n                event-\u003esender-\u003esend_message(\"Привет, WebSocket!\", 0, [](const std::error_code\u0026 ec) {\n                    if (ec) {\n                        KURLYK_PRINT \u003c\u003c \"Ошибка отправки сообщения: \" \u003c\u003c ec.message() \u003c\u003c std::endl;\n                    } else {\n                        KURLYK_PRINT \u003c\u003c \"Сообщение успешно отправлено\" \u003c\u003c std::endl;\n                    }\n                });\n                break;\n\n            case kurlyk::WebSocketEventType::WS_MESSAGE:\n                KURLYK_PRINT \u003c\u003c \"Получено сообщение: \" \u003c\u003c event-\u003emessage \u003c\u003c std::endl;\n\n                // Отправляем ответ\n                event-\u003esender-\u003esend_message(\"Привет снова!\");\n                break;\n\n            case kurlyk::WebSocketEventType::WS_CLOSE:\n                KURLYK_PRINT \u003c\u003c \"Соединение закрыто: \" \u003c\u003c event-\u003emessage\n                             \u003c\u003c \"; Код статуса: \" \u003c\u003c event-\u003estatus_code \u003c\u003c std::endl;\n                break;\n\n            case kurlyk::WebSocketEventType::WS_ERROR:\n                KURLYK_PRINT \u003c\u003c \"Ошибка: \" \u003c\u003c event-\u003eerror_code.message() \u003c\u003c std::endl;\n                break;\n        };\n    });\n\n    // Подключаемся к серверу\n    KURLYK_PRINT \u003c\u003c \"Подключение...\" \u003c\u003c std::endl;\n    client.connect();\n\n    // Ожидаем некоторое время для приёма сообщений\n    std::this_thread::sleep_for(std::chrono::seconds(10));\n    \n    // Отправляем последнее сообщение через класс клиента\n    client.send_message(\"Пока!\");\n\n    // Отключаемся от сервера\n    KURLYK_PRINT \u003c\u003c \"Отключение...\" \u003c\u003c std::endl;\n    client.disconnect_and_wait();\n\n    KURLYK_PRINT \u003c\u003c \"Конец работы\" \u003c\u003c std::endl;\n    return 0;\n}\n```\n\n### Примеры использования HTTP-клиента\n\nЭти примеры показывают, как использовать HTTP-клиент библиотеки kurlyk для выполнения различных запросов и обработки ответов.\n\n#### Пример 1: Выполнение GET и POST запросов с обработчиком ответов\n\n```cpp\n#include \u003ckurlyk.hpp\u003e\n#include \u003ciostream\u003e\n\n// Функция для вывода информации об ответе\nvoid print_response(const kurlyk::HttpResponsePtr\u0026 response) {\n    KURLYK_PRINT\n        \u003c\u003c \"ready: \" \u003c\u003c response-\u003eready \u003c\u003c std::endl\n        \u003c\u003c \"response: \" \u003c\u003c response-\u003econtent \u003c\u003c std::endl\n        \u003c\u003c \"error_code: \" \u003c\u003c response-\u003eerror_code \u003c\u003c std::endl\n        \u003c\u003c \"status_code: \" \u003c\u003c response-\u003estatus_code \u003c\u003c std::endl\n        \u003c\u003c \"----------------------------------------\" \u003c\u003c std::endl;\n}\n\nint main() {\n    kurlyk::init(true);\n    kurlyk::HttpClient client(\"https://httpbin.org\");\n\n    // Отправка GET запроса с обработчиком\n    client.get(\"/ip\", kurlyk::QueryParams(), kurlyk::Headers(),\n        [](const kurlyk::HttpResponsePtr response) {\n            print_response(response);\n        });\n\n    // Отправка POST запроса с обработчиком\n    client.post(\"/post\", kurlyk::QueryParams(), {{\"Content-Type\", \"application/json\"}}, \"{\\\"text\\\":\\\"Sample POST Content\\\"}\",\n        [](const kurlyk::HttpResponsePtr response) {\n            print_response(response);\n        });\n\n    kurlyk::deinit();\n    return 0;\n}\n```\n\n#### Пример 2: Выполнение GET и POST запросов с std::future\n\n```cpp\n#include \u003ckurlyk.hpp\u003e\n#include \u003ciostream\u003e\n\nint main() {\n    kurlyk::init(true);\n    kurlyk::HttpClient client(\"https://httpbin.org\");\n\n    // Асинхронный GET запрос\n    auto future_response = client.get(\"/get\", kurlyk::QueryParams{{\"param\", \"value\"}}, kurlyk::Headers());\n    kurlyk::HttpResponsePtr response = future_response.get();\n    print_response(response);\n\n    // Асинхронный POST запрос\n    auto future_post = client.post(\"/post\", kurlyk::QueryParams(), kurlyk::Headers{{\"Header\", \"Value\"}}, \"Async POST Content\");\n    kurlyk::HttpResponsePtr post_response = future_post.get();\n    print_response(post_response);\n\n    kurlyk::deinit();\n    return 0;\n}\n```\n\n#### Пример 3: Настройка прокси и отправка GET запроса\n\n```cpp\n#include \u003ckurlyk.hpp\u003e\n#include \u003ciostream\u003e\n\nint main() {\n    kurlyk::init(true);\n    kurlyk::HttpClient client(\"https://httpbin.org\");\n\n    // Устанавливаем параметры прокси\n    client.set_proxy(\"127.0.0.1\", 8080, \"username\", \"password\", kurlyk::ProxyType::HTTP);\n\n    // Отправка GET запроса через прокси\n    client.get(\"/ip\", kurlyk::QueryParams(), kurlyk::Headers(),\n        [](const kurlyk::HttpResponsePtr response) {\n            print_response(response);\n        });\n\n    kurlyk::deinit();\n    return 0;\n}\n```\n\n#### Пример 4: GET запрос с использованием http_get функции\n\n```cpp\n#include \u003ckurlyk.hpp\u003e\n#include \u003ciostream\u003e\n\nint main() {\n    kurlyk::init(true);\n\n    // Асинхронный GET запрос с использованием standalone функции\n    uint64_t request_id = kurlyk::http_get(\"https://httpbin.org/ip\", kurlyk::QueryParams(), kurlyk::Headers(),\n        [](const kurlyk::HttpResponsePtr response) {\n            print_response(response);\n        });\n\n\tstd::system(\"pause\");\n    kurlyk::cancel_request_by_id(request_id).wait();\n    kurlyk::deinit();\n    return 0;\n}\n```\n\n## Зависимости и установка\n\nДля работы библиотеки **kurlyk** в среде MinGW потребуются следующие зависимости:\n\n1. Для WebSocket:\n\n    - [Simple-WebSocket-Server](https://gitlab.com/eidheim/Simple-WebSocket-Server)\n    - Boost.Asio или [standalone Asio](https://github.com/chriskohlhoff/asio/tree/master)\n    - [OpenSSL](https://slproweb.com/products/Win32OpenSSL.html) (*LTS версия Win64 OpenSSL v3.0.15*)\n    \n2. Для HTTP:\n    - [libcurl](https://curl.se/windows/)\n\nВсе зависимости также добавлены в проект в виде субмодулей, находящихся в папке `libs`.\n\n### Подключение OpenSSL\n\n1. Добавьте в проект пути к OpenSSL (пример для версии *3.4.0*):\n\n```\nOpenSSL-Win64/include\nOpenSSL-Win64/lib/VC/x64/MD\nOpenSSL-Win64/bin\n```\n\n2. Подключите библиотеки OpenSSL из папки `lib/VC/x64/MD`:\n\n```\ncapi.lib\ndasync.lib\nlibcrypto.lib\nlibssl.lib\nopenssl.lib\nossltest.lib\npadlock.lib\n```\n\n### Подключение Standalone Asio\n\n1. Добавьте в проект путь к asio (пример для [репозитория Asio](https://github.com/chriskohlhoff/asio/tree/master)):\n\n```\nasio/asio/include\n```\n\n2. Задайте макрос `ASIO_STANDALONE` в параметрах проекта или перед подключением `kurlyk.hpp`:\n\n```cpp\n#define ASIO_STANDALONE\n#include \u003ckurlyk.hpp\u003e\n```\n\n\u003e **Примечание:** Для Boost.Asio указывать макрос `ASIO_STANDALONE` не нужно.\n\n### Подключение curl\n\n1. Добавьте в проект пути для `curl` (пример для версии *8.11.0*):\n\n```\ncurl-8.11.0_1-win64-mingw/bin\ncurl-8.11.0_1-win64-mingw/include\ncurl-8.11.0_1-win64-mingw/lib\n```\n\n2. Подключите библиотеки `curl` из папки `lib`:\n\n```\nlibcurl.a\nlibcurl.dll.a\n```\n\n### Подключение Simple-WebSocket-Server\n\nДобавьте в проект путь к заголовочным файлам библиотеки:\n\n```\nSimple-WebSocket-Server\n```\n\n### Подключение остальных зависимостей\n\nТакже добавьте следующие библиотеки в линкер:\n\n```\nws2_32\nwsock32\ncrypt32\n```\n\n### Подключение kurlyk\n\nДобавьте в проект путь к заголовочным файлам библиотеки:\n\n```\nkurlyk/include\n```\n\n**kurlyk** — это header-only библиотека, поэтому достаточно просто подключить её через `#include \u003ckurlyk.hpp\u003e` и начать использовать.\n\n## Конфигурационные макросы\n\nПеред подключением `kurlyk.hpp` можно определить следующие макросы для тонкой\nнастройки библиотеки:\n\n- `KURLYK_AUTO_INIT` (по умолчанию `1`) — автоматическая регистрация менеджеров\n  во время статической инициализации.\n- `KURLYK_AUTO_INIT_USE_ASYNC` (по умолчанию `1`) — при включённом auto init\n  запускает сетевой поток в фоне. Установите `0`, если требуется выполнять\n  обработку вручную.\n- `KURLYK_HTTP_SUPPORT` и `KURLYK_WEBSOCKET_SUPPORT` (по умолчанию `1`) —\n  включают или отключают соответствующие подсистемы.\n- `KURLYK_ENABLE_JSON` (по умолчанию `0`) — добавляет вспомогательные функции\n  для JSON-сериализации некоторых типов.\n\n## Документация\n\nВ процессе написания. \n\n## Лицензия\n\nЭта библиотека распространяется под лицензией MIT. Подробности смотрите в файле [LICENSE](LICENSE) в репозитории.\n\n## Поддержка\n\nЕсли у вас возникли вопросы или проблемы при использовании библиотеки, вы можете обратиться к документации или оставить вопрос в разделе Issues на GitHub.\n\n\nОдним словом, **kurlyk!**\n\n![logo](docs/logo-mini-end.png)\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnewyaroslav%2Fkurlyk","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnewyaroslav%2Fkurlyk","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnewyaroslav%2Fkurlyk/lists"}