12#define LOC QString("HTTPParse: ")
26 : m_serverName(Config.m_serverName),
27 m_method(
std::move(Method)),
28 m_headers(
std::move(Headers)),
29 m_content(
std::move(Content)),
30 m_root(Config.m_rootDir),
31 m_timeout(Config.m_timeout)
34 QStringList tokens =
m_method.simplified().split(
' ', Qt::SkipEmptyParts);
38 if (tokens.size() < 2 || tokens.size() > 3)
40 LOG(VB_GENERAL, LOG_WARNING,
LOC +
"Failed to parse HTTP method");
54 if (tokens.size() > 2)
60 LOG(VB_GENERAL, LOG_WARNING,
LOC +
"Unknown HTTP version");
68 LOG(VB_GENERAL, LOG_WARNING,
LOC +
"Unknown HTTP request");
73 bool havehost =
m_headers->contains(
"host");
76 LOG(VB_GENERAL, LOG_WARNING,
LOC +
"No host header for HTTP/1.1");
81 if (havehost &&
m_headers->count(
"host") > 1)
83 LOG(VB_GENERAL, LOG_WARNING,
LOC +
"Multiple 'Host' headers forbidden");
112 QHostAddress host = Socket->localAddress();
120 if (!
m_url.isValid())
122 LOG(VB_GENERAL, LOG_WARNING,
LOC + QString(
"Invalid URL: '%1'").arg(
m_url.toString()));
127 m_path =
m_url.toString(QUrl::RemoveFilename | QUrl::RemoveFragment | QUrl::RemoveQuery);
135 if (connection.contains(QStringLiteral(
"keep-alive")))
137 else if (connection.contains(QStringLiteral(
"close")))
154 QStringList params = Query.split(
'&', Qt::SkipEmptyParts);
155 for (
const auto & param : std::as_const(params))
157 QString key = param.section(
'=', 0, 0);
158 QString value = param.section(
'=', 1);
159 QByteArray rawvalue = value.toUtf8();
160 value = QUrl::fromPercentEncoding(rawvalue);
161 value.replace(
"+",
" ");
163 result.insert(key.trimmed().toLower(), value);
static void GetContentType(MythHTTPRequest *Request)
Parse the incoming Content-Type header for POST/PUT content.
MythHTTPRequest(const MythHTTPConfig &Config, QString Method, HTTPHeaders Headers, HTTPData Content, QTcpSocket *Socket=nullptr)
MythHTTPConnection m_connection
static HTTPQueries ParseQuery(const QString &Query)
MythHTTPRequestType m_type
MythHTTPVersion m_version
QHostAddress m_peerAddress
static MythHTTPVersion VersionFromString(const QString &Version)
static QString AddressToString(QHostAddress &Address)
static QString GetHeader(const HTTPHeaders &Headers, const QString &Value, const QString &Default="")
static MythHTTPRequestType RequestFromString(const QString &Type)
@ HTTPConnectionKeepAlive
std::shared_ptr< HTTPMap > HTTPHeaders
std::shared_ptr< MythHTTPData > HTTPData
#define LOG(_MASK_, _LEVEL_, _QSTRING_)