From 3fbf7b34cc2242559a047c3868855c9de6f0c3d3 Mon Sep 17 00:00:00 2001 From: Lorn Potter Date: Thu, 7 May 2020 19:14:36 +1000 Subject: [PATCH] wasm: set status codes from network operation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Pick-to: 5.15 Fixes: QTBUG-83991 Change-Id: Ie1e88189bee8b6a9dc6cb2a721777a5e1032307a Reviewed-by: Morten Johan Sørvig --- src/network/access/qnetworkreplywasmimpl.cpp | 25 +++++++++++++------- src/network/access/qnetworkreplywasmimpl_p.h | 2 ++ 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/src/network/access/qnetworkreplywasmimpl.cpp b/src/network/access/qnetworkreplywasmimpl.cpp index 73fd1396073..94c2106a15c 100644 --- a/src/network/access/qnetworkreplywasmimpl.cpp +++ b/src/network/access/qnetworkreplywasmimpl.cpp @@ -454,15 +454,21 @@ void QNetworkReplyWasmImplPrivate::_q_bufferOutgoingData() void QNetworkReplyWasmImplPrivate::downloadSucceeded(emscripten_fetch_t *fetch) { - QByteArray buffer(fetch->data, fetch->numBytes); - QNetworkReplyWasmImplPrivate *reply = reinterpret_cast(fetch->userData); if (reply) { + QByteArray buffer(fetch->data, fetch->numBytes); reply->dataReceived(buffer, buffer.size()); } } +void QNetworkReplyWasmImplPrivate::setStatusCode(int status, const QByteArray &statusText) +{ + Q_Q(QNetworkReplyWasmImpl); + q->setAttribute(QNetworkRequest::HttpStatusCodeAttribute, status); + q->setAttribute(QNetworkRequest::HttpReasonPhraseAttribute, statusText); +} + void QNetworkReplyWasmImplPrivate::stateChange(emscripten_fetch_t *fetch) { if (fetch->readyState == /*HEADERS_RECEIVED*/ 2) { @@ -488,14 +494,17 @@ void QNetworkReplyWasmImplPrivate::downloadProgress(emscripten_fetch_t *fetch) void QNetworkReplyWasmImplPrivate::downloadFailed(emscripten_fetch_t *fetch) { QNetworkReplyWasmImplPrivate *reply = reinterpret_cast(fetch->userData); - Q_ASSERT(reply); + if (reply) { + QString reasonStr; + if (fetch->status > 600 || reply->state == QNetworkReplyPrivate::Aborted) + reasonStr = QStringLiteral("Operation canceled"); + else + reasonStr = QString::fromUtf8(fetch->statusText); - QString reasonStr = QString::fromUtf8(fetch->statusText); - - reply->setReplyAttributes(reinterpret_cast(fetch->userData), fetch->status, reasonStr); - - if (fetch->status >= 400 && !reasonStr.isEmpty()) + QByteArray statusText(fetch->statusText); + reply->setStatusCode(fetch->status, statusText); reply->emitReplyError(reply->statusCodeFromHttp(fetch->status, reply->request.url()), reasonStr); + } if (fetch->status >= 400) emscripten_fetch_close(fetch); // Also free data on failure. diff --git a/src/network/access/qnetworkreplywasmimpl_p.h b/src/network/access/qnetworkreplywasmimpl_p.h index 3c18342c6c2..0a62e8ad37a 100644 --- a/src/network/access/qnetworkreplywasmimpl_p.h +++ b/src/network/access/qnetworkreplywasmimpl_p.h @@ -112,6 +112,8 @@ public: void dataReceived(const QByteArray &buffer, int bufferSize); void headersReceived(const QByteArray &buffer); + void setStatusCode(int status, const QByteArray &statusText); + void setup(QNetworkAccessManager::Operation op, const QNetworkRequest &request, QIODevice *outgoingData);