#include "webcc/utility.h" #include #include // for put_time #include #include "boost/algorithm/string.hpp" #include "boost/filesystem/fstream.hpp" #include "boost/uuid/random_generator.hpp" #include "boost/uuid/uuid_io.hpp" #include "webcc/version.h" namespace bfs = boost::filesystem; namespace webcc { namespace utility { std::string RandomUuid() { boost::uuids::uuid u = boost::uuids::random_generator()(); std::stringstream ss; ss << u; return ss.str(); } const std::string& UserAgent() { static auto s_user_agent = std::string("Webcc/") + WEBCC_VERSION; return s_user_agent; } std::string GetTimestamp() { std::time_t t = std::time(nullptr); std::stringstream ss; ss << std::put_time(std::gmtime(&t), "%a, %d %b %Y %H:%M:%S") << " GMT"; return ss.str(); } bool SplitKV(const std::string& str, char delimiter, std::string* part1, std::string* part2) { std::size_t pos = str.find(delimiter); if (pos == std::string::npos) { return false; } *part1 = str.substr(0, pos); *part2 = str.substr(pos + 1); boost::trim(*part1); boost::trim(*part2); return true; } bool ToSize(const std::string& str, int base, std::size_t* size) { try { *size = static_cast(std::stoul(str, 0, base)); } catch (const std::exception&) { return false; } return true; } std::size_t TellSize(const Path& path) { // Flag "ate": seek to the end of stream immediately after open. bfs::ifstream stream{ path, std::ios::binary | std::ios::ate }; if (stream.fail()) { return kInvalidLength; } return static_cast(stream.tellg()); } bool ReadFile(const Path& path, std::string* output) { // Flag "ate": seek to the end of stream immediately after open. bfs::ifstream stream{ path, std::ios::binary | std::ios::ate }; if (stream.fail()) { return false; } auto size = stream.tellg(); output->resize(static_cast(size), '\0'); stream.seekg(std::ios::beg); stream.read(&(*output)[0], size); if (stream.fail()) { return false; } return true; } void DumpByLine(const std::string& data, std::ostream& os, const std::string& prefix) { std::vector lines; boost::split(lines, data, boost::is_any_of("\n")); std::size_t size = 0; for (const std::string& line : lines) { os << prefix; if (line.size() + size > kMaxDumpSize) { os.write(line.c_str(), kMaxDumpSize - size); os << "..." << std::endl; break; } else { os << line << std::endl; size += line.size(); } } } } // namespace utility } // namespace webcc