#ifndef CPR_BODY_H #define CPR_BODY_H #include #include #include #include #include #include "cpr/buffer.h" #include "cpr/cprtypes.h" #include "cpr/file.h" namespace cpr { class Body : public StringHolder { public: Body() : StringHolder() {} // NOLINTNEXTLINE(google-explicit-constructor, hicpp-explicit-conversions) Body(const std::string& body) : StringHolder(body) {} // NOLINTNEXTLINE(google-explicit-constructor, hicpp-explicit-conversions) Body(std::string&& body) : StringHolder(std::move(body)) {} // NOLINTNEXTLINE(google-explicit-constructor, hicpp-explicit-conversions) Body(const char* body) : StringHolder(body) {} Body(const char* str, size_t len) : StringHolder(str, len) {} Body(const std::initializer_list args) : StringHolder(args) {} Body(const Buffer& buffer) : StringHolder(reinterpret_cast(buffer.data), static_cast(buffer.datalen)) {} Body(const File& file) { std::ifstream is(file.filepath, std::ifstream::binary); if (is) { is.seekg(0, is.end); int length = is.tellg(); is.seekg(0, is.beg); std::vector buffer; buffer.resize(length); is.read(&buffer[0], length); is.close(); str_ = std::string(buffer.begin(), buffer.end()); } else { throw std::invalid_argument("Can't open the file for HTTP request body!"); } } Body(const Body& other) = default; Body(Body&& old) noexcept = default; ~Body() override = default; Body& operator=(Body&& old) noexcept = default; Body& operator=(const Body& other) = default; }; } // namespace cpr #endif