http_server.h 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. #ifndef JTJAI_MEDIA_HTTP_SERVER_H
  2. #define JTJAI_MEDIA_HTTP_SERVER_H
  3. #include <string>
  4. #include <vector>
  5. #include <map>
  6. #include <functional>
  7. #include <memory>
  8. #include <thread>
  9. #include <atomic>
  10. #include <boost/asio.hpp>
  11. #include <boost/json.hpp>
  12. #include "config.h"
  13. #include "scheduler.h"
  14. namespace jtjai_media {
  15. // 视频文件信息结构
  16. struct VideoFileInfo {
  17. std::string filename; // 文件名
  18. std::string full_path; // 完整路径
  19. std::string timestamp_dir; // 所属时间戳目录
  20. int64_t file_size; // 文件大小(字节)
  21. std::string created_time; // 创建时间
  22. std::string stream_index; // 流索引(从文件名推断)
  23. };
  24. // HTTP请求结构
  25. struct HttpRequest {
  26. std::string method; // GET, POST, DELETE等
  27. std::string path; // 请求路径
  28. std::string query_string; // 查询字符串
  29. std::string body; // 请求体
  30. std::map<std::string, std::string> headers; // 请求头
  31. };
  32. // HTTP响应结构
  33. struct HttpResponse {
  34. int status_code = 200; // 状态码
  35. std::string status_message = "OK"; // 状态消息
  36. std::string content_type = "application/json"; // 内容类型
  37. std::string body; // 响应体
  38. HttpResponse() = default;
  39. HttpResponse(int code, const std::string& msg, const std::string& content)
  40. : status_code(code), status_message(msg), body(content) {}
  41. };
  42. class HttpServer {
  43. public:
  44. explicit HttpServer(const std::string& output_directory, int port = 8080);
  45. // 构造函数重载,支持配置管理
  46. explicit HttpServer(const std::string& output_directory,
  47. std::shared_ptr<ConfigManager> config_manager,
  48. int port = 8080);
  49. // 构造函数重载,支持配置管理和调度器
  50. explicit HttpServer(const std::string& output_directory,
  51. std::shared_ptr<ConfigManager> config_manager,
  52. std::shared_ptr<StreamScheduler> scheduler,
  53. int port = 8080);
  54. ~HttpServer();
  55. // 启动服务器
  56. bool start();
  57. // 停止服务器
  58. void stop();
  59. // 检查服务器是否在运行
  60. bool is_running() const { return is_running_.load(); }
  61. // 获取服务器端口
  62. int get_port() const { return port_; }
  63. private:
  64. std::string output_directory_; // 输出目录
  65. int port_; // 监听端口
  66. std::atomic<bool> is_running_; // 运行状态
  67. std::unique_ptr<std::thread> server_thread_; // 服务器线程
  68. std::shared_ptr<ConfigManager> config_manager_; // 配置管理器
  69. std::shared_ptr<StreamScheduler> scheduler_; // 调度器
  70. // 服务器主循环
  71. void server_main_loop();
  72. // 处理客户端连接
  73. void handle_client(boost::asio::ip::tcp::socket socket);
  74. // 解析HTTP请求
  75. HttpRequest parse_request(const std::string& request_data);
  76. // 构建HTTP响应
  77. std::string build_response(const HttpResponse& response);
  78. // 路由处理
  79. HttpResponse route_request(const HttpRequest& request);
  80. // API处理函数
  81. HttpResponse handle_list_videos(const HttpRequest& request);
  82. HttpResponse handle_list_timestamps(const HttpRequest& request);
  83. HttpResponse handle_delete_video(const HttpRequest& request);
  84. HttpResponse handle_delete_timestamp(const HttpRequest& request);
  85. HttpResponse handle_get_video_info(const HttpRequest& request);
  86. HttpResponse handle_video_file(const HttpRequest& request);
  87. HttpResponse handle_static_file(const HttpRequest& request);
  88. HttpResponse handle_get_report(const HttpRequest& request);
  89. HttpResponse handle_list_reports(const HttpRequest& request);
  90. // 配置管理API处理函数
  91. HttpResponse handle_get_config(const HttpRequest& request);
  92. HttpResponse handle_update_config(const HttpRequest& request);
  93. HttpResponse handle_get_global_config(const HttpRequest& request);
  94. HttpResponse handle_update_global_config(const HttpRequest& request);
  95. HttpResponse handle_get_stream_configs(const HttpRequest& request);
  96. HttpResponse handle_add_stream_config(const HttpRequest& request);
  97. HttpResponse handle_update_stream_config(const HttpRequest& request);
  98. HttpResponse handle_delete_stream_config(const HttpRequest& request);
  99. HttpResponse handle_save_config(const HttpRequest& request);
  100. HttpResponse handle_reload_config(const HttpRequest& request);
  101. // 轮询任务管理API处理函数
  102. HttpResponse handle_get_task_list(const HttpRequest& request);
  103. HttpResponse handle_get_task_status(const HttpRequest& request);
  104. HttpResponse handle_get_scheduler_status(const HttpRequest& request);
  105. HttpResponse handle_start_scheduler(const HttpRequest& request);
  106. HttpResponse handle_stop_scheduler(const HttpRequest& request);
  107. HttpResponse handle_get_current_cycle_status(const HttpRequest& request);
  108. // 工具函数
  109. std::vector<std::string> list_timestamp_directories();
  110. std::vector<VideoFileInfo> list_videos_in_directory(const std::string& dir_path);
  111. std::vector<VideoFileInfo> list_all_videos();
  112. bool delete_file(const std::string& file_path);
  113. bool delete_directory(const std::string& dir_path);
  114. std::string get_file_created_time(const std::string& file_path);
  115. int64_t get_file_size(const std::string& file_path);
  116. std::map<std::string, std::string> parse_query_string(const std::string& query);
  117. std::string url_decode(const std::string& str);
  118. HttpResponse generate_index_page();
  119. HttpResponse generate_api_doc();
  120. };
  121. } // namespace jtjai_media
  122. #endif // JTJAI_MEDIA_HTTP_SERVER_H