products_log 1.0.0
C++ client library for the Products REST API (usage statistics)
Loading...
Searching...
No Matches
products_log.h
Go to the documentation of this file.
1/// \file products_log.h
2/// \brief Клиентская библиотека для REST API Products (статистика
3/// использования приложений).
4/// \details Зеркалирует Java-библиотеку ru.gentoos.ProductsLog и Python
5/// e_lib.product_log. Читает переменные окружения PRODUCTS_HOST,
6/// PRODUCTS_USER, PRODUCTS_PASS; при отсутствии любой из них клиент
7/// отключается (методы становятся no-op, приложение не падает).
8/// \see https://gitea.gentoos.ru/e.anisimov/products_log
9
10#pragma once
11
12#include <cstdint>
13#include <functional>
14#include <optional>
15#include <string>
16
17namespace products_log {
18
19/// HTTP-запрос, описывающий обращение к Products API.
21 std::string method; ///< "GET" или "POST".
22 std::string url; ///< Полный URL (путь уже URL-закодирован).
23 std::string body; ///< Тело запроса (для POST).
24 std::string username; ///< Basic-auth пользователь (пусто = без авторизации).
25 std::string password; ///< Basic-auth пароль.
26 int timeout_seconds = 5; ///< Таймаут запроса в секундах.
27};
28
29/// Ответ на запрос.
31 bool ok = false; ///< true, если транспорт донёс запрос до сервера.
32 int status = 0; ///< HTTP-код статуса (0 при транспортной ошибке).
33 std::string body; ///< Тело ответа.
34 std::string error; ///< Описание ошибки (без секретов).
35};
36
37/// Транспорт HTTP — функция, выполняющая запрос. Заменяемая для тестов.
38using Transport = std::function<HttpResponse(const HttpRequest &)>;
39
40/// Клиент Products API.
41///
42/// При инициализации не обращается к сети: идентификатор продукта
43/// находится/регистрируется лениво, при первой отправке сообщения.
44/// Если PRODUCTS_HOST / PRODUCTS_USER / PRODUCTS_PASS не заданы (или
45/// переданы пустыми), клиент становится неактивным — все методы возвращают
46/// false и логируют предупреждение в stderr.
48public:
49 /// Конфигурация из переменных окружения PRODUCTS_HOST / PRODUCTS_USER /
50 /// PRODUCTS_PASS. Версия продукта обычно приходит из PRODUCTS_VERSION.
51 explicit ProductsLog(std::string product_name, std::string product_version,
52 Transport transport = DefaultTransport());
53
54 /// Явная конфигурация (не зависит от окружения; используется в тестах).
55 /// version и baseUrl могут быть пустыми — тогда включается запасной вариант:
56 /// version="UNKNOWN", base_url из окружения.
57 ProductsLog(std::string product_name, std::string product_version,
58 std::string base_url, std::string username, std::string password,
59 Transport transport = DefaultTransport());
60
61 ProductsLog(const ProductsLog &) = delete;
62 ProductsLog &operator=(const ProductsLog &) = delete;
63 ~ProductsLog() = default;
64
65 /// Активен ли клиент (все credentials заданы).
66 bool enabled() const { return enabled_; }
67
68 /// Отправить запись статистики. Возвращает false при любой ошибке.
69 bool PostMessage(const std::string &comment);
70 /// Отправить "Program started".
71 bool PostStart();
72 /// Отправить "Program shutdown".
73 bool PostShutdown();
74
75private:
76 bool ResolveProductId();
77 bool SendStat(int64_t product_id, const std::string &comment);
78 std::optional<int64_t> FindProductId();
79 std::optional<int64_t> RegisterProduct();
80
82 static std::string UrlEncode(const std::string &s);
83 static std::string JsonEscape(const std::string &s);
84 static std::optional<int64_t> ParseProductId(const std::string &body);
85
86 std::string product_name_;
87 std::string product_version_;
88 std::string base_url_;
89 std::string username_;
90 std::string password_;
91 bool enabled_ = false;
92 std::optional<int64_t> product_id_;
94};
95
96} // namespace products_log
bool PostShutdown()
Отправить "Program shutdown".
bool enabled() const
Активен ли клиент (все credentials заданы).
bool PostStart()
Отправить "Program started".
ProductsLog(std::string product_name, std::string product_version, Transport transport=DefaultTransport())
bool PostMessage(const std::string &comment)
Отправить запись статистики. Возвращает false при любой ошибке.
static std::string JsonEscape(const std::string &s)
static std::string UrlEncode(const std::string &s)
ProductsLog(const ProductsLog &)=delete
bool SendStat(int64_t product_id, const std::string &comment)
std::optional< int64_t > FindProductId()
ProductsLog & operator=(const ProductsLog &)=delete
static std::optional< int64_t > ParseProductId(const std::string &body)
static Transport DefaultTransport()
std::optional< int64_t > RegisterProduct()
std::optional< int64_t > product_id_
std::function< HttpResponse(const HttpRequest &)> Transport
Транспорт HTTP — функция, выполняющая запрос. Заменяемая для тестов.
HTTP-запрос, описывающий обращение к Products API.
std::string method
"GET" или "POST".
int timeout_seconds
Таймаут запроса в секундах.
std::string username
Basic-auth пользователь (пусто = без авторизации).
std::string body
Тело запроса (для POST).
std::string url
Полный URL (путь уже URL-закодирован).
std::string password
Basic-auth пароль.
Ответ на запрос.
std::string error
Описание ошибки (без секретов).
std::string body
Тело ответа.
bool ok
true, если транспорт донёс запрос до сервера.
int status
HTTP-код статуса (0 при транспортной ошибке).