6 #include "application.h" 10 #include "controller.h" 11 #include "dispatcher.h" 18 #include <QCoreApplication> 30 : d_ptr(new ContextPrivate(app, app->engine(), app->dispatcher(), app->plugins()))
32 auto req =
new DummyRequest(
this);
39 d_ptr->request->d_ptr->engine = d_ptr->engine;
44 delete d_ptr->request;
45 delete d_ptr->response;
52 return !d->error.isEmpty();
58 if (
error.isEmpty()) {
62 qCCritical(CUTELYST_CORE) <<
error;
117 return d->action->name();
123 return d->action->ns();
141 return d->dispatcher;
153 return d->action->controller();
159 return d->dispatcher->controllers().value(name);
171 return d->app->view(name);
177 return d->app->view(name);
183 d->view = d->app->view(name);
196 return d->stash.value(key);
202 return d->stash.value(key, defaultValue);
208 return d->stash.take(key);
214 return d->stash.remove(key);
220 d->stash.insert(key, value);
241 QUrl uri = d->request->uri();
246 const QString controllerNS = d->action->controller()->ns();
255 if (_path.
compare(u
"/") == 0) {
256 _path += args.
join(u
'/');
258 _path = _path + u
'/' + args.
join(u
'/');
270 if (queryValues.
size()) {
293 localAction = d->action;
299 Action *expandedAction = d->dispatcher->expandAction(
this,
action);
306 localCapturesAux.
append(localArgs);
307 localArgs = localCapturesAux;
311 const QString path = d->dispatcher->uriForAction(localAction, localCaptures);
313 qCWarning(CUTELYST_CORE) <<
"Can not find action for" << localAction << localCaptures;
317 uri =
uriFor(path, localArgs, queryValues);
331 qCWarning(CUTELYST_CORE) <<
"Can not find action for" << path;
349 d->dispatcher->forward(
this,
action);
370 if (--d->actionRefCount || !d->stack.isEmpty()) {
374 if (Q_UNLIKELY(d->engineRequest->status & EngineRequest::Finalized)) {
375 qCWarning(CUTELYST_ASYNC) <<
"Trying to async attach to a finalized request! Skipping...";
379 if (d->engineRequest->status & EngineRequest::Async) {
380 while (!d->pendingAsync.isEmpty()) {
384 if (d->actionRefCount) {
393 Q_EMIT d->app->afterDispatch(
this);
402 return d->dispatcher->forward(
this,
action);
408 return d->dispatcher->forward(
this,
action);
414 return d->dispatcher->getAction(
action,
ns);
420 return d->dispatcher->getActions(
action,
ns);
432 Q_ASSERT_X(code,
"Context::execute",
"trying to execute a null Cutelyst::Component");
434 static int recursion =
435 qEnvironmentVariableIsSet(
"RECURSION") ? qEnvironmentVariableIntValue(
"RECURSION") : 1000;
436 if (d->stack.size() >= recursion) {
437 QString msg = QStringLiteral(
"Deep recursion detected (stack size %1) calling %2, %3")
448 const QString statsInfo = d->statsStartExecute(code);
454 if (d->stats && !statsInfo.
isEmpty()) {
455 d->statsFinishExecute(statsInfo);
481 return d->app->config(key, defaultValue);
487 return d->app->config();
491 const char *sourceText,
492 const char *disambiguation,
496 return d->app->translate(d->locale, context, sourceText, disambiguation, n);
503 if (Q_UNLIKELY(d->engineRequest->status & EngineRequest::Finalized)) {
504 qCWarning(CUTELYST_CORE) <<
"Trying to finalize a finalized request! Skipping...";
509 qCDebug(CUTELYST_STATS,
510 "Response Code: %d; Content-Type: %s; Content-Length: %s",
511 d->response->status(),
512 qPrintable(d->response->headers().header(QStringLiteral(
"CONTENT_TYPE"),
513 QStringLiteral(
"unknown"))),
514 qPrintable(d->response->headers().header(QStringLiteral(
"CONTENT_LENGTH"),
515 QStringLiteral(
"unknown"))));
517 const double enlapsed = d->engineRequest->elapsed.nsecsElapsed() / 1000000000.0;
519 if (enlapsed == 0.0) {
520 average = QStringLiteral(
"??");
525 qCInfo(CUTELYST_STATS) << qPrintable(QStringLiteral(
"Request took: %1s (%2/s)\n%3")
533 d->engineRequest->finalize();
546 if (qobject_cast<Action *>(code)) {
550 if (stack.size() > 2) {
551 actionName = u
"-> " + actionName;
556 stats->profileStart(actionName);
561 void ContextPrivate::statsFinishExecute(
const QString &statsInfo)
563 stats->profileEnd(statsInfo);
569 auto it = unite.constBegin();
570 while (it != unite.constEnd()) {
571 d->stash.insert(it.key(), it.value());
576 #include "moc_context.cpp" 577 #include "moc_context_p.cpp" Context(Application *app)
Constructs a new DUMMY Context object that is child of Application This currently is experimental to ...
void truncate(int position)
bool state() const noexcept
bool error() const noexcept
Returns true if an error was set.
bool setCustomView(const QString &name)
QString & prepend(QChar ch)
Response * res() const noexcept
QMap::const_iterator constBegin() const const
void setStash(const QString &key, const QVariant &value)
QString ns() const noexcept
void detach(Action *action=nullptr)
QString join(const QString &separator) const const
View * view(const QString &name) const
Request * req() const noexcept
QUrl uriFor(const QString &path=QString(), const QStringList &args=QStringList(), const ParamsMultiMap &queryValues=ParamsMultiMap()) const
virtual bool open(QIODevice::OpenMode mode)
The Cutelyst Component base class.
QString actionName() const noexcept
This class represents a Cutelyst Action.
Headers & defaultHeaders() noexcept
QUrl uriForAction(const QString &path, const QStringList &captures=QStringList(), const QStringList &args=QStringList(), const ParamsMultiMap &queryValues=ParamsMultiMap()) const
void setPath(const QString &path, QUrl::ParsingMode mode)
void addQueryItem(const QString &key, const QString &value)
bool forward(Component *component)
QString number(int n, int base)
Cutelyst Controller base class
void append(const T &value)
QString rightJustified(int width, QChar fill, bool truncate) const const
Action * action() const noexcept
bool detached() const noexcept
bool isEmpty() const const
bool isEmpty() const const
QMap::const_iterator constEnd() const const
QVector< Action * > getActions(const QString &action, const QString &ns={}) const
Request * request() const noexcept
bool startsWith(const QString &s, Qt::CaseSensitivity cs) const const
QString translate(const char *context, const char *sourceText, const char *disambiguation=nullptr, int n=-1) const
QVariantMap config() const noexcept
virtual qint8 numberOfCaptures() const noexcept
The Cutelyst namespace holds all public Cutelyst API.
void detachAsync() noexcept
QLocale locale() const noexcept
bool execute(Component *code)
QVector< Plugin * > plugins() const
QVariant fromValue(const T &value)
Action * getAction(const QString &action, const QString &ns={}) const
void setLocale(const QLocale &locale)
Application * app() const noexcept
QStack< Component * > stack() const noexcept
QVariant stashTake(const QString &key)
Engine * engine() const noexcept
QString arg(qlonglong a, int fieldWidth, int base, QChar fillChar) const const
Cutelyst View abstract view component
Controller * controller() const noexcept
void setQuery(const QString &query, QUrl::ParsingMode mode)
QString fromLatin1(const char *str, int size)
The Cutelyst Application.
bool stashRemove(const QString &key)
bool isEmpty() const const
void setState(bool state) noexcept
Sets the state of the current executed action, setting to false will make the dispatcher skip non pro...
Response * response() const noexcept
int compare(const QString &other, Qt::CaseSensitivity cs) const const
void finalize()
finalize the request right away this is automatically called at the end of the actions chain ...
View * customView() const noexcept
QStringList errors() const noexcept
Returns a list of errors that were defined.
QString controllerName() const
void attachAsync()
attachAsync
Dispatcher * dispatcher() const noexcept