5 #include "serverengine.h" 8 #include "localserver.h" 10 #include "protocolfastcgi.h" 11 #include "protocolhttp.h" 12 #include "protocolhttp2.h" 13 #include "protocolwebsocket.h" 16 #include "staticmap.h" 17 #include "tcpserver.h" 18 #include "tcpserverbalancer.h" 19 #include "tcpsslserver.h" 22 # include "unixfork.h" 25 #include <Cutelyst/Application> 26 #include <Cutelyst/Context> 27 #include <Cutelyst/Request> 28 #include <Cutelyst/Response> 32 #include <QCoreApplication> 33 #include <QLoggingCategory> 35 Q_LOGGING_CATEGORY(C_SERVER_ENGINE,
"cutelyst.server.engine", QtWarningMsg)
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);
77 ServerEngine::~ServerEngine()
89 void ServerEngine::setServers(
const std::vector<QObject *> &servers)
91 for (
QObject *server : servers) {
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()) {
116 sslServer->setHttp2Protocol(getProtoHttp2());
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());
147 void 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);
172 Protocol *ServerEngine::getProtoHttp()
175 if (m_server->upgradeH2c()) {
176 m_protoHttp =
new ProtocolHttp(m_server, getProtoHttp2());
192 Protocol *ServerEngine::getProtoFastCgi()
209 void 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" QFuture< ArgsType< Signal >> connect(Sender *sender, Signal signal)
QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)
virtual bool init() override
bool postForkApplication()
QString toString(QDate date, FormatType format) const const
bool isEmpty() const const
The Cutelyst namespace holds all public Cutelyst API.
QByteArray toLatin1() const const
virtual int workerId() const override
The Cutelyst application.
T qobject_cast(QObject *object)
QDateTime currentDateTimeUtc()