18 #include "context_p.h"
24 #include "dispatcher.h"
25 #include "controller.h"
26 #include "application.h"
34 #include <QCoreApplication>
44 d_ptr(new ContextPrivate(app, app->engine(), app->dispatcher(), app->plugins()))
46 auto req =
new DummyRequest(
this);
52 d_ptr->request =
new Request(req);
53 d_ptr->request->d_ptr->engine = d_ptr->engine;
58 delete d_ptr->request;
59 delete d_ptr->response;
66 return !d->error.isEmpty();
72 if (
error.isEmpty()) {
76 qCCritical(CUTELYST_CORE) <<
error;
86 bool Context::state()
const
131 return d->action->name();
137 return d->action->ns();
155 return d->dispatcher;
158 QString Cutelyst::Context::controllerName()
const
167 return d->action->controller();
173 return d->dispatcher->controllers().value(name);
185 return d->app->view(name);
191 d->view = d->app->view(name);
204 return d->stash.value(key);
210 return d->stash.value(key, defaultValue);
216 return d->stash.take(key);
222 return d->stash.remove(key);
228 d->stash.insert(key, value);
247 QUrl uri = d->request->uri();
252 const QString controllerNS = d->action->controller()->ns();
276 if (queryValues.
size()) {
294 Action *localAction = action;
296 localAction = d->action;
302 Action *expandedAction = d->dispatcher->expandAction(
this, action);
305 && localArgs.
size()) {
310 localCapturesAux.
append(localArgs);
311 localArgs = localCapturesAux;
315 const QString path = d->dispatcher->uriForAction(localAction, localCaptures);
317 qCWarning(CUTELYST_CORE) <<
"Can not find action for" << localAction << localCaptures;
321 uri =
uriFor(path, localArgs, queryValues);
330 Action *action = d->dispatcher->getActionByPath(path);
332 qCWarning(CUTELYST_CORE) <<
"Can not find action for" << path;
336 uri =
uriFor(action, captures, args, queryValues);
350 d->dispatcher->forward(
this, action);
360 d->engineRequest->status |= EngineRequest::Async;
366 if (--d->asyncDetached) {
370 if (Q_UNLIKELY(d->engineRequest->status & EngineRequest::Finalized)) {
371 qCWarning(CUTELYST_ASYNC) <<
"Trying to async attach to a finalized request! Skipping...";
375 while (d->asyncAction < d->pendingAsync.size()) {
376 Action *action = d->pendingAsync[d->asyncAction++];
379 }
else if (d->asyncDetached) {
384 if (d->engineRequest->status & EngineRequest::Async) {
385 Q_EMIT d->app->afterDispatch(
this);
394 return d->dispatcher->forward(
this, action);
400 return d->dispatcher->forward(
this, action);
406 return d->dispatcher->getAction(action, ns);
412 return d->dispatcher->getActions(action, ns);
424 Q_ASSERT_X(code,
"Context::execute",
"trying to execute a null Cutelyst::Component");
426 static int recursion = qEnvironmentVariableIsSet(
"RECURSION") ? qEnvironmentVariableIntValue(
"RECURSION") : 1000;
427 if (d->stack.size() >= recursion) {
428 QString msg = QStringLiteral(
"Deep recursion detected (stack size %1) calling %2, %3")
439 const QString statsInfo = d->statsStartExecute(code);
445 if (d->stats && !statsInfo.
isEmpty()) {
446 d->statsFinishExecute(statsInfo);
472 return d->app->config(key, defaultValue);
475 QVariantMap Context::config()
const
478 return d->app->config();
484 return d->app->translate(d->locale, context, sourceText, disambiguation, n);
509 if (Q_UNLIKELY(d->engineRequest->status & EngineRequest::Finalized)) {
510 qCWarning(CUTELYST_CORE) <<
"Trying to finalize a finalized request! Skipping...";
515 qCDebug(CUTELYST_STATS,
"Response Code: %d; Content-Type: %s; Content-Length: %s",
516 d->response->status(),
517 qPrintable(d->response->headers().header(QStringLiteral(
"CONTENT_TYPE"), QStringLiteral(
"unknown"))),
518 qPrintable(d->response->headers().header(QStringLiteral(
"CONTENT_LENGTH"), QStringLiteral(
"unknown"))));
520 const double enlapsed = d->engineRequest->elapsed.nsecsElapsed() / 1000000000.0;
522 if (enlapsed == 0.0) {
523 average = QStringLiteral(
"??");
528 qCInfo(CUTELYST_STATS) << qPrintable(QStringLiteral(
"Request took: %1s (%2/s)\n%3")
536 d->engineRequest->finalize();
562 if (qobject_cast<Action *>(code)) {
566 if (stack.size() > 2) {
571 stats->profileStart(actionName);
576 void ContextPrivate::statsFinishExecute(
const QString &statsInfo)
578 stats->profileEnd(statsInfo);
581 #include "moc_context.cpp"
582 #include "moc_context_p.cpp"
void append(const T &value)
QMap::const_iterator constBegin() const const
QString rightJustified(int width, QChar fill, bool truncate) const const
Cutelyst Controller base class
void truncate(int position)
QString number(int n, int base)
void detach(Action *action=nullptr)
QVariant fromValue(const T &value)
The Cutelyst Application.
void addQueryItem(const QString &key, const QString &value)
QString & prepend(QChar ch)
void attachAsync()
attachAsync
virtual bool open(QIODevice::OpenMode mode)
Context(Application *app)
Constructs a new DUMMY Context object that is child of Application This currently is experimental to ...
void setStash(const QString &key, const QVariant &value)
Response * response() const
The Cutelyst Component base class.
Headers & defaultHeaders()
bool execute(Component *code)
bool setCustomView(const QString &name)
QMap::const_iterator constEnd() const const
QString translate(const char *context, const char *sourceText, const char *disambiguation=nullptr, int n=-1) const
bool isEmpty() const const
void setLocale(const QLocale &locale)
bool isEmpty() const const
bool error() const
Returns true if an error was set.
QVariant stashTake(const QString &key)
QString join(const QString &separator) const const
View * customView() const
Dispatcher * dispatcher() const
void setQuery(const QString &query, QUrl::ParsingMode mode)
bool startsWith(const QString &s, Qt::CaseSensitivity cs) const const
Cutelyst View abstract view component
QUrl uriFor(const QString &path=QString(), const QStringList &args=QStringList(), const ParamsMultiMap &queryValues=ParamsMultiMap()) const
QStringList errors() const
Returns a list of errors that were defined.
The Cutelyst namespace holds all public Cutelyst API.
QString arg(qlonglong a, int fieldWidth, int base, QChar fillChar) const const
void finalize()
finalize the request right away this is automatically called at the end of the actions chain
QString fromLatin1(const char *str, int size)
void setPath(const QString &path, QUrl::ParsingMode mode)
QUrl uriForAction(const QString &path, const QStringList &captures=QStringList(), const QStringList &args=QStringList(), const ParamsMultiMap &queryValues=ParamsMultiMap()) const
This class represents a Cutelyst Action.
QVector< Plugin * > plugins() const
void next(bool force=false)
This method is deprecated and no longer works, creating local event loops leads to crashes.
virtual qint8 numberOfCaptures() const
bool stashRemove(const QString &key)
Application * app() const
Q_DECL_DEPRECATED bool wait(uint count=1)
This method is deprecated and no longer works, creating local event loops leads to crashes.
void setState(bool state)
Sets the state of the current executed action, setting to false will make the dispatcher skip non pro...
QVector< Action * > getActions(const QString &action, const QString &ns=QString()) const
View * view(const QString &name=QString()) const
QStack< Component * > stack() const
bool forward(Component *component)
Action * getAction(const QString &action, const QString &ns=QString()) const
bool isEmpty() const const