web_service.cpp 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. #include "kbf/web_service.h"
  2. #include <kbf/macros.h>
  3. #include <utility>
  4. using namespace kbf;
  5. using http::Request;
  6. using http::Response;
  7. WebService::WebService() : server() {
  8. ESP_LOGI(TAG, "%s()", __func__);
  9. }
  10. WebService::~WebService() {
  11. ESP_LOGI(TAG, "%s()", __func__);
  12. if (running) {
  13. stop();
  14. }
  15. }
  16. void WebService::start(int port) {
  17. ESP_LOGI(TAG, "%s(%d)", __func__, port);
  18. if (running) {
  19. ABORT("WebService already running");
  20. }
  21. running = true;
  22. server.start(port);
  23. }
  24. void WebService::startSSL(const unsigned char *const cert_start, const unsigned char *const cert_end,
  25. const unsigned char *const key_start, const unsigned char *const key_end,
  26. int port) {
  27. ESP_LOGI(TAG, "%s(%d)", __func__, port);
  28. if (running) {
  29. ABORT("WebService already running");
  30. }
  31. running = true;
  32. server.startSSL(cert_start, cert_end, key_start, key_end, port);
  33. }
  34. void WebService::stop() {
  35. ESP_LOGI(TAG, "%s()", __func__);
  36. if (!running) {
  37. ESP_LOGW(TAG, "stop(): not running");
  38. return;
  39. }
  40. server.stop();
  41. running = false;
  42. }
  43. Response WebService::startPipeline(const Request &request, HandlerArg *arg) {
  44. ESP_LOGD(TAG, "%s()", __func__);
  45. currentController = &arg->controller;
  46. middlewareIt = std::nullopt;
  47. ESP_LOGI(TAG, "%s %s",
  48. request.method == http::GET ? "GET" : request.method == http::POST ? "POST" : "UNKNOWN",
  49. request.uri.c_str());
  50. return next(request);
  51. }
  52. Response WebService::handleGet(const Request &request, void *data) {
  53. ESP_LOGD(TAG, "%s()", __func__);
  54. auto arg = static_cast<HandlerArg *>(data);
  55. arg->webService.currentMethod = &Controller::get;
  56. return arg->webService.startPipeline(request, arg);
  57. }
  58. Response WebService::handlePost(const Request &request, void *data) {
  59. ESP_LOGD(TAG, "%s()", __func__);
  60. auto arg = static_cast<HandlerArg *>(data);
  61. arg->webService.currentMethod = &Controller::post;
  62. return arg->webService.startPipeline(request, arg);
  63. }
  64. WebService::Controller::Controller(std::string path) : path(std::move(path)) {}
  65. void WebService::Controller::responseSentHandler(const Response &response, void *data) {
  66. ESP_LOGD(TAG, "%s()", __func__);
  67. auto arg = static_cast<HandlerArg *>(data);
  68. arg->controller.onResponseSent(response);
  69. }
  70. Response WebService::next(const Request &request) { // noqa
  71. ESP_LOGD(TAG, "%s()", __func__);
  72. if (middlewareIt == std::nullopt) {
  73. middlewareIt = middlewares.begin();
  74. } else {
  75. (*middlewareIt)++;
  76. }
  77. if (*middlewareIt == middlewares.end()) {
  78. ESP_LOGD(TAG, " running controller");
  79. auto result = (currentController->*currentMethod)(request);
  80. currentMethod = nullptr;
  81. currentController = nullptr;
  82. return result;
  83. }
  84. ESP_LOGD(TAG, " running middleware %d", *middlewareIt - middlewares.begin());
  85. return (**middlewareIt)->run(request, *this);
  86. }