MQL5Book/Include/HTTPHeader.mqh
super.admin 1c8e83ce31 convert
2025-05-30 16:09:41 +02:00

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;
}
};
//+------------------------------------------------------------------+