#include "stdafx.h" #include "CNetWork.h" #include #include CNetWork::CNetWork() : m_http_ret(http_f) { } CNetWork::~CNetWork(void) { } int CNetWork::GetHttpStatus() { return m_http_status; } HTTPRET CNetWork::Version(std::string& data) { std::vector p; p.push_back({ "tag","win" }); p.push_back({ "appverion",S_CW2A(VERSION).GetBuffer(0)}); std::string text = GetUrl("/api/client/v3/version", p, CApp::getSingletonPtr()->GetUserinfo()->access_token); if (text.empty()) { return http_f; } data = text.c_str(); return http_yes; } HTTPRET CNetWork::Refresh(std::string& data) { std::vector p; std::string text = GetUrl("/api/client/v3/refresh", p, CApp::getSingletonPtr()->GetUserinfo()->access_token); if (text.empty()) { return http_f; } data = text.c_str(); return http_yes; } HTTPRET CNetWork::Auth(std::string& data) { return http_yes; } HTTPRET CNetWork::GetServerNode(std::string& data) { std::vector p; std::string text = GetUrl("/api/client/v3/nodes",p,CApp::getSingletonPtr()->GetUserinfo()->access_token); if (text.empty()) { return http_f; } data = text.c_str(); return http_yes; } HTTPRET CNetWork::PostLogin(LPCSTR username, LPCSTR password, std::string& data) { std::vector p; p.push_back({ "email",username }); p.push_back({ "password",password }); std::string text = PostUrl("/api/client/v3/login", p); if (text.empty()) { return http_f; } data = text.c_str(); return http_yes; } void CNetWork::SetUrl(LPCSTR url) { m_url = url; } SStringA CNetWork::GetLastErrorA() { return SStringA().Format("%s", m_error_msg.c_str()).GetBuffer(0); } SStringW CNetWork::GetLastErrorW() { return S_CA2W(m_error_msg.c_str(),CP_UTF8).GetBuffer(0); } std::string CNetWork::GetUrl(std::string path, std::vector parame,std::string token) { cpr::Parameters ps; std::vector::iterator it_i; for (it_i = parame.begin(); it_i != parame.end(); ++it_i) { ps.Add(*it_i); //ps(cpr::Parameter({ it->first, it->second })); } cpr::Header hander; if (!token.empty()) { hander = cpr::Header{ {"accept", "application/json"} , {"Authorization", "bearer " + token} }; } else { hander = cpr::Header{ {"accept", "application/json"} }; } auto s = fmt::format("{0}{1}", m_url, path.c_str()); cpr::Response r; std::string res_test = ""; int count = 3; do { if (count <= 0) { break; } if (parame.empty()) { r = cpr::Get(cpr::Url{ s.c_str() }, hander, cpr::Timeout{ 60 * 100 }); } else { r = cpr::Get(cpr::Url{ s.c_str() }, ps, hander, cpr::Timeout{ 60 * 100 }); } if (r.status_code == 200 || r.status_code == 201) { res_test = r.text; break; } else { m_http_status = r.status_code; if (r.error.message.empty()) { m_error_msg = r.status_line; } else { m_error_msg = UpdateError(r.error.code, r.error.message); } } if (!res_test.empty()) { break; } count--; } while (res_test.empty()); return res_test; } std::string CNetWork::PostUrl(std::string path, std::vector parame, std::string token) { auto s = fmt::format("{0}{1}", m_url, path.c_str()); cpr::Header hander; if (!token.empty()) { hander = cpr::Header{ {"accept", "application/json"} , {"Authorization", "bearer " + token} }; } else { hander = cpr::Header{ {"accept", "application/json"} }; } cpr::Response r; std::string res_test = ""; int count = 3; do { if (count <= 0) { break; } if (parame.empty()) { r = cpr::Get(cpr::Url{ s.c_str() }, hander, cpr::Timeout{ 60 * 100 }); } else { r = cpr::Post(cpr::Url{ s.c_str() }, cpr::Payload{ parame.begin(),parame.end() }, hander, cpr::Timeout{ 60 * 100 }); } if (r.status_code == 200 || r.status_code == 201) { res_test = std::move(r.text); break; } else { m_http_status = r.status_code; if (r.error.message.empty()) { m_error_msg = r.status_line; } else { m_error_msg = UpdateError(r.error.code, r.error.message); } } if (!res_test.empty()) { break; } count--; } while (res_test.empty()); return res_test; } std::string CNetWork::Retrying(std::string path, std::vector parame, std::string token) { std::string res_test = ""; int count = 3; do { if (count <= 0) { break; } res_test = GetUrl(path, parame, token); if (!res_test.empty()) { break; } count--; } while (res_test.empty()); return res_test; } bool write_data(std::string /*data*/, intptr_t /*userdata*/) { return true; } bool CNetWork::Download(std::string path) { return false; /*std::string configdir = std::filesystem::current_path().string() + "\\" + CLASHCONFIGDIR; std::filesystem::path p(configdir); if (!std::filesystem::exists(p)) { std::filesystem::create_directory(p); } std::string configname = configdir + "\\" CLASHCONFIGNAME; std::ofstream ofs(configname); cpr::Url url{ path }; cpr::Session session; session.SetUrl(url); cpr::Response response = session.Download(ofs); return response.status_code == 200;*/ } void CNetWork::Init() { } void CNetWork::UnInit() { } std::string CNetWork::UpdateError(cpr::ErrorCode code, std::string msg) { if (code == cpr::ErrorCode::HOST_RESOLUTION_FAILURE) { m_error_msg = "解析域名失败"; } else if (code == cpr::ErrorCode::OPERATION_TIMEDOUT) { m_error_msg = "请求数据超时,请重新请求"; } else if (code == cpr::ErrorCode::CONNECTION_FAILURE) { m_error_msg = "发送服务器失败"; } else if (code == cpr::ErrorCode::INVALID_URL_FORMAT) { m_error_msg = "未知URL错误"; } else if (code == cpr::ErrorCode::SSL_CONNECT_ERROR) { m_error_msg = "SSL连接错误"; } else { m_error_msg = msg; } return m_error_msg; }