10 #include "request_p.h" 11 #include "application.h" 12 #include "response_p.h" 13 #include "context_p.h" 20 #include <QJsonDocument> 45 : d_ptr(new EnginePrivate)
58 qFatal(
"*** FATAL *** Could not create a NEW instance of your Cutelyst::Application, " 59 "make sure your constructor has Q_INVOKABLE macro or disable threaded mode.");
65 d->app->setParent(
this);
109 return d->workerCore;
117 qCCritical(CUTELYST_ENGINE) <<
"Cannot init application on a different thread";
121 if (!d->app->setup(
this)) {
122 qCCritical(CUTELYST_ENGINE) <<
"Failed to setup application";
134 qCCritical(CUTELYST_ENGINE) <<
"Failed to postForkApplication on a null application";
140 return d->app->enginePostFork();
153 ret =
"HTTP/1.1 200 OK";
155 case Response::Found:
156 ret =
"HTTP/1.1 302 Found";
158 case Response::NotFound:
159 ret =
"HTTP/1.1 404 Not Found";
161 case Response::InternalServerError:
162 ret =
"HTTP/1.1 500 Internal Server Error";
164 case Response::MovedPermanently:
165 ret =
"HTTP/1.1 301 Moved Permanently";
167 case Response::NotModified:
168 ret =
"HTTP/1.1 304 Not Modified";
170 case Response::SeeOther:
171 ret =
"HTTP/1.1 303 See Other";
173 case Response::Forbidden:
174 ret =
"HTTP/1.1 403 Forbidden";
176 case Response::TemporaryRedirect:
177 ret =
"HTTP/1.1 307 Temporary Redirect";
179 case Response::Unauthorized:
180 ret =
"HTTP/1.1 401 Unauthorized";
182 case Response::BadRequest:
183 ret =
"HTTP/1.1 400 Bad Request";
185 case Response::MethodNotAllowed:
186 ret =
"HTTP/1.1 405 Method Not Allowed";
188 case Response::RequestTimeout:
189 ret =
"HTTP/1.1 408 Request Timeout";
191 case Response::Continue:
192 ret =
"HTTP/1.1 100 Continue";
194 case Response::SwitchingProtocols:
195 ret =
"HTTP/1.1 101 Switching Protocols";
197 case Response::Created:
198 ret =
"HTTP/1.1 201 Created";
200 case Response::Accepted:
201 ret =
"HTTP/1.1 202 Accepted";
203 case Response::NonAuthoritativeInformation:
204 ret =
"HTTP/1.1 203 Non-Authoritative Information";
206 case Response::NoContent:
207 ret =
"HTTP/1.1 204 No Content";
209 case Response::ResetContent:
210 ret =
"HTTP/1.1 205 Reset Content";
212 case Response::PartialContent:
213 ret =
"HTTP/1.1 206 Partial Content";
215 case Response::MultipleChoices:
216 ret =
"HTTP/1.1 300 Multiple Choices";
218 case Response::UseProxy:
219 ret =
"HTTP/1.1 305 Use Proxy";
221 case Response::PaymentRequired:
222 ret =
"HTTP/1.1 402 Payment Required";
224 case Response::NotAcceptable:
225 ret =
"HTTP/1.1 406 Not Acceptable";
227 case Response::ProxyAuthenticationRequired:
228 ret =
"HTTP/1.1 407 Proxy Authentication Required";
230 case Response::Conflict:
231 ret =
"HTTP/1.1 409 Conflict";
234 ret =
"HTTP/1.1 410 Gone";
236 case Response::LengthRequired:
237 ret =
"HTTP/1.1 411 Length Required";
239 case Response::PreconditionFailed:
240 ret =
"HTTP/1.1 412 Precondition Failed";
242 case Response::RequestEntityTooLarge:
243 ret =
"HTTP/1.1 413 Request Entity Too Large";
245 case Response::RequestURITooLong:
246 ret =
"HTTP/1.1 414 Request-URI Too Long";
248 case Response::UnsupportedMediaType:
249 ret =
"HTTP/1.1 415 Unsupported Media Type";
251 case Response::RequestedRangeNotSatisfiable:
252 ret =
"HTTP/1.1 416 Requested Range Not Satisfiable";
254 case Response::ExpectationFailed:
255 ret =
"HTTP/1.1 417 Expectation Failed";
257 case Response::NotImplemented:
258 ret =
"HTTP/1.1 501 Not Implemented";
260 case Response::BadGateway:
261 ret =
"HTTP/1.1 502 Bad Gateway";
263 case Response::ServiceUnavailable:
264 ret =
"HTTP/1.1 503 Service Unavailable";
266 case Response::MultiStatus:
267 ret =
"HTTP/1.1 207 Multi-Status";
269 case Response::GatewayTimeout:
270 ret =
"HTTP/1.1 504 Gateway Timeout";
272 case Response::HTTPVersionNotSupported:
273 ret =
"HTTP/1.1 505 HTTP Version Not Supported";
275 case Response::BandwidthLimitExceeded:
276 ret =
"HTTP/1.1 509 Bandwidth Limit Exceeded";
284 *len = int(strlen(ret));
292 return d->app->defaultHeaders();
298 d->app->handleRequest(request);
310 return d->config.value(entity).toMap();
322 QSettings settings(filename, QSettings::IniFormat);
323 if (settings.
status() != QSettings::NoError) {
324 qCWarning(CUTELYST_ENGINE) <<
"Failed to load INI file:" << settings.
status();
329 for (
const QString &group : groups) {
330 QVariantMap configGroup;
333 for (
const QString &key : child) {
337 ret.insert(group, configGroup);
346 QFile file(filename);
347 if (!file.
open(QIODevice::ReadOnly)) {
357 #include "moc_engine.cpp" QJsonDocument fromJson(const QByteArray &json, QJsonParseError *error)
QStringList childKeys() const const
void setConfig(const QVariantMap &config)
static const char * httpStatusMessage(quint16 status, int *len=nullptr)
void processRequest(EngineRequest *request)
bool initApplication()
initApplication
QThread * thread() const const
bool postForkApplication()
postForkApplication
static QVariantMap loadIniConfig(const QString &filename)
qint64 currentMSecsSinceEpoch()
QString number(int n, int base)
Engine(Application *app, int workerCore, const QVariantMap &opts)
void setObjectName(const QString &name)
QVariantMap config(const QString &entity) const
user configuration for the application
QByteArray number(int n, int base)
QStringList childGroups() const const
void processRequestAsync(Cutelyst::EngineRequest *request)
static QVariantMap loadJsonConfig(const QString &filename)
The Cutelyst namespace holds all public Cutelyst API.
virtual bool open(QIODevice::OpenMode mode) override
QVariant toVariant() const const
QSettings::Status status() const const
QVariant value(const QString &key, const QVariant &defaultValue) const const
QMap< QString, QVariant > toMap() const const
Application * app() const
application
void insert(int i, const T &value)
QThread * currentThread()
The Cutelyst Application.
Headers & defaultHeaders()
QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
int workerCore() const
Each worker process migth have a number of worker cores (threads), a single process with two worker ...
void beginGroup(const QString &prefix)