5#include "serverengine.h"
8#include "localserver.h"
10#include "protocolfastcgi.h"
11#include "protocolhttp.h"
12#include "protocolhttp2.h"
13#include "protocolwebsocket.h"
18#include "tcpserverbalancer.h"
19#include "tcpsslserver.h"
25#include <Cutelyst/Application>
26#include <Cutelyst/Context>
27#include <Cutelyst/Request>
28#include <Cutelyst/Response>
32#include <QCoreApplication>
33#include <QLoggingCategory>
35Q_LOGGING_CATEGORY(C_SERVER_ENGINE,
"cutelyst.server.engine", QtWarningMsg)
38using namespace Qt::StringLiterals;
44 const QVariantMap &opts,
46 :
Engine(localApp, workerCore, opts)
47 , m_lastDate{dateHeader()}
50 m_lastDateTimer.start();
52 if (m_server->socketTimeout()) {
53 m_socketTimeout =
new QTimer(
this);
54 m_socketTimeout->setObjectName(u
"Cutelyst::socketTimeout"_s);
55 m_socketTimeout->setInterval(std::chrono::seconds{m_server->socketTimeout()});
58 connect(
this, &ServerEngine::shutdown, app(), [
this] { Q_EMIT app()->shuttingDown(app()); });
60 const QStringList staticMap = m_server->staticMap();
61 const QStringList staticMap2 = m_server->staticMap2();
62 if (!staticMap.isEmpty() || !staticMap2.
isEmpty()) {
64 auto staticMapPlugin =
new StaticMap(app());
66 for (
const QString &part : staticMap) {
67 staticMapPlugin->addStaticMap(
68 part.section(u
'=', 0, 0), part.section(u
'=', 1, 1),
false);
71 for (
const QString &part : staticMap2) {
72 staticMapPlugin->addStaticMap(part.section(u
'=', 0, 0), part.section(u
'=', 1, 1),
true);
77ServerEngine::~ServerEngine()
89void ServerEngine::setServers(
const std::vector<QObject *> &servers)
91 for (
QObject *server : servers) {
92 auto balancer = qobject_cast<TcpServerBalancer *>(server);
94 TcpServer *cloneServer = balancer->createServer(
this);
97 if (m_socketTimeout) {
101 &TcpServer::timeoutConnections);
104 if (cloneServer->protocol()->type() == Protocol::Type::Http11) {
105 cloneServer->setProtocol(getProtoHttp());
106 }
else if (cloneServer->protocol()->type() == Protocol::Type::Http2) {
107 cloneServer->setProtocol(getProtoHttp2());
108 }
else if (cloneServer->protocol()->type() == Protocol::Type::FastCGI1) {
109 cloneServer->setProtocol(getProtoFastCgi());
113 if (m_server->httpsH2()) {
114 auto sslServer = qobject_cast<TcpSslServer *>(cloneServer);
116 sslServer->setHttp2Protocol(getProtoHttp2());
123 const auto localServer = qobject_cast<LocalServer *>(server);
125 LocalServer *cloneServer = localServer->createServer(
this);
128 if (m_socketTimeout) {
132 &LocalServer::timeoutConnections);
135 if (cloneServer->protocol()->type() == Protocol::Type::Http11) {
136 cloneServer->setProtocol(getProtoHttp());
137 }
else if (cloneServer->protocol()->type() == Protocol::Type::Http2) {
138 cloneServer->setProtocol(getProtoHttp2());
139 }
else if (cloneServer->protocol()->type() == Protocol::Type::FastCGI1) {
140 cloneServer->setProtocol(getProtoFastCgi());
147void ServerEngine::postFork(
int workerId)
158 std::cerr <<
"Application failed to post fork, cheaping worker: " <<
workerId
168 u
"ddd, dd MMM yyyy hh:mm:ss 'GMT"_s);
172Protocol *ServerEngine::getProtoHttp()
175 if (m_server->upgradeH2c()) {
176 m_protoHttp =
new ProtocolHttp(m_server, getProtoHttp2());
192Protocol *ServerEngine::getProtoFastCgi()
209void ServerEngine::handleSocketShutdown(
Socket *socket)
211 if (socket->processing == 0) {
212 socket->connectionClose();
213 }
else if (socket->proto->type() == Protocol::Type::Http11Websocket) {
215 req->webSocketClose(Response::CloseCode::CloseCodeGoingAway, {});
217 socket->protoData->headerConnection = ProtocolData::HeaderConnection::Close;
221#include "moc_serverengine.cpp"
The Cutelyst application.
bool postForkApplication()
virtual int workerId() const override
virtual bool init() override
The Cutelyst namespace holds all public Cutelyst API.
QDateTime currentDateTimeUtc()
bool isEmpty() const const
QString toString(QDate date, QLocale::FormatType format) const const
QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)
QByteArray toLatin1() const const
QFuture< ArgsType< Signal > > connect(Sender *sender, Signal signal)