/
smychkov
/
SStorage
Обзор
Документация
Войти
/
smychkov
/
SStorage
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/server/http_handler.hpp
88 строк
4 KB
Андрей
feat: top N keys + scan stream (range/top/all) with pagination
14 июл 2026, 12:56
14 июл 2026, 12:56
56c6264
Код
Авторство
О чём код?
#ifndef SSTORAGE_SERVER_HTTP_HANDLER_HPP #define SSTORAGE_SERVER_HTTP_HANDLER_HPP //============================================================================ // HTTP REST API (libmicrohttpd) //============================================================================ // Endpoints: // GET /health — 200 {"status":"ok"} // PUT /kv/{key} body=value — 204 // GET /kv/{key} — 200 body=value | 404 // DELETE /kv/{key} — 204 // GET /scan[?top=N | ?from=X&to=Y][&limit=N][&cursor=C] — 200 json // режимы: top N | диапазон | все (cursor-пагинация). См. contract S3. // GET /stats — 200 json // POST /admin/flush — 204 // POST /admin/compact — 204 // // Без авторизации, без TLS (по требованию). //============================================================================ #include <cstdint> #include <microhttpd.h> #include <mutex> #include <string> #include <unordered_map> namespace sstorage { class Database; class HttpHandler { public: HttpHandler(Database& db, uint16_t port); ~HttpHandler(); bool start(); void stop(); bool isRunning() const; private: //------------------------------------------------------------------ // Callback-обработчик запросов libmicrohttpd //------------------------------------------------------------------ static MHD_Result handleRequest(void* cls, MHD_Connection* connection, const char* url, const char* method, const char* version, const char* upload_data, size_t* upload_data_size, void** con_cls); //------------------------------------------------------------------ // Диспетчеризация по методу/пути //------------------------------------------------------------------ MHD_Result processGet(MHD_Connection* connection, const std::string& url); // GET /scan: режимы top N | диапазон | все (cursor-пагинация). См. contract S3. MHD_Result handleScan(MHD_Connection* connection, const std::string& url); MHD_Result processPut(MHD_Connection* connection, const std::string& url, const std::string& body); MHD_Result processDelete(MHD_Connection* connection, const std::string& url); MHD_Result processPost(MHD_Connection* connection, const std::string& url); //------------------------------------------------------------------ // Вспомогательные отправители ответов //------------------------------------------------------------------ MHD_Result sendStatus(MHD_Connection* connection, int status); MHD_Result sendJson(MHD_Connection* connection, const std::string& json, int status = 200); MHD_Result sendBinary(MHD_Connection* connection, const std::string& body, int status = 200); MHD_Result sendError(MHD_Connection* connection, const std::string& message, int status); // Хранилище частичных POST/PUT тел по connection key struct ConnectionState { std::string body; }; Database& db_; uint16_t port_; MHD_Daemon* daemon_ = nullptr; bool running_ = false; // Состояние активных connection'ов (для накопления body) std::mutex connectionsMutex_; std::unordered_map<void*, ConnectionState> connections_; }; } #endif