20 #include "context_p.h"
23 #include "request_p.h"
24 #include "application.h"
25 #include "response_p.h"
26 #include "context_p.h"
33 #include <QJsonDocument>
58 : d_ptr(new EnginePrivate)
69 auto newApp = qobject_cast<Application *>(
app->metaObject()->newInstance());
71 qFatal(
"*** FATAL *** Could not create a NEW instance of your Cutelyst::Application, "
72 "make sure your constructor has Q_INVOKABLE macro or disable threaded mode.");
81 d->app->setParent(
this);
122 return d->workerCore;
129 if (thread() != QThread::currentThread()) {
130 qCCritical(CUTELYST_ENGINE) <<
"Cannot init application on a different thread";
134 if (!d->app->setup(
this)) {
135 qCCritical(CUTELYST_ENGINE) <<
"Failed to setup application";
147 qCCritical(CUTELYST_ENGINE) <<
"Failed to postForkApplication on a null application";
151 QThread::currentThread()->setObjectName(QString::number(d->workerCore));
153 return d->app->enginePostFork();
158 return quint64(QDateTime::currentMSecsSinceEpoch() * 1000);
166 ret =
"HTTP/1.1 200 OK";
168 case Response::Found:
169 ret =
"HTTP/1.1 302 Found";
171 case Response::NotFound:
172 ret =
"HTTP/1.1 404 Not Found";
174 case Response::InternalServerError:
175 ret =
"HTTP/1.1 500 Internal Server Error";
177 case Response::MovedPermanently:
178 ret =
"HTTP/1.1 301 Moved Permanently";
180 case Response::NotModified:
181 ret =
"HTTP/1.1 304 Not Modified";
183 case Response::SeeOther:
184 ret =
"HTTP/1.1 303 See Other";
186 case Response::Forbidden:
187 ret =
"HTTP/1.1 403 Forbidden";
189 case Response::TemporaryRedirect:
190 ret =
"HTTP/1.1 307 Temporary Redirect";
192 case Response::Unauthorized:
193 ret =
"HTTP/1.1 401 Unauthorized";
195 case Response::BadRequest:
196 ret =
"HTTP/1.1 400 Bad Request";
198 case Response::MethodNotAllowed:
199 ret =
"HTTP/1.1 405 Method Not Allowed";
201 case Response::RequestTimeout:
202 ret =
"HTTP/1.1 408 Request Timeout";
204 case Response::Continue:
205 ret =
"HTTP/1.1 100 Continue";
207 case Response::SwitchingProtocols:
208 ret =
"HTTP/1.1 101 Switching Protocols";
210 case Response::Created:
211 ret =
"HTTP/1.1 201 Created";
213 case Response::Accepted:
214 ret =
"HTTP/1.1 202 Accepted";
216 case Response::NonAuthoritativeInformation:
217 ret =
"HTTP/1.1 203 Non-Authoritative Information";
219 case Response::NoContent:
220 ret =
"HTTP/1.1 204 No Content";
222 case Response::ResetContent:
223 ret =
"HTTP/1.1 205 Reset Content";
225 case Response::PartialContent:
226 ret =
"HTTP/1.1 206 Partial Content";
228 case Response::MultipleChoices:
229 ret =
"HTTP/1.1 300 Multiple Choices";
231 case Response::UseProxy:
232 ret =
"HTTP/1.1 305 Use Proxy";
234 case Response::PaymentRequired:
235 ret =
"HTTP/1.1 402 Payment Required";
237 case Response::NotAcceptable:
238 ret =
"HTTP/1.1 406 Not Acceptable";
240 case Response::ProxyAuthenticationRequired:
241 ret =
"HTTP/1.1 407 Proxy Authentication Required";
243 case Response::Conflict:
244 ret =
"HTTP/1.1 409 Conflict";
247 ret =
"HTTP/1.1 410 Gone";
249 case Response::LengthRequired:
250 ret =
"HTTP/1.1 411 Length Required";
252 case Response::PreconditionFailed:
253 ret =
"HTTP/1.1 412 Precondition Failed";
255 case Response::RequestEntityTooLarge:
256 ret =
"HTTP/1.1 413 Request Entity Too Large";
258 case Response::RequestURITooLong:
259 ret =
"HTTP/1.1 414 Request-URI Too Long";
261 case Response::UnsupportedMediaType:
262 ret =
"HTTP/1.1 415 Unsupported Media Type";
264 case Response::RequestedRangeNotSatisfiable:
265 ret =
"HTTP/1.1 416 Requested Range Not Satisfiable";
267 case Response::ExpectationFailed:
268 ret =
"HTTP/1.1 417 Expectation Failed";
270 case Response::NotImplemented:
271 ret =
"HTTP/1.1 501 Not Implemented";
273 case Response::BadGateway:
274 ret =
"HTTP/1.1 502 Bad Gateway";
276 case Response::ServiceUnavailable:
277 ret =
"HTTP/1.1 503 Service Unavailable";
279 case Response::MultiStatus:
280 ret =
"HTTP/1.1 207 Multi-Status";
282 case Response::GatewayTimeout:
283 ret =
"HTTP/1.1 504 Gateway Timeout";
285 case Response::HTTPVersionNotSupported:
286 ret =
"HTTP/1.1 505 HTTP Version Not Supported";
288 case Response::BandwidthLimitExceeded:
289 ret =
"HTTP/1.1 509 Bandwidth Limit Exceeded";
292 ret = QByteArrayLiteral(
"HTTP/1.1 ").append(QByteArray::number(status)).constData();
297 *len = int(strlen(ret));
305 return d->app->defaultHeaders();
311 d->app->handleRequest(request);
323 return d->config.value(entity).toMap();
335 QSettings settings(filename, QSettings::IniFormat);
336 if (settings.status() != QSettings::NoError) {
337 qCWarning(CUTELYST_ENGINE) <<
"Failed to load INI file:" << settings.status();
341 const auto groups = settings.childGroups();
342 for (
const QString &group : groups) {
343 QVariantMap configGroup;
344 settings.beginGroup(group);
345 const auto child = settings.childKeys();
346 for (
const QString &key : child) {
347 configGroup.insert(key, settings.value(key));
350 ret.insert(group, configGroup);
359 QFile file(filename);
360 if (!file.open(QIODevice::ReadOnly)) {
363 QJsonDocument doc = QJsonDocument::fromJson(file.readAll());
365 ret = doc.toVariant().toMap();
370 #include "moc_engine.cpp"