AusweisApp2/src/network/HttpServer.cpp

123 lines
2.6 KiB
C++
Raw Normal View History

2017-07-03 09:33:28 +02:00
/*!
2019-05-22 10:08:38 +02:00
* \copyright Copyright (c) 2016-2019 Governikus GmbH & Co. KG, Germany
2017-07-03 09:33:28 +02:00
*/
#include "HttpServer.h"
#include <QLoggingCategory>
2019-01-03 15:06:22 +01:00
#include <QTcpSocket>
2017-07-03 09:33:28 +02:00
using namespace governikus;
Q_DECLARE_LOGGING_CATEGORY(network)
2019-01-03 15:06:22 +01:00
quint16 HttpServer::cPort = PortFile::cDefaultPort;
2017-07-03 09:33:28 +02:00
HttpServer::HttpServer(quint16 pPort)
: QObject()
, mServer(new QTcpServer)
2019-01-03 15:06:22 +01:00
, mPortFile()
2017-07-03 09:33:28 +02:00
{
connect(mServer.data(), &QTcpServer::newConnection, this, &HttpServer::onNewConnection);
if (mServer->listen(QHostAddress::LocalHost, pPort))
{
2019-01-03 15:06:22 +01:00
mPortFile.handlePort(mServer->serverPort());
2017-07-03 09:33:28 +02:00
qCDebug(network) << "Listening on port:" << mServer->serverPort();
}
else
{
qCDebug(network) << "Cannot start server:" << mServer->errorString();
}
}
HttpServer::~HttpServer()
{
if (isListening())
{
qCDebug(network) << "Shutdown server";
mServer->close();
}
}
bool HttpServer::isListening() const
{
return mServer->isListening();
}
quint16 HttpServer::getServerPort() const
{
return mServer->serverPort();
}
void HttpServer::onNewConnection()
{
while (mServer->hasPendingConnections())
{
auto socket = mServer->nextPendingConnection();
socket->startTransaction();
auto request = new HttpRequest(socket, this);
connect(request, &HttpRequest::fireMessageComplete, this, &HttpServer::onMessageComplete);
}
}
2019-01-03 15:06:22 +01:00
bool HttpServer::checkReceiver(const QMetaMethod& pSignal, HttpRequest* pRequest)
{
if (isSignalConnected(pSignal))
{
return true;
}
qCDebug(network) << "No registration found:" << pSignal.name();
pRequest->send(HTTP_STATUS_SERVICE_UNAVAILABLE);
pRequest->deleteLater();
return false;
}
void HttpServer::onMessageComplete(HttpRequest* pRequest)
2017-07-03 09:33:28 +02:00
{
pRequest->setParent(nullptr);
if (pRequest->isUpgrade())
{
if (pRequest->getHeader(QByteArrayLiteral("upgrade")).toLower() == QByteArrayLiteral("websocket"))
{
qCDebug(network) << "Upgrade to websocket requested";
2019-01-03 15:06:22 +01:00
static const QMetaMethod signal = QMetaMethod::fromSignal(&HttpServer::fireNewWebSocketRequest);
if (!checkReceiver(signal, pRequest))
{
return;
}
pRequest->mSocket->rollbackTransaction();
Q_EMIT fireNewWebSocketRequest(QSharedPointer<HttpRequest>(pRequest, &QObject::deleteLater));
2017-07-03 09:33:28 +02:00
}
else
{
qCWarning(network) << "Unknown upgrade requested";
2019-01-03 15:06:22 +01:00
pRequest->send(HTTP_STATUS_NOT_FOUND);
pRequest->deleteLater();
2017-07-03 09:33:28 +02:00
}
}
else
{
2019-01-03 15:06:22 +01:00
static const QMetaMethod signal = QMetaMethod::fromSignal(&HttpServer::fireNewHttpRequest);
if (!checkReceiver(signal, pRequest))
{
return;
}
pRequest->mSocket->commitTransaction();
2017-07-03 09:33:28 +02:00
Q_EMIT fireNewHttpRequest(QSharedPointer<HttpRequest>(pRequest, &QObject::deleteLater));
}
}