#include #include #include #include #include #include #include "mongoose.h" #include "db.h" #include "web.h" typedef void(web_handler_t)(const boost::cmatch&, struct mg_connection *conn); std::forward_list>> web_handler; struct mg_context *ctx; int begin_request_handler(struct mg_connection *conn) { boost::cmatch match; const struct mg_request_info *request_info = mg_get_request_info(conn); std::cout << request_info->request_method << " " << request_info->uri << std::endl; for (auto item = web_handler.begin(); item != web_handler.end(); ++item) { if (boost::regex_match(request_info->uri, match, (*item).first)) { (*item).second(match, conn); return 1; } } return 0; } struct sigaction old_action; // Stop the server. void sigint_handler(int s) { mg_stop(ctx); db_close(); exit(0); } int main(int argc, char **argv) { struct mg_callbacks callbacks; const char *options[] = { "num_threads", "8", "listening_ports", "8080", "document_root", "wwwroot", NULL}; memset(&callbacks, 0, sizeof(callbacks)); callbacks.begin_request = begin_request_handler; // Routing web_handler.push_front(std::make_pair( web_handle_api_value_R, web_handle_api_value)); web_handler.push_front(std::make_pair( web_handle_api_value_timestamp_R, web_handle_api_value_timestamp)); web_handler.push_front(std::make_pair( web_handle_api_range_R, web_handle_api_range)); web_handler.push_front(std::make_pair( web_handle_api_range_size_R, web_handle_api_range_size)); // Signals: handle C-c struct sigaction action; memset(&action, 0, sizeof(action)); action.sa_handler = &sigint_handler; sigaction(SIGINT, &action, &old_action); // Start the web server. ctx = mg_start(&callbacks, NULL, options); while (1) std::this_thread::sleep_for(std::chrono::seconds(1)); return 1; }