forked from rosh/MQL5Book
113 lines
3.2 KiB
MQL5
113 lines
3.2 KiB
MQL5
//+------------------------------------------------------------------+
| |
//| HTTPHeader.mqh |
| |
//| Copyright 2022, MetaQuotes Ltd. |
| |
//| https://www.mql5.com |
| |
//+------------------------------------------------------------------+
| |
| |
//+------------------------------------------------------------------+
| |
//| HTTP header parser |
| |
//+------------------------------------------------------------------+
| |
class HttpHeader
| |
{
| |
string lines[];
| |
public:
| |
HttpHeader(string response, const ushort delimiter, const ushort glue)
| |
{
| |
if(response == NULL) return;
| |
StringTrimRight(response);
| |
const int n = StringSplit(response, delimiter, lines);
| |
ArrayResize(lines, n * 2);
| |
for(int i = 0; i < n; ++i)
| |
{
| |
StringTrimLeft(lines[i]);
| |
StringTrimRight(lines[i]);
| |
string pair[];
| |
const int m = StringSplit(lines[i], glue, pair);
| |
if(m > 0)
| |
{
| |
StringToLower(pair[0]);
| |
StringTrimRight(pair[0]);
| |
lines[i] = pair[0]; // name
| |
if(m > 1)
| |
{
| |
StringTrimLeft(pair[1]);
| |
lines[i + n] = pair[1]; // value
| |
}
| |
else
| |
{
| |
lines[i + n] = NULL;
| |
}
| |
}
| |
}
| |
}
| |
| |
int size() const
| |
{
| |
return ArraySize(lines);
| |
}
| |
| |
string operator[](const int i) const
| |
{
| |
return lines[i];
| |
}
| |
| |
string operator[](string name) const
| |
{
| |
const int m = StringLen(name);
| |
if(m == 0) return NULL;
| |
StringToLower(name);
| |
const int n = ArraySize(lines) / 2;
| |
for(int i = 0; i < n; ++i)
| |
{
| |
if(lines[i] == name)
| |
{
| |
return lines[i + n];
| |
}
| |
}
| |
return NULL;
| |
}
| |
| |
void printRaw() const
| |
{
| |
ArrayPrint(lines);
| |
}
| |
| |
static string unquote(const string text)
| |
{
| |
const int n = StringLen(text);
| |
if(n >= 2 && text[0] == '"' && text[n - 1] == '"')
| |
{
| |
return StringSubstr(text, 1, n - 2);
| |
}
| |
return text;
| |
}
| |
| |
static string hash(const string text, const ENUM_CRYPT_METHOD method = CRYPT_HASH_MD5)
| |
{
| |
uchar data[], result[], empty[];
| |
StringToCharArray(text, data, 0, StringLen(text), CP_UTF8);
| |
CryptEncode(method, data, empty, result);
| |
if(method != CRYPT_BASE64)
| |
{
| |
string str = "";
| |
for(int i = 0; i < ArraySize(result); ++i)
| |
{
| |
str += StringFormat("%02x", result[i]);
| |
}
| |
return str;
| |
}
| |
return CharArrayToString(result);
| |
}
| |
| |
string combine(const ushort delimiter, const ushort glue)
| |
{
| |
const int n = ArraySize(lines);
| |
string result = "";
| |
for(int i = 0; i < n / 2; ++i)
| |
{
| |
result += (i > 0 ? ShortToString(delimiter) : "") + lines[i] + ShortToString(glue) + lines[i + n / 2];
| |
}
| |
return result;
| |
}
| |
};
| |
//+------------------------------------------------------------------+
|