#pragma once #if !defined(OS_WEB) #include #include #include #include #include namespace hex { namespace impl { void setWriteFunctions(CURL *curl, wolv::io::File &file); void setWriteFunctions(CURL *curl, std::vector &data); void setupFileUpload(CURL *curl, wolv::io::File &file, const std::string &fileName, const std::string &mimeName); void setupFileUpload(CURL *curl, const std::vector &data, const std::fs::path &fileName, const std::string &mimeName); int executeCurl(CURL *curl, const std::string &url, const std::string &method, const std::string &body, std::map &headers); long getStatusCode(CURL *curl); std::string getStatusText(int result); } template std::future> HttpRequest::downloadFile(const std::fs::path &path) { return std::async(std::launch::async, [this, path] { std::vector response; wolv::io::File file(path, wolv::io::File::Mode::Create); impl::setWriteFunctions(m_curl, file); return this->executeImpl(response); }); } template std::future> HttpRequest::uploadFile(const std::fs::path &path, const std::string &mimeName) { return std::async(std::launch::async, [this, path, mimeName]{ auto fileName = wolv::util::toUTF8String(path.filename()); wolv::io::File file(path, wolv::io::File::Mode::Read); impl::setupFileUpload(m_curl, file, fileName, mimeName); std::vector responseData; impl::setWriteFunctions(m_curl, responseData); return this->executeImpl(responseData); }); } template std::future> HttpRequest::uploadFile(std::vector data, const std::string &mimeName, const std::fs::path &fileName) { return std::async(std::launch::async, [this, data = std::move(data), mimeName, fileName]{ impl::setupFileUpload(m_curl, data, fileName, mimeName); std::vector responseData; impl::setWriteFunctions(m_curl, responseData); return this->executeImpl(responseData); }); } template std::future> HttpRequest::execute() { return std::async(std::launch::async, [this] { std::vector responseData; impl::setWriteFunctions(m_curl, responseData); return this->executeImpl(responseData); }); } template HttpRequest::Result HttpRequest::executeImpl(std::vector &data) { setDefaultConfig(); std::scoped_lock lock(m_transmissionMutex); if (auto result = impl::executeCurl(m_curl, m_url, m_method, m_body, m_headers); result != 0) { log::error("Http request '{0} {1}' failed with error {2}: '{3}'", m_method, m_url, u32(result), impl::getStatusText(result)); checkProxyErrors(); } return Result(impl::getStatusCode(m_curl), { data.begin(), data.end() }); } } #endif