#include "HttplibServer.h" #include #include #include #include #define SERVER_FILE_DIR "/ServerFiles" #define CMD_GetFileList "GetFileList" string static GetExeDir() { char buff[_MAX_PATH]; _getcwd(buff, _MAX_PATH); string currPath(buff); return string(buff); } bool static bFileExist(const string& path) { ifstream file(path, ios::binary); return file.good(); } CHttplibServer::CHttplibServer() { } CHttplibServer::~CHttplibServer() { } bool CHttplibServer::StartHttpServer(string SvrFilesDir /*= ""*/, bool bAsync /*= true*/) { m_SvrFilesDir = SvrFilesDir; auto fStart = [&] { httplib::Server svr; svr.set_payload_max_length(1024 * 1024 * 512); // 512MB svr.Get(R"(/download/(.+))", [&](const Request& req, Response& res) {OnDownloadFile(req, res);}); svr.Get(R"(/command/(.+))", [&](const Request& req, Response& res) {OnCommandBase(req, res);}); std::cout << "Server started at http://localhost:1234\n"; svr.listen(m_SvrIP, m_Port); }; bAsync? thread(fStart).detach(): fStart(); return true; } void CHttplibServer::OnCommandBase(const Request & req, Response & res) { string cmd = req.matches[1]; std::cout << "Rcved Command:" << cmd << endl; if (cmd.find(CMD_GetFileList) != string::npos) OnCommand_GetFileList(req, res); else OnCommand(cmd, res); } void CHttplibServer::OnCommand(string cmd, Response & res) { cmd += "Rcved"; res.set_content(cmd, "text/plain"); } void CHttplibServer::OnDownloadFile(const Request& req, Response& res) { if (m_SvrFilesDir.empty()) m_SvrFilesDir = GetExeDir() + SERVER_FILE_DIR; string FileName = req.matches[1]; string file_path = m_SvrFilesDir+"/"+FileName; if (!bFileExist(file_path)) { res.status = 404; res.set_content("File not found", "text/plain"); return; } res.set_file_content(file_path); return; } void CHttplibServer::OnCommand_GetFileList(const Request& req, Response& res) { if (m_SvrFilesDir.empty()) m_SvrFilesDir = GetExeDir() + SERVER_FILE_DIR; vector NameVec = get_file_names(m_SvrFilesDir); string sRespon; for (auto const & Name: NameVec) { sRespon += Name; sRespon += ","; } res.set_content(sRespon, "text/plain"); } vector CHttplibServer::get_file_names(const string& Dir) { vector NamesVec; string search_path = Dir + "\\*"; WIN32_FIND_DATAA find_data; HANDLE hFind = FindFirstFileA(search_path.c_str(), &find_data); if (hFind != INVALID_HANDLE_VALUE) { do { if (!(find_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) { NamesVec.push_back(find_data.cFileName); } } while (FindNextFileA(hFind, &find_data)); FindClose(hFind); } return NamesVec; }