Merge pull request #8525 from glassez/url-query

Parse URL query string at application level
This commit is contained in:
Vladimir Golovnev
2018-03-07 17:16:21 +03:00
committed by GitHub
10 changed files with 176 additions and 72 deletions

View File

@@ -46,10 +46,12 @@
#include <QTimer>
#include <QUrl>
#include "base/global.h"
#include "base/http/httperror.h"
#include "base/iconprovider.h"
#include "base/logger.h"
#include "base/preferences.h"
#include "base/utils/bytearray.h"
#include "base/utils/fs.h"
#include "base/utils/misc.h"
#include "base/utils/net.h"
@@ -245,8 +247,6 @@ const Http::Environment &WebApplication::env() const
void WebApplication::doProcessRequest()
{
QStringMap *params = &((request().method == QLatin1String("GET"))
? m_request.gets : m_request.posts);
QString scope, action;
const auto findAPICall = [&]() -> bool
@@ -337,13 +337,13 @@ void WebApplication::doProcessRequest()
action = compatInfo.action;
if (legacyAction == QLatin1String("command/delete"))
(*params)["deleteFiles"] = "false";
m_params["deleteFiles"] = "false";
else if (legacyAction == QLatin1String("command/deletePerm"))
(*params)["deleteFiles"] = "true";
m_params["deleteFiles"] = "true";
const QString hash {match.captured(QLatin1String("hash"))};
if (!hash.isEmpty())
(*params)[QLatin1String("hash")] = hash;
m_params[QLatin1String("hash")] = hash;
return true;
};
@@ -379,7 +379,7 @@ void WebApplication::doProcessRequest()
data[torrent.filename] = torrent.data;
try {
const QVariant result = controller->run(action, *params, data);
const QVariant result = controller->run(action, m_params, data);
switch (result.userType()) {
case QMetaType::QString:
print(result.toString(), Http::CONTENT_TYPE_TXT);
@@ -486,6 +486,24 @@ Http::Response WebApplication::processRequest(const Http::Request &request, cons
m_currentSession = nullptr;
m_request = request;
m_env = env;
m_params.clear();
if (m_request.method == Http::METHOD_GET) {
// Parse GET parameters
using namespace Utils::ByteArray;
for (const QByteArray &param : copyAsConst(splitToViews(m_request.query, "&"))) {
const int sepPos = param.indexOf('=');
if (sepPos <= 0) continue; // ignores params without name
const QString paramName {QString::fromUtf8(param.constData(), sepPos)};
const int valuePos = sepPos + 1;
const QString paramValue {
QString::fromUtf8(param.constData() + valuePos, param.size() - valuePos)};
m_params[paramName] = paramValue;
}
}
else {
m_params = m_request.posts;
}
// clear response
clear();

View File

@@ -124,6 +124,7 @@ private:
WebSession *m_currentSession = nullptr;
Http::Request m_request;
Http::Environment m_env;
QMap<QString, QString> m_params;
const QRegularExpression m_apiPathPattern {(QLatin1String("^/api/v2/(?<scope>[A-Za-z_][A-Za-z_0-9]*)/(?<action>[A-Za-z_][A-Za-z_0-9]*)$"))};
const QRegularExpression m_apiLegacyPathPattern {QLatin1String("^/(?<action>((sync|command|query)/[A-Za-z_][A-Za-z_0-9]*|login|logout))(/(?<hash>[^/]+))?$")};