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;
40QByteArray dateHeader();
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) {
98 connect(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) {
129 connect(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
164QByteArray ServerEngine::dateHeader()
167 ret = u
"\r\nDate: " + QLocale::c().toString(QDateTime::currentDateTimeUtc(),
168 u
"ddd, dd MMM yyyy hh:mm:ss 'GMT"_s);
169 return ret.toLatin1();
172Protocol *ServerEngine::getProtoHttp()
175 if (m_server->upgradeH2c()) {
176 m_protoHttp =
new ProtocolHttp(m_server, getProtoHttp2());
178 m_protoHttp =
new ProtocolHttp(m_server);
187 m_protoHttp2 =
new ProtocolHttp2(m_server);
192Protocol *ServerEngine::getProtoFastCgi()
195 m_protoFcgi =
new ProtocolFastCGI(m_server);
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.