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 if (!std::any_of(s_starters.cbegin(), s_starters.cend(), [&](
const char * Starter)
65 { return strcmp(Starter, buf.data()) == 0; }))
67 LOG(VB_GENERAL, LOG_WARNING,
LOC + QString(
"Invalid HTTP request start '%1' - quitting").arg(buf.constData()));
76 QByteArray line = Socket->readLine().trimmed();
80 if (line.size() > 2048)
82 LOG(VB_GENERAL, LOG_WARNING,
LOC +
"Unusually long header - quitting");
94 int index = line.indexOf(
":");
97 QByteArray key = line.left(index).trimmed().toLower();
98 QByteArray value = line.mid(index + 1).trimmed();
99 if (key ==
"content-length")
105 LOG(VB_GENERAL, LOG_WARNING,
LOC + QString(
"Invalid header: '%1'").arg(line.constData()));
132 while ((Socket->state() == QAbstractSocket::ConnectedState) && Socket->bytesAvailable() &&
136 int64_t have = Socket->bytesAvailable();
137 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_)