diff --git a/libnymea-core/hardware/network/networkaccessmanagerimpl.cpp b/libnymea-core/hardware/network/networkaccessmanagerimpl.cpp index 94d2c272..a7d72897 100644 --- a/libnymea-core/hardware/network/networkaccessmanagerimpl.cpp +++ b/libnymea-core/hardware/network/networkaccessmanagerimpl.cpp @@ -49,52 +49,72 @@ NetworkAccessManagerImpl::NetworkAccessManagerImpl(QNetworkAccessManager *networ QNetworkReply *NetworkAccessManagerImpl::get(const QNetworkRequest &request) { - return m_manager->get(request); + QNetworkReply *reply = m_manager->get(request); + hookupTimeoutTimer(reply); + return reply; } QNetworkReply *NetworkAccessManagerImpl::deleteResource(const QNetworkRequest &request) { - return m_manager->deleteResource(request); + QNetworkReply *reply = m_manager->deleteResource(request); + hookupTimeoutTimer(reply); + return reply; } QNetworkReply *NetworkAccessManagerImpl::head(const QNetworkRequest &request) { - return m_manager->head(request); + QNetworkReply *reply = m_manager->head(request); + hookupTimeoutTimer(reply); + return reply; } QNetworkReply *NetworkAccessManagerImpl::post(const QNetworkRequest &request, QIODevice *data) { - return m_manager->post(request, data); + QNetworkReply *reply = m_manager->post(request, data); + hookupTimeoutTimer(reply); + return reply; } QNetworkReply *NetworkAccessManagerImpl::post(const QNetworkRequest &request, const QByteArray &data) { - return m_manager->post(request, data); + QNetworkReply *reply = m_manager->post(request, data); + hookupTimeoutTimer(reply); + return reply; } QNetworkReply *NetworkAccessManagerImpl::post(const QNetworkRequest &request, QHttpMultiPart *multiPart) { - return m_manager->post(request, multiPart); + QNetworkReply *reply = m_manager->post(request, multiPart); + hookupTimeoutTimer(reply); + return reply; } QNetworkReply *NetworkAccessManagerImpl::put(const QNetworkRequest &request, QIODevice *data) { - return m_manager->put(request, data); + QNetworkReply *reply = m_manager->put(request, data); + hookupTimeoutTimer(reply); + return reply; } QNetworkReply *NetworkAccessManagerImpl::put(const QNetworkRequest &request, const QByteArray &data) { - return m_manager->put(request, data); + QNetworkReply *reply = m_manager->put(request, data); + hookupTimeoutTimer(reply); + return reply; } QNetworkReply *NetworkAccessManagerImpl::put(const QNetworkRequest &request, QHttpMultiPart *multiPart) { - return m_manager->put(request, multiPart); + QNetworkReply *reply = m_manager->put(request, multiPart); + hookupTimeoutTimer(reply); + return reply; } QNetworkReply *NetworkAccessManagerImpl::sendCustomRequest(const QNetworkRequest &request, const QByteArray &verb, QIODevice *data) { - return m_manager->sendCustomRequest(request, verb, data); + QNetworkReply* reply = m_manager->sendCustomRequest(request, verb, data); + hookupTimeoutTimer(reply); + return reply; } void NetworkAccessManagerImpl::setEnabled(bool enabled) @@ -119,6 +139,32 @@ void NetworkAccessManagerImpl::setEnabled(bool enabled) m_enabled = enabled; } +void NetworkAccessManagerImpl::hookupTimeoutTimer(QNetworkReply *reply) +{ + connect(reply, &QNetworkReply::finished, this, &NetworkAccessManagerImpl::networkReplyFinished); + QTimer *timer = new QTimer(this); + connect(timer, &QTimer::timeout, this, &NetworkAccessManagerImpl::networkTimeout); + timer->setSingleShot(true); + timer->start(30000); + m_timeoutTimers.insert(reply, timer); +} + +void NetworkAccessManagerImpl::networkReplyFinished() +{ + QNetworkReply *reply = static_cast(sender()); + QTimer *timer = m_timeoutTimers.take(reply); + timer->stop(); + timer->deleteLater(); +} + +void NetworkAccessManagerImpl::networkTimeout() +{ + QTimer *timer = static_cast(sender()); + QNetworkReply *reply = m_timeoutTimers.key(timer); + qCDebug(dcNetworkManager()) << "Network request timeout for:" << reply->request().url(); + reply->abort(); +} + bool NetworkAccessManagerImpl::available() const { return m_available; diff --git a/libnymea-core/hardware/network/networkaccessmanagerimpl.h b/libnymea-core/hardware/network/networkaccessmanagerimpl.h index f422dc50..9edba093 100644 --- a/libnymea-core/hardware/network/networkaccessmanagerimpl.h +++ b/libnymea-core/hardware/network/networkaccessmanagerimpl.h @@ -33,6 +33,7 @@ #include #include #include +#include namespace nymeaserver { @@ -68,6 +69,13 @@ private: bool m_enabled = false; QNetworkAccessManager *m_manager; + QHash m_timeoutTimers; + + void hookupTimeoutTimer(QNetworkReply* reply); + +private slots: + void networkReplyFinished(); + void networkTimeout(); };