16 #ifndef _MINIO_UTILS_H
17 #define _MINIO_UTILS_H
19 #include <openssl/buffer.h>
20 #include <openssl/evp.h>
24 #include <curlpp/cURLpp.hpp>
33 inline constexpr
unsigned int kMaxMultipartCount = 10000;
34 inline constexpr
unsigned long kMaxObjectSize =
35 5L * 1024 * 1024 * 1024 * 1024;
36 inline constexpr
unsigned long kMaxPartSize = 5L * 1024 * 1024 * 1024;
37 inline constexpr
unsigned int kMinPartSize = 5 * 1024 * 1024;
40 std::string FormatTime(
const std::tm* time,
const char* format);
43 bool StringToBool(std::string_view str);
46 inline const char*
const BoolToString(
bool b) {
return b ?
"true" :
"false"; }
49 std::string Trim(std::string_view str,
char ch =
' ');
53 bool CheckNonEmptyString(std::string_view str);
56 std::string ToLower(std::string str);
59 bool StartsWith(std::string_view str, std::string_view prefix);
62 bool EndsWith(std::string_view str, std::string_view suffix);
65 bool Contains(std::string_view str,
char ch);
68 bool Contains(std::string_view str, std::string_view substr);
71 std::string Join(std::list<std::string> values, std::string delimiter);
74 std::string Join(std::vector<std::string> values, std::string delimiter);
77 std::string EncodePath(std::string_view path);
80 std::string Sha256Hash(std::string_view str);
83 std::string Base64Encode(std::string_view str);
86 std::string Md5sumHash(std::string_view str);
88 error::Error CheckBucketName(std::string_view bucket_name,
bool strict =
false);
89 error::Error ReadPart(std::istream& stream,
char* buf,
size_t size,
91 error::Error CalcPartInfo(
long object_size,
size_t& part_size,
104 Time(std::time_t tv_sec, suseconds_t tv_usec,
bool utc);
106 std::string ToSignerDate();
107 std::string ToAmzDate();
108 std::string ToHttpHeaderValue();
109 static Time FromHttpHeaderValue(
const char* value);
110 std::string ToISO8601UTC();
111 static Time FromISO8601UTC(
const char* value);
113 operator bool()
const {
return tv_.tv_sec != 0 && tv_.tv_usec != 0; }
121 std::map<std::string, std::set<std::string>> map_;
122 std::map<std::string, std::set<std::string>> keys_;
127 void Add(std::string key, std::string value);
128 void AddAll(
const Multimap& headers);
129 std::list<std::string> ToHttpHeaders();
130 std::string ToQueryString();
131 operator bool()
const {
return !map_.empty(); }
132 bool Contains(std::string_view key);
133 std::list<std::string> Get(std::string_view key);
134 std::string GetFront(std::string_view key);
135 std::list<std::string> Keys();
136 void GetCanonicalHeaders(std::string& signed_headers,
137 std::string& canonical_headers);
138 std::string GetCanonicalQueryString();
148 std::string query_string;
150 operator bool()
const {
return !host.empty(); }
151 std::string String();
158 CharBuffer(
char* buf,
size_t size) { this->setg(buf, buf, buf + size); }
160 pos_type seekoff(off_type off, std::ios_base::seekdir dir,
161 std::ios_base::openmode which = std::ios_base::in)
override {
162 if (dir == std::ios_base::cur)
164 else if (dir == std::ios_base::end)
165 setg(eback(), egptr() + off, egptr());
166 else if (dir == std::ios_base::beg)
167 setg(eback(), eback() + off, egptr());
168 return gptr() - eback();
171 pos_type seekpos(pos_type sp, std::ios_base::openmode which)
override {
172 return seekoff(sp - pos_type(off_type(0)), std::ios_base::beg, which);