#pragma once #include "Global.h" #include "IPTable.h" #include #include "WebFileInfo.h" #include "HTTPObjects.h" using FileProcessorCallback = std::function; class UNSWSC_DLL_EXPORT FileReceiver { protected: class Impl; std::unique_ptr pimpl; public: FileReceiver(); virtual ~FileReceiver(); // 基类必须有虚析构函数! public: bool CallFileProcesser(); void SetResponseMode(bool html); void SetCORSEnable(bool enable); std::string EncodeUploadResult(); std::string EncodeUploadResultHTML(); void UpdateBlockedIPs(IPTablePtr ip); void SetTempRoot(std::string temp_root); void SetFileCallback(FileProcessorCallback fpcb); uns::HTTPMethod GetMethod(uns::RequestPtr request); void AppenedBlockedIP(DateTime::Span block_time, std::string ip); bool WriteFile(const std::string& path, const std::string& bytes); public: virtual uns::Status PreCheckRequest(uns::RequestPtr request) = 0; virtual bool PreCheckForm(uns::FormPartPtr form) = 0; virtual uns::PathTraversalDefenceLevel PTDefence(); virtual bool IsPathSafe(const std::string& raw_path); public: // 核心驱动入口:供内部适配器调用的实际执行流 uns::ResponsePtr Execute(uns::RequestPtr request); }; using FileReceiverPtr = std::shared_ptr;