Skip to content

Commit

Permalink
fix: http header keys are case in-sensitive
Browse files Browse the repository at this point in the history
  • Loading branch information
DeepDiver1975 committed Nov 25, 2024
1 parent 83d7be7 commit 9ace928
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 16 deletions.
2 changes: 1 addition & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ set(APPLE_SUPPRESS_X11_WARNING ON)

set(CMAKE_POSITION_INDEPENDENT_CODE ON)

find_package(QT 6.5 NAMES Qt6 COMPONENTS Core REQUIRED)
find_package(QT 6.6 NAMES Qt6 COMPONENTS Core REQUIRED)

find_package(Qt6 COMPONENTS Core Concurrent Network Widgets Xml Quick QuickWidgets QuickControls2 REQUIRED)
find_package(Qt6LinguistTools REQUIRED)
Expand Down
35 changes: 20 additions & 15 deletions src/libsync/httplogger.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
#include "common/utility.h"

#include <QBuffer>
#include <QHttpHeaders>
#include <QJsonArray>
#include <QJsonDocument>
#include <QJsonObject>
Expand Down Expand Up @@ -64,17 +65,17 @@ struct HttpContext
bool send = false;
};

void logHttp(const QByteArray &verb, HttpContext *ctx, QJsonObject &&header, QIODevice *device, bool cached = false)
void logHttp(const QByteArray &verb, const QHttpHeaders &headers, HttpContext *ctx, QJsonObject &&header, QIODevice *device, bool cached = false)
{
static const bool redact = !qEnvironmentVariableIsSet("OWNCLOUD_HTTPLOGGER_NO_REDACT");
const auto reply = qobject_cast<QNetworkReply *>(device);
const auto contentLength = device ? device->size() : 0;

if (redact) {
const QString authKey = QStringLiteral("Authorization");
const QString auth = header.value(authKey).toString();
if (!auth.isEmpty()) {
header.insert(authKey, auth.startsWith(QStringLiteral("Bearer ")) ? QStringLiteral("Bearer [redacted]") : QStringLiteral("Basic [redacted]"));
if (headers.contains(QHttpHeaders::WellKnownHeader::Authorization)) {
const auto auth = QString::fromUtf8(headers.value(QHttpHeaders::WellKnownHeader::Authorization));
header.insert(QStringLiteral("Authorization"),
auth.startsWith(QStringLiteral("Bearer ")) ? QStringLiteral("Bearer [redacted]") : QStringLiteral("Basic [redacted]"));
}
}

Expand Down Expand Up @@ -105,10 +106,7 @@ void logHttp(const QByteArray &verb, HttpContext *ctx, QJsonObject &&header, QIO

QJsonObject body = {{QStringLiteral("length"), contentLength}};
if (contentLength > 0) {
QString contentType = header.value(QStringLiteral("Content-Type")).toString();
if (contentType.isEmpty()) {
contentType = header.value(QStringLiteral("content-type")).toString();
}
const auto contentType = QString::fromUtf8(headers.value(QHttpHeaders::WellKnownHeader::ContentType));
if (isTextBody(contentType)) {
if (!device->isOpen()) {
Q_ASSERT(dynamic_cast<QBuffer *>(device));
Expand All @@ -117,8 +115,7 @@ void logHttp(const QByteArray &verb, HttpContext *ctx, QJsonObject &&header, QIO
}
Q_ASSERT(device->pos() == 0);
QString data = QString::fromUtf8(device->peek(PeekSize));
if (PeekSize < contentLength)
{
if (PeekSize < contentLength) {
data += QStringLiteral("...(%1 bytes elided)").arg(QString::number(contentLength - PeekSize));
}
body[QStringLiteral("data")] = data;
Expand Down Expand Up @@ -163,10 +160,14 @@ void HttpLogger::logRequest(QNetworkReply *reply, QNetworkAccessManager::Operati

const auto request = reply->request();
QJsonObject header;
QHttpHeaders h = {};
for (const auto &key : request.rawHeaderList()) {
header[QString::fromUtf8(key)] = QString::fromUtf8(request.rawHeader(key));
auto k = QString::fromUtf8(key);
auto v = QString::fromUtf8(request.rawHeader(key));
header[k] = v;
h.append(k, v);
}
logHttp(requestVerb(operation, request), ctx, std::move(header), device, cached);
logHttp(requestVerb(operation, request), h, ctx, std::move(header), device, cached);
};
QObject::connect(reply, &QNetworkReply::requestSent, reply, logSend, Qt::DirectConnection);

Expand All @@ -179,10 +180,14 @@ void HttpLogger::logRequest(QNetworkReply *reply, QNetworkAccessManager::Operati
logSend(true);
}
QJsonObject header;
QHttpHeaders h = {};
for (const auto &[key, value] : reply->rawHeaderPairs()) {
header[QString::fromUtf8(key)] = QString::fromUtf8(value);
auto k = QString::fromUtf8(key);
auto v = QString::fromUtf8(value);
header[k] = v;
h.append(k, v);
}
logHttp(requestVerb(*reply), ctx.get(), std::move(header), reply);
logHttp(requestVerb(*reply), h, ctx.get(), std::move(header), reply);
},
Qt::DirectConnection);
}
Expand Down

0 comments on commit 9ace928

Please sign in to comment.