13#define LOC QString("HTTPParser: ")
22 LOG(VB_HTTP, LOG_DEBUG, it.key() +
": " + it.value());
24 LOG(VB_HTTP, LOG_DEBUG, QString(
"Content:\r\n") +
m_content->constData());
47 if (!Socket || (Socket->state() != QAbstractSocket::ConnectedState))
53 LOG(VB_GENERAL, LOG_WARNING,
LOC + QString(
"Read %1 headers - aborting").arg(
m_linesRead));
58 if (!
m_started && Socket->bytesAvailable() > 2)
60 QByteArray buf(3,
'\0');
61 if (Socket->peek(buf.data(), 3) == 3)
63 static const std::vector<const char *> s_starters = {
"GET",
"PUT",
"POS",
"OPT",
"HEA",
"DEL" };
64#ifdef __cpp_lib_ranges_contains
65 if (!std::ranges::contains(s_starters, buf.data()))
67 if (std::ranges::none_of(s_starters, [&](
const char * Starter)
68 {
return strcmp(Starter, buf.data()) == 0; }))
71 LOG(VB_GENERAL, LOG_WARNING,
LOC + QString(
"Invalid HTTP request start '%1' - quitting").arg(buf.constData()));
80 QByteArray line = Socket->readLine().trimmed();
84 if (line.size() > 2048)
86 LOG(VB_GENERAL, LOG_WARNING,
LOC +
"Unusually long header - quitting");
98 int index = line.indexOf(
":");
101 QByteArray key = line.left(index).trimmed().toLower();
102 QByteArray value = line.mid(index + 1).trimmed();
103 if (key ==
"content-length")
109 LOG(VB_GENERAL, LOG_WARNING,
LOC + QString(
"Invalid header: '%1'").arg(line.constData()));
136 while ((Socket->state() == QAbstractSocket::ConnectedState) && Socket->bytesAvailable() &&
140 int64_t have = Socket->bytesAvailable();
141 m_content->append(Socket->read(std::max({want, HTTP_CHUNKSIZE, have})));
bool Read(QTcpSocket *Socket, bool &Ready)
HTTPRequest2 GetRequest(const MythHTTPConfig &Config, QTcpSocket *Socket)
std::shared_ptr< MythHTTPRequest > HTTPRequest2
static bool VERBOSE_LEVEL_CHECK(uint64_t mask, LogLevel_t level)
#define LOG(_MASK_, _LEVEL_, _QSTRING_)