AusweisApp2/src/network/HttpResponse.cpp

122 lines
2.8 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 "HttpResponse.h"
2019-01-03 15:06:22 +01:00
#include "NetworkManager.h"
2017-07-03 09:33:28 +02:00
#include <QCoreApplication>
#include <QDateTime>
#include <QLoggingCategory>
#include <QStringBuilder>
using namespace governikus;
namespace
{
2017-12-20 14:54:05 +01:00
#define HEADER_NAME(_name, _key)\
QByteArray _name(){\
return QByteArrayLiteral(_key);\
}
HEADER_NAME(HEADER_CONTENT_LENGTH, "Content-Length")
HEADER_NAME(HEADER_CONTENT_TYPE, "Content-Type")
HEADER_NAME(HEADER_SERVER, "Server")
HEADER_NAME(HEADER_DATE, "Date")
2019-01-03 15:06:22 +01:00
} // namespace
2017-07-03 09:33:28 +02:00
Q_DECLARE_LOGGING_CATEGORY(network)
2019-01-03 15:06:22 +01:00
HttpResponse::HttpResponse(http_status pStatus, const QByteArray& pBody, const QByteArray& pContentType)
2017-07-03 09:33:28 +02:00
: mStatus(pStatus)
, mHeader()
, mBody()
{
setBody(pBody, pContentType);
// According to TR-03124-1, chapter 2.2.2.1, the Server-header shall have the following form:
auto version = QCoreApplication::applicationVersion().toUtf8();
if (!version.isEmpty())
{
version.prepend('/');
}
2017-12-20 14:54:05 +01:00
setHeader(HEADER_SERVER(), QCoreApplication::applicationName().toUtf8() % version % QByteArrayLiteral(" (TR-03124-1/1.3)"));
setHeader(HEADER_DATE(), QLocale::c().toString(QDateTime::currentDateTimeUtc(), QStringLiteral("ddd, dd MMM yyyy hh:mm:ss")).toUtf8() + QByteArrayLiteral(" GMT"));
setHeader(HEADER_CONTENT_LENGTH(), QByteArray::number(mBody.size()));
2017-07-03 09:33:28 +02:00
}
QByteArray HttpResponse::getHeader(const QByteArray& pKey) const
{
return mHeader.value(pKey);
}
const QMap<QByteArray, QByteArray>& HttpResponse::getHeaders() const
{
return mHeader;
}
void HttpResponse::setHeader(const QByteArray& pKey, const QByteArray& pValue)
{
mHeader.insert(pKey, pValue);
}
2019-01-03 15:06:22 +01:00
http_status HttpResponse::getStatus() const
2017-07-03 09:33:28 +02:00
{
return mStatus;
}
2019-01-03 15:06:22 +01:00
void HttpResponse::setStatus(http_status pStatus)
2017-07-03 09:33:28 +02:00
{
mStatus = pStatus;
}
const QByteArray& HttpResponse::getBody() const
{
return mBody;
}
void HttpResponse::setBody(const QByteArray& pBody, const QByteArray& pContentType)
{
mBody = pBody;
2017-12-20 14:54:05 +01:00
setHeader(HEADER_CONTENT_LENGTH(), QByteArray::number(mBody.size()));
2017-07-03 09:33:28 +02:00
if (mBody.isEmpty() || pContentType.isEmpty())
{
Q_ASSERT(pContentType.isEmpty());
2017-12-20 14:54:05 +01:00
mHeader.remove(HEADER_CONTENT_TYPE());
2017-07-03 09:33:28 +02:00
}
else if (!pContentType.isEmpty())
{
2017-12-20 14:54:05 +01:00
setHeader(HEADER_CONTENT_TYPE(), pContentType);
2017-07-03 09:33:28 +02:00
}
}
2019-01-03 15:06:22 +01:00
QByteArray HttpResponse::getStatusMessage() const
2017-07-03 09:33:28 +02:00
{
2019-01-03 15:06:22 +01:00
return NetworkManager::getStatusMessage(mStatus);
}
2017-07-03 09:33:28 +02:00
2019-01-03 15:06:22 +01:00
QByteArray HttpResponse::getMessage() const
{
2017-07-03 09:33:28 +02:00
static const QByteArray CR_LF = QByteArrayLiteral("\r\n");
QByteArrayList list;
2019-01-03 15:06:22 +01:00
list += QByteArrayLiteral("HTTP/1.0 ") % QByteArray::number(mStatus) % ' ' % getStatusMessage();
2017-07-03 09:33:28 +02:00
const auto& end = mHeader.constEnd();
for (auto iter = mHeader.constBegin(); iter != end; ++iter)
{
list += iter.key() % QByteArrayLiteral(": ") % iter.value();
}
return list.join(CR_LF) % CR_LF % CR_LF % mBody;
}