summaryrefslogtreecommitdiff
path: root/src/network/access/qnetworkreplywasmimpl.cpp
diff options
context:
space:
mode:
authorLorn Potter <lorn.potter@gmail.com>2020-04-24 13:15:05 +1000
committerLorn Potter <lorn.potter@gmail.com>2020-05-19 11:23:29 +1000
commitb2e998d4678b82f823d24f3c97d78dec034f4e71 (patch)
tree9dcd55a3bc7f7ceb1f6e6648a5bcf5704f63bb6e /src/network/access/qnetworkreplywasmimpl.cpp
parentdcd63ac1f3b2e8b5c88f5e0d9a0fc40d60625f59 (diff)
downloadqtbase-b2e998d4678b82f823d24f3c97d78dec034f4e71.tar.gz
wasm: fix network reply timeout and error handling
Fixes: QTBUG-83728 Change-Id: Ib8184a497a028949eea20e9d189d79da51ccc290 Reviewed-by: Morten Johan Sørvig <morten.sorvig@qt.io>
Diffstat (limited to 'src/network/access/qnetworkreplywasmimpl.cpp')
-rw-r--r--src/network/access/qnetworkreplywasmimpl.cpp55
1 files changed, 30 insertions, 25 deletions
diff --git a/src/network/access/qnetworkreplywasmimpl.cpp b/src/network/access/qnetworkreplywasmimpl.cpp
index 5b84014789..6a5d89fbaf 100644
--- a/src/network/access/qnetworkreplywasmimpl.cpp
+++ b/src/network/access/qnetworkreplywasmimpl.cpp
@@ -61,12 +61,16 @@ QNetworkReplyWasmImplPrivate::QNetworkReplyWasmImplPrivate()
, downloadBufferCurrentSize(0)
, totalDownloadSize(0)
, percentFinished(0)
+ , m_fetch(0)
{
}
QNetworkReplyWasmImplPrivate::~QNetworkReplyWasmImplPrivate()
{
- emscripten_fetch_close(m_fetch);
+ if (m_fetch) {
+ emscripten_fetch_close(m_fetch);
+ m_fetch = 0;
+ }
}
QNetworkReplyWasmImpl::QNetworkReplyWasmImpl(QObject *parent)
@@ -115,12 +119,10 @@ void QNetworkReplyWasmImpl::abort()
if (d->state == QNetworkReplyPrivate::Finished || d->state == QNetworkReplyPrivate::Aborted)
return;
- setError(QNetworkReply::OperationCanceledError, QStringLiteral("Operation canceled"));
-
+ d->state = QNetworkReplyPrivate::Aborted;
d->doAbort();
-
+ d->m_fetch = 0;
close();
- d->state = QNetworkReplyPrivate::Aborted;
}
qint64 QNetworkReplyWasmImpl::bytesAvailable() const
@@ -266,7 +268,7 @@ void QNetworkReplyWasmImplPrivate::doSendRequest()
attr.onerror = QNetworkReplyWasmImplPrivate::downloadFailed;
attr.onprogress = QNetworkReplyWasmImplPrivate::downloadProgress;
attr.onreadystatechange = QNetworkReplyWasmImplPrivate::stateChange;
- attr.timeoutMSecs = 2 * 6000; // FIXME
+ attr.timeoutMSecs = QNetworkRequest::DefaultTransferTimeoutConstant;
attr.userData = reinterpret_cast<void *>(this);
QString dPath = QStringLiteral("/home/web_user/") + request.url().fileName();
@@ -277,14 +279,13 @@ void QNetworkReplyWasmImplPrivate::doSendRequest()
void QNetworkReplyWasmImplPrivate::emitReplyError(QNetworkReply::NetworkError errorCode, const QString &errorString)
{
- Q_UNUSED(errorCode)
Q_Q(QNetworkReplyWasmImpl);
q->setError(errorCode, errorString);
- emit q->error(errorCode);
-
- q->setFinished(true);
- emit q->finished();
+ emit q->errorOccurred(errorCode);
+ doAbort();
+ m_fetch = 0;
+ q->close();
}
void QNetworkReplyWasmImplPrivate::emitDataReadProgress(qint64 bytesReceived, qint64 bytesTotal)
@@ -450,11 +451,10 @@ void QNetworkReplyWasmImplPrivate::_q_bufferOutgoingData()
void QNetworkReplyWasmImplPrivate::downloadSucceeded(emscripten_fetch_t *fetch)
{
- QByteArray buffer(fetch->data, fetch->numBytes);
-
QNetworkReplyWasmImplPrivate *reply =
reinterpret_cast<QNetworkReplyWasmImplPrivate*>(fetch->userData);
if (reply) {
+ QByteArray buffer(fetch->data, fetch->numBytes);
reply->dataReceived(buffer, buffer.size());
}
}
@@ -478,24 +478,26 @@ void QNetworkReplyWasmImplPrivate::downloadProgress(emscripten_fetch_t *fetch)
reinterpret_cast<QNetworkReplyWasmImplPrivate*>(fetch->userData);
Q_ASSERT(reply);
- if (fetch->status < 400)
- reply->emitDataReadProgress((fetch->dataOffset + fetch->numBytes), fetch->totalBytes);
+ if (fetch->status < 400) {
+ uint64_t bytes = fetch->dataOffset + fetch->numBytes;
+ uint64_t tBytes = fetch->totalBytes; // totalBytes can be 0 if server not reporting content length
+ if (tBytes == 0)
+ tBytes = bytes;
+ reply->emitDataReadProgress(bytes, tBytes);
+ }
}
void QNetworkReplyWasmImplPrivate::downloadFailed(emscripten_fetch_t *fetch)
{
QNetworkReplyWasmImplPrivate *reply = reinterpret_cast<QNetworkReplyWasmImplPrivate*>(fetch->userData);
- Q_ASSERT(reply);
-
- QString reasonStr = QString::fromUtf8(fetch->statusText);
-
- reply->setReplyAttributes(reinterpret_cast<quintptr>(fetch->userData), fetch->status, reasonStr);
-
- if (fetch->status >= 400 && !reasonStr.isEmpty())
+ if (reply) {
+ QString reasonStr;
+ if (fetch->status > 600 || reply->state == QNetworkReplyPrivate::Aborted)
+ reasonStr = QStringLiteral("Operation canceled");
+ else
+ reasonStr = QString::fromUtf8(fetch->statusText);
reply->emitReplyError(reply->statusCodeFromHttp(fetch->status, reply->request.url()), reasonStr);
-
- if (fetch->status >= 400)
- emscripten_fetch_close(fetch); // Also free data on failure.
+ }
}
//taken from qhttpthreaddelegate.cpp
@@ -552,6 +554,9 @@ QNetworkReply::NetworkError QNetworkReplyWasmImplPrivate::statusCodeFromHttp(int
code = QNetworkReply::ServiceUnavailableError;
break;
+ case 65535: //emscripten reply when aborted
+ code = QNetworkReply::OperationCanceledError;
+ break;
default:
if (httpStatusCode > 500) {
// some kind of server error