https://github.com/newyaroslav/kurlyk
C++ library for simplified HTTP and WebSocket handling, with plans to support email and webhook integration.
https://github.com/newyaroslav/kurlyk
api curl curl-library curl-utility curl-wrapper http websocket
Last synced: 2 days ago
JSON representation
C++ library for simplified HTTP and WebSocket handling, with plans to support email and webhook integration.
- Host: GitHub
- URL: https://github.com/newyaroslav/kurlyk
- Owner: NewYaroslav
- License: mit
- Created: 2021-03-20T00:32:29.000Z (over 4 years ago)
- Default Branch: main
- Last Pushed: 2025-05-21T02:17:25.000Z (about 1 month ago)
- Last Synced: 2025-05-21T03:28:15.085Z (about 1 month ago)
- Topics: api, curl, curl-library, curl-utility, curl-wrapper, http, websocket
- Language: C++
- Homepage:
- Size: 451 KB
- Stars: 2
- Watchers: 2
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README-RU.md
- License: LICENSE
Awesome Lists containing this project
README
# kurlyk
**C++ library for easy networking**
[Do you speak English?](README.md)
## Описание
**kurlyk** — это ещё одна библиотека, реализующая HTTP и WebSocket клиенты для C++. Построена как обертка над `curl` и `Simple-WebSocket-Server`, предоставляя упрощённый интерфейс для работы с HTTP и WebSocket в C++ приложениях. Она поддерживает асинхронное выполнение HTTP-запросов с ограничением скорости и повторными попытками, а также работу с WebSocket-соединениями.
Если вам не подошли другие библиотеки, такие как *easyhttp-cpp, curl_request, curlpp-async, curlwrapper, curl-Easy-cpp, curlpp11, easycurl, curl-cpp-wrapper…* возможно, стоит попробовать `kurlyk`.
### Особенности
- Асинхронное выполнение HTTP и WebSocket запросов
- Поддержка ограничения скорости для предотвращения перегрузки сети
- Автоматическое переподключение с настраиваемыми параметрами
- Простота использования через интуитивно понятный интерфейс классов
- Ориентация на использование в небольших приложениях
- Поддержка С++11## Примеры использования
Примеры находятся в папке `examples`. Ниже приведены основные примеры использования библиотеки.
### Пример использования WebSocket клиента
Этот пример показывает, как подключиться к WebSocket серверу, отправить сообщение и обработать различные события (открытие соединения, получение сообщения, закрытие соединения и ошибки).:
```cpp
#includeint main() {
// Создаём клиент WebSocket с указанным URL сервера
kurlyk::WebSocketClient client("wss://echo-websocket.fly.dev/");// Настраиваем обработчик событий WebSocket
client.on_event([](std::unique_ptr event) {
switch (event->event_type) {
case kurlyk::WebSocketEventType::WS_OPEN:
KURLYK_PRINT << "Соединение установлено" << std::endl;// Выводим HTTP версию и заголовки
KURLYK_PRINT << "HTTP версия: " << event->sender->get_http_version() << std::endl;
KURLYK_PRINT << "Заголовки:" << std::endl;
for (const auto& header : event->sender->get_headers()) {
KURLYK_PRINT << header.first << ": " << header.second << std::endl;
}// Отправляем сообщение
event->sender->send_message("Привет, WebSocket!", 0, [](const std::error_code& ec) {
if (ec) {
KURLYK_PRINT << "Ошибка отправки сообщения: " << ec.message() << std::endl;
} else {
KURLYK_PRINT << "Сообщение успешно отправлено" << std::endl;
}
});
break;case kurlyk::WebSocketEventType::WS_MESSAGE:
KURLYK_PRINT << "Получено сообщение: " << event->message << std::endl;// Отправляем ответ
event->sender->send_message("Привет снова!");
break;case kurlyk::WebSocketEventType::WS_CLOSE:
KURLYK_PRINT << "Соединение закрыто: " << event->message
<< "; Код статуса: " << event->status_code << std::endl;
break;case kurlyk::WebSocketEventType::WS_ERROR:
KURLYK_PRINT << "Ошибка: " << event->error_code.message() << std::endl;
break;
};
});// Подключаемся к серверу
KURLYK_PRINT << "Подключение..." << std::endl;
client.connect();// Ожидаем некоторое время для приёма сообщений
std::this_thread::sleep_for(std::chrono::seconds(10));
// Отправляем последнее сообщение через класс клиента
client.send_message("Пока!");// Отключаемся от сервера
KURLYK_PRINT << "Отключение..." << std::endl;
client.disconnect_and_wait();KURLYK_PRINT << "Конец работы" << std::endl;
return 0;
}
```### Примеры использования HTTP-клиента
Эти примеры показывают, как использовать HTTP-клиент библиотеки kurlyk для выполнения различных запросов и обработки ответов.
#### Пример 1: Выполнение GET и POST запросов с обработчиком ответов
```cpp
#include
#include// Функция для вывода информации об ответе
void print_response(const kurlyk::HttpResponsePtr& response) {
KURLYK_PRINT
<< "ready: " << response->ready << std::endl
<< "response: " << response->content << std::endl
<< "error_code: " << response->error_code << std::endl
<< "status_code: " << response->status_code << std::endl
<< "----------------------------------------" << std::endl;
}int main() {
kurlyk::init(true);
kurlyk::HttpClient client("https://httpbin.org");// Отправка GET запроса с обработчиком
client.get("/ip", kurlyk::QueryParams(), kurlyk::Headers(),
[](const kurlyk::HttpResponsePtr response) {
print_response(response);
});// Отправка POST запроса с обработчиком
client.post("/post", kurlyk::QueryParams(), {{"Content-Type", "application/json"}}, "{\"text\":\"Sample POST Content\"}",
[](const kurlyk::HttpResponsePtr response) {
print_response(response);
});kurlyk::deinit();
return 0;
}
```#### Пример 2: Выполнение GET и POST запросов с обработчиком ответов
```cpp
#include
#includeint main() {
kurlyk::init(true);
kurlyk::HttpClient client("https://httpbin.org");// Асинхронный GET запрос
auto future_response = client.get("/get", kurlyk::QueryParams{{"param", "value"}}, kurlyk::Headers());
kurlyk::HttpResponsePtr response = future_response.get();
print_response(response);// Асинхронный POST запрос
auto future_post = client.post("/post", kurlyk::QueryParams(), kurlyk::Headers{{"Header", "Value"}}, "Async POST Content");
kurlyk::HttpResponsePtr post_response = future_post.get();
print_response(post_response);kurlyk::deinit();
return 0;
}
```#### Пример 3: Настройка прокси и отправка GET запроса
```cpp
#include
#includeint main() {
kurlyk::init(true);
kurlyk::HttpClient client("https://httpbin.org");// Устанавливаем параметры прокси
client.set_proxy("127.0.0.1", 8080, "username", "password", kurlyk::ProxyType::HTTP);// Отправка GET запроса через прокси
client.get("/ip", kurlyk::QueryParams(), kurlyk::Headers(),
[](const kurlyk::HttpResponsePtr response) {
print_response(response);
});kurlyk::deinit();
return 0;
}
```#### Пример 4: GET запрос с использованием http_get функции
```cpp
#include
#includeint main() {
kurlyk::init(true);// Асинхронный GET запрос с использованием standalone функции
uint64_t request_id = kurlyk::http_get("https://httpbin.org/ip", kurlyk::QueryParams(), kurlyk::Headers(),
[](const kurlyk::HttpResponsePtr response) {
print_response(response);
});std::system("pause");
kurlyk::cancel_request_by_id(request_id).wait();
kurlyk::deinit();
return 0;
}
```## Зависимости и установка
Для работы библиотеки **kurlyk** в среде MinGW потребуются следующие зависимости:
1. Для WebSocket:
- [Simple-WebSocket-Server](https://gitlab.com/eidheim/Simple-WebSocket-Server)
- Boost.Asio или [standalone Asio](https://github.com/chriskohlhoff/asio/tree/master)
- [OpenSSL](https://slproweb.com/products/Win32OpenSSL.html) (*LTS версия Win64 OpenSSL v3.0.15*)
2. Для HTTP:
- [libcurl](https://curl.se/windows/)Все зависимости также добавлены в проект в виде субмодулей, находящихся в папке `libs`.
### Подключение OpenSSL
1. Добавьте в проект пути к OpenSSL (пример для версии *3.4.0*):
```
OpenSSL-Win64/include
OpenSSL-Win64/lib/VC/x64/MD
OpenSSL-Win64/bin
```2. Подключите библиотеки OpenSSL из папки `lib/VC/x64/MD`:
```
capi.lib
dasync.lib
libcrypto.lib
libssl.lib
openssl.lib
ossltest.lib
padlock.lib
```### Подключение Standalone Asio
1. Добавьте в проект путь к asio (пример для [репозитория Asio](https://github.com/chriskohlhoff/asio/tree/master)):
```
asio/asio/include
```2. Задайте макрос `ASIO_STANDALONE` в параметрах проекта или перед подключением `kurlyk.hpp`:
```cpp
#define ASIO_STANDALONE
#include
```> **Примечание:** Для Boost.Asio указывать макрос `ASIO_STANDALONE` не нужно.
### Подключение curl
1. Добавьте в проект пути для `curl` (пример для версии *8.11.0*):
```
curl-8.11.0_1-win64-mingw/bin
curl-8.11.0_1-win64-mingw/include
curl-8.11.0_1-win64-mingw/lib
```2. Подключите библиотеки `curl` из папки `lib`:
```
libcurl.a
libcurl.dll.a
```### Подключение Simple-WebSocket-Server
Добавьте в проект путь к заголовочным файлам библиотеки:
```
Simple-WebSocket-Server
```### Подключение остальных зависимостей
Также добавьте следующие библиотеки в линкер:
```
ws2_32
wsock32
crypt32
```### Подключение kurlyk
Добавьте в проект путь к заголовочным файлам библиотеки:
```
kurlyk/include
```**kurlyk** — это header-only библиотека, поэтому достаточно просто подключить её через `#include ` и начать использовать.
## Документация
В процессе написания.
## Лицензия
Эта библиотека распространяется под лицензией MIT. Подробности смотрите в файле [LICENSE](https://github.com/NewYaroslav/log-it-cpp/blob/main/LICENSE) в репозитории.
## Поддержка
Если у вас возникли вопросы или проблемы при использовании библиотеки, вы можете обратиться к документации или оставить вопрос в разделе Issues на GitHub.
Одним словом, **kurlyk!**
