| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 | #ifndef JTJAI_MEDIA_HTTP_SERVER_H#define JTJAI_MEDIA_HTTP_SERVER_H#include <string>#include <vector>#include <map>#include <functional>#include <memory>#include <thread>#include <atomic>#include <boost/asio.hpp>#include <boost/json.hpp>namespace jtjai_media {// 视频文件信息结构struct VideoFileInfo {    std::string filename;           // 文件名    std::string full_path;          // 完整路径    std::string timestamp_dir;      // 所属时间戳目录    int64_t file_size;              // 文件大小(字节)    std::string created_time;       // 创建时间    std::string stream_index;       // 流索引(从文件名推断)};// HTTP请求结构struct HttpRequest {    std::string method;             // GET, POST, DELETE等    std::string path;               // 请求路径    std::string query_string;       // 查询字符串    std::string body;               // 请求体    std::map<std::string, std::string> headers;  // 请求头};// HTTP响应结构struct HttpResponse {    int status_code = 200;          // 状态码    std::string status_message = "OK";  // 状态消息    std::string content_type = "application/json";  // 内容类型    std::string body;               // 响应体        HttpResponse() = default;    HttpResponse(int code, const std::string& msg, const std::string& content)        : status_code(code), status_message(msg), body(content) {}};class HttpServer {public:    explicit HttpServer(const std::string& output_directory, int port = 8080);    ~HttpServer();        // 启动服务器    bool start();        // 停止服务器    void stop();        // 检查服务器是否在运行    bool is_running() const { return is_running_.load(); }        // 获取服务器端口    int get_port() const { return port_; }private:    std::string output_directory_;   // 输出目录    int port_;                       // 监听端口    std::atomic<bool> is_running_;   // 运行状态    std::unique_ptr<std::thread> server_thread_;  // 服务器线程        // 服务器主循环    void server_main_loop();        // 处理客户端连接    void handle_client(boost::asio::ip::tcp::socket socket);        // 解析HTTP请求    HttpRequest parse_request(const std::string& request_data);        // 构建HTTP响应    std::string build_response(const HttpResponse& response);        // 路由处理    HttpResponse route_request(const HttpRequest& request);        // API处理函数    HttpResponse handle_list_videos(const HttpRequest& request);    HttpResponse handle_list_timestamps(const HttpRequest& request);    HttpResponse handle_delete_video(const HttpRequest& request);    HttpResponse handle_delete_timestamp(const HttpRequest& request);    HttpResponse handle_get_video_info(const HttpRequest& request);    HttpResponse handle_video_file(const HttpRequest& request);    HttpResponse handle_static_file(const HttpRequest& request);    HttpResponse handle_get_report(const HttpRequest& request);    HttpResponse handle_list_reports(const HttpRequest& request);        // 工具函数    std::vector<std::string> list_timestamp_directories();    std::vector<VideoFileInfo> list_videos_in_directory(const std::string& dir_path);    std::vector<VideoFileInfo> list_all_videos();    bool delete_file(const std::string& file_path);    bool delete_directory(const std::string& dir_path);    std::string get_file_created_time(const std::string& file_path);    int64_t get_file_size(const std::string& file_path);    std::map<std::string, std::string> parse_query_string(const std::string& query);    std::string url_decode(const std::string& str);    HttpResponse generate_index_page();    HttpResponse generate_api_doc();};} // namespace jtjai_media#endif // JTJAI_MEDIA_HTTP_SERVER_H
 |