15static optional<string_view> encodeSymbol(
char symbol);
17static optional<char> decodeSymbol(string_view symbol);
22 constexpr void convert(string_view data, T& result)
24 static_assert(
false,
"Wrong type");
31 void convert(string_view data,
string& result)
40 void convert(string_view data, optional<string>& result)
46template<
typename... Args>
50 array<size_t,
sizeof...(Args)> offsets;
51 array<char,
sizeof...(Args)> nextCharacter;
54 template<
size_t Index>
55 constexpr auto& getValue(Args&... args)
const
57 return get<Index>(forward_as_tuple(args...));
60 template<
size_t Index = 0>
61 constexpr void parseValue(string_view data,
size_t offset, Args&... args)
const
63 auto& value = this->getValue<Index>(args...);
64 Converter<remove_reference_t<
decltype(value)>> converter;
65 size_t stringValueIndex = data.find(nextCharacter[Index], offset + offsets[Index]);
66 string_view stringValue(data.begin() + offset + offsets[Index], (stringValueIndex == string_view::npos) ? data.end() : data.begin() + stringValueIndex);
68 converter.convert(stringValue, value);
70 if constexpr (Index + 1 !=
sizeof...(Args))
72 this->parseValue<Index + 1>(data, offset + stringValue.size(), args...);
79 size_t offset = format.find(
"{}");
82 while (offset != string_view::npos)
86#pragma warning(disable: 28020)
88 offsets[index] = offset - 2 * index;
92 format.size() > offset + 2 ?
93 nextCharacter[index] = format[offset + 2] :
94 nextCharacter[index] =
'\0';
96 offset = format.find(
"{}", offset + 1);
104 this->parseValue(data, 0, args...);
112 string version =
"1.13.1";
121 for (
char symbol : data)
123 if (optional<string_view> encodedSymbol = encodeSymbol(symbol); encodedSymbol)
125 result += *encodedSymbol;
138 static constexpr size_t encodedSymbolSize = 3;
142 for (
size_t i = 0; i < data.size(); i++)
146 string_view percentEncodedData(data.data() + i, encodedSymbolSize);
148 if (optional<char> encodedSymbol = decodeSymbol(percentEncodedData); encodedSymbol)
150 result += *encodedSymbol;
154 cerr <<
"Unknown encoded symbol: " << percentEncodedData << endl;
156 result += percentEncodedData;
159 i += encodedSymbolSize - 1;
174 tem.reserve(value.size());
176 for_each(value.begin(), value.end(), [&tem](
char c) { tem += tolower(c); });
178 return hash<string>()(tem);
185 left.begin(), left.end(),
186 right.begin(), right.end(),
187 [](
char first,
char second) { return tolower(first) == tolower(second); }
200 if (data.find(
"filename") != string_view::npos)
204 parser.getValues(data.substr(0, firstStringEnd), name, fileName);
210 parser.getValues(data.substr(0, firstStringEnd), name);
213 if (data.find(
"Content-Type:") != string_view::npos)
231 Multipart::Multipart(string_view name,
const optional<std::string>& fileName,
const optional<std::string>& contentType,
string&& data) :
234 contentType(contentType),
262 static const unordered_map<ResponseCodes, string> responseMessage =
337 if (
auto it = responseMessage.find(
static_cast<ResponseCodes>(code)); it != responseMessage.end())
342 return "Unknown response code";
346optional<string_view> encodeSymbol(
char symbol)
414 return optional<string_view>();
418optional<char> decodeSymbol(string_view symbol)
420 static const unordered_map<string_view, char> symbols =
445 auto it = symbols.find(symbol);
447 return it != symbols.end() ? it->second : optional<char>();
constexpr MultipartParser(string_view format)
void getValues(string_view data, Args &... args) const
static constexpr std::string_view crlfcrlf
static constexpr std::string_view crlf
const std::string & getName() const
const std::optional< std::string > & getFileName() const
const std::string & getData() const
Multipart(std::string_view data)
const std::optional< std::string > & getContentType() const
ResponseCodes
Response codes.
@ networkAuthenticationRequired
@ HTTPVersionNotSupported
@ proxyAuthenticationRequired
@ unavailableForLegalReasons
@ requestHeaderFieldsTooLarge
@ nonAuthoritativeInformation
string __getMessageFromCode(int code)
string getHTTPLibraryVersion()
Get version of HTTP library.
string decodeUrl(string_view data)
string encodeUrl(string_view data)
void convert(string_view data, optional< string > &result)
void convert(string_view data, string &result)
constexpr void convert(string_view data, T &result)
bool operator()(const std::string &left, const std::string &right) const
size_t operator()(const std::string &value) const