8#include <Cutelyst/Context>
9#include <Cutelyst/ParamsMultiMap>
10#include <cutelee/exception.h>
11#include <cutelee/parser.h>
15using namespace Qt::StringLiterals;
17UriFor::UriFor(
const QString &path,
const QStringList &args, Cutelee::Parser *parser)
18 : Cutelee::Node(parser)
19 , m_path(path, parser)
21 bool foundQuery =
false;
22 for (
const QString &expression : args) {
24 if (expression.compare(u
"QUERY") == 0) {
30 m_queryExpressions.push_back(Cutelee::FilterExpression(expression, parser));
32 m_argsExpressions.push_back(Cutelee::FilterExpression(expression, parser));
35 std::reverse(m_queryExpressions.begin(), m_queryExpressions.end());
38std::pair<QString, QString> splitQuery(
const QString &query)
40 std::pair<QString, QString> ret;
42 ret.first = query.section(u
'=', 0, 0);
43 ret.second = query.section(u
'=', 1);
48void UriFor::render(Cutelee::OutputStream *stream, Cutelee::Context *gc)
const
53 const QVariantHash hash = gc->stackHash(0);
54 for (
const auto &[key, value] : hash.asKeyValueRange()) {
55 if (value.userType() == qMetaTypeId<Cutelyst::Context *>()) {
58 m_cutelystContext = key;
73 QVariant pathVar = m_path.resolve(gc);
74 if (pathVar.userType() == qMetaTypeId<Cutelee::SafeString>()) {
75 path = pathVar.value<Cutelee::SafeString>().
get();
76 }
else if (pathVar.typeId() == QMetaType::QString) {
77 path = pathVar.toString();
79 qWarning() <<
"c_uri_for PATH is not a valid type";
83 for (
const Cutelee::FilterExpression &exp : m_argsExpressions) {
84 QVariant var = exp.resolve(gc);
85 if (var.userType() == qMetaTypeId<Cutelee::SafeString>()) {
86 args << var.value<Cutelee::SafeString>().
get();
87 }
else if (var.typeId() == QMetaType::QString) {
88 args << var.toString();
89 }
else if (var.typeId() == QMetaType::QStringList) {
90 args << var.toStringList();
94 for (
const Cutelee::FilterExpression &exp : m_queryExpressions) {
95 QVariant var = exp.resolve(gc);
96 if (var.userType() == qMetaTypeId<Cutelyst::ParamsMultiMap>()) {
98 queryValues.unite(map);
99 }
else if (var.userType() == qMetaTypeId<Cutelee::SafeString>()) {
100 auto query = splitQuery(var.value<Cutelee::SafeString>().get());
101 queryValues.insert(query.first, query.second);
102 }
else if (var.typeId() == QMetaType::QString) {
103 auto query = splitQuery(var.toString());
104 queryValues.insert(query.first, query.second);
105 }
else if (var.typeId() == QMetaType::QStringList) {
106 const auto queries = var.toStringList();
107 for (
const QString &str : queries) {
108 auto query = splitQuery(str);
109 queryValues.insert(query.first, query.second);
114 *stream << c->uriFor(path, args, queryValues).toString(QUrl::FullyEncoded);
117Cutelee::Node *UriForTag::getNode(
const QString &tagContent, Cutelee::Parser *p)
const
120 QStringList parts = smartSplit(tagContent);
123 if (parts.isEmpty()) {
124 throw Cutelee::Exception(Cutelee::TagSyntaxError,
125 u
"c_uri_for requires at least the path"_s);
128 return new UriFor(parts.first(), parts.mid(1), p);
131#include "moc_urifor.cpp"
QMultiMap< QString, QString > ParamsMultiMap
CUTELYST_PLUGIN_USERAGENT_EXPORT QNetworkReply * get(const QNetworkRequest &request)