fix: Getting http errors (#252)

This commit is contained in:
Petr Mironychev
2025-11-11 09:00:33 +01:00
committed by GitHub
parent 4d79760481
commit 89797639cf
4 changed files with 68 additions and 8 deletions

View File

@ -371,7 +371,7 @@ ChatRootView {
id: errorToast id: errorToast
z: 1000 z: 1000
color: Qt.rgba(0.8, 0.2, 0.2, 0.7) color: Qt.rgba(0.8, 0.2, 0.2, 0.9)
border.color: Qt.darker(infoToast.color, 1.3) border.color: Qt.darker(infoToast.color, 1.3)
toastTextColor: "#FFFFFF" toastTextColor: "#FFFFFF"
} }
@ -380,7 +380,7 @@ ChatRootView {
id: infoToast id: infoToast
z: 1000 z: 1000
color: Qt.rgba(0.2, 0.8, 0.2, 0.7) color: Qt.rgba(0.2, 0.8, 0.2, 0.9)
border.color: Qt.darker(infoToast.color, 1.3) border.color: Qt.darker(infoToast.color, 1.3)
toastTextColor: "#FFFFFF" toastTextColor: "#FFFFFF"
} }

View File

@ -26,7 +26,7 @@ Rectangle {
property alias toastTextColor: textItem.color property alias toastTextColor: textItem.color
property string errorText: "" property string errorText: ""
property int displayDuration: 5000 property int displayDuration: 7000
width: Math.min(parent.width - 40, textItem.implicitWidth + radius) width: Math.min(parent.width - 40, textItem.implicitWidth + radius)
height: visible ? (textItem.implicitHeight + 12) : 0 height: visible ? (textItem.implicitHeight + 12) : 0

View File

@ -60,9 +60,15 @@ void HttpClient::onSendRequest(const HttpRequest &request)
void HttpClient::onReadyRead() void HttpClient::onReadyRead()
{ {
QNetworkReply *reply = qobject_cast<QNetworkReply *>(sender()); QNetworkReply *reply = qobject_cast<QNetworkReply *>(sender());
if (!reply || reply->isFinished()) if (!reply || reply->isFinished())
return; return;
int statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
if (statusCode >= 400) {
return;
}
QString requestId; QString requestId;
{ {
QMutexLocker locker(&m_mutex); QMutexLocker locker(&m_mutex);
@ -94,11 +100,17 @@ void HttpClient::onFinished()
if (!reply) if (!reply)
return; return;
int statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
QByteArray responseBody = reply->readAll();
QNetworkReply::NetworkError networkError = reply->error();
QString networkErrorString = reply->errorString();
reply->disconnect(); reply->disconnect();
QString requestId; QString requestId;
bool hasError = false; bool hasError = false;
QString errorMsg; QString errorMsg;
{ {
QMutexLocker locker(&m_mutex); QMutexLocker locker(&m_mutex);
bool found = false; bool found = false;
@ -116,9 +128,23 @@ void HttpClient::onFinished()
return; return;
} }
if (reply->error() != QNetworkReply::NoError) { hasError = (networkError != QNetworkReply::NoError) || (statusCode >= 400);
hasError = true;
errorMsg = reply->errorString(); if (hasError) {
errorMsg = parseErrorFromResponse(statusCode, responseBody, networkErrorString);
}
LOG_MESSAGE(QString("HttpClient: Request %1 - HTTP Status: %2").arg(requestId).arg(statusCode));
if (!responseBody.isEmpty()) {
LOG_MESSAGE(QString("HttpClient: Request %1 - Response body (%2 bytes): %3")
.arg(requestId)
.arg(responseBody.size())
.arg(QString::fromUtf8(responseBody)));
}
if (hasError) {
LOG_MESSAGE(QString("HttpClient: Request %1 - Error: %2").arg(requestId, errorMsg));
} }
} }
@ -137,6 +163,39 @@ QString HttpClient::addActiveRequest(QNetworkReply *reply, const QString &reques
return requestId; return requestId;
} }
QString HttpClient::parseErrorFromResponse(
int statusCode, const QByteArray &responseBody, const QString &networkErrorString)
{
QString errorMsg;
if (!responseBody.isEmpty()) {
QJsonDocument errorDoc = QJsonDocument::fromJson(responseBody);
if (!errorDoc.isNull() && errorDoc.isObject()) {
QJsonObject errorObj = errorDoc.object();
if (errorObj.contains("error")) {
QJsonObject error = errorObj["error"].toObject();
QString message = error["message"].toString();
QString type = error["type"].toString();
QString code = error["code"].toString();
errorMsg = QString("HTTP %1: %2").arg(statusCode).arg(message);
if (!type.isEmpty())
errorMsg += QString(" (type: %1)").arg(type);
if (!code.isEmpty())
errorMsg += QString(" (code: %1)").arg(code);
} else {
errorMsg = QString("HTTP %1: %2").arg(statusCode).arg(QString::fromUtf8(responseBody));
}
} else {
errorMsg = QString("HTTP %1: %2").arg(statusCode).arg(QString::fromUtf8(responseBody));
}
} else {
errorMsg = QString("HTTP %1: %2").arg(statusCode).arg(networkErrorString);
}
return errorMsg;
}
void HttpClient::cancelRequest(const QString &requestId) void HttpClient::cancelRequest(const QString &requestId)
{ {
QMutexLocker locker(&m_mutex); QMutexLocker locker(&m_mutex);

View File

@ -59,6 +59,7 @@ private slots:
private: private:
QString addActiveRequest(QNetworkReply *reply, const QString &requestId); QString addActiveRequest(QNetworkReply *reply, const QString &requestId);
QString parseErrorFromResponse(int statusCode, const QByteArray &responseBody, const QString &networkErrorString);
QNetworkAccessManager *m_manager; QNetworkAccessManager *m_manager;
QHash<QString, QNetworkReply *> m_activeRequests; QHash<QString, QNetworkReply *> m_activeRequests;