diff --git a/src/libcalamares/network/Manager.cpp b/src/libcalamares/network/Manager.cpp index 857a93b69..d5e27e611 100644 --- a/src/libcalamares/network/Manager.cpp +++ b/src/libcalamares/network/Manager.cpp @@ -22,6 +22,7 @@ #include #include #include +#include namespace CalamaresUtils { @@ -98,6 +99,28 @@ Manager::setCheckHasInternetUrl( const QUrl& url ) d->m_hasInternetUrl = url; } +static QNetworkReply* +synchronousRun( const std::unique_ptr< QNetworkAccessManager >& nam, const QUrl& url, const RequestOptions& options ) +{ + QNetworkRequest request = QNetworkRequest( url ); + QNetworkReply* reply = nam->get( request ); + QEventLoop loop; + QTimer timer; + + options.applyToRequest( &request ); + if ( options.hasTimeout() ) + { + timer.setSingleShot( true ); + QObject::connect( &timer, &QTimer::timeout, &loop, &QEventLoop::quit ); + timer.start( options.timeout() ); + } + + QObject::connect( reply, &QNetworkReply::finished, &loop, &QEventLoop::quit ); + loop.exec(); + reply->deleteLater(); + return reply; +} + bool Manager::synchronousPing( const QUrl& url, const RequestOptions& options ) { @@ -106,13 +129,7 @@ Manager::synchronousPing( const QUrl& url, const RequestOptions& options ) return false; } - QNetworkRequest request = QNetworkRequest( url ); - QNetworkReply* reply = d->m_nam->get( request ); - QEventLoop loop; - options.applyToRequest( &request ); - connect( reply, &QNetworkReply::finished, &loop, &QEventLoop::quit ); - loop.exec(); - reply->deleteLater(); + auto reply = synchronousRun( d->m_nam, url, options ); return reply->bytesAvailable(); } @@ -124,13 +141,7 @@ Manager::synchronousGet( const QUrl& url, const RequestOptions& options ) return QByteArray(); } - QNetworkRequest request( url ); - QNetworkReply* reply = d->m_nam->get( request ); - QEventLoop loop; - options.applyToRequest( &request ); - connect( reply, &QNetworkReply::finished, &loop, &QEventLoop::quit ); - loop.exec(); - reply->deleteLater(); + auto reply = synchronousRun( d->m_nam, url, options ); return reply->readAll(); } diff --git a/src/libcalamares/network/Manager.h b/src/libcalamares/network/Manager.h index 7f12925ef..fef75ffb8 100644 --- a/src/libcalamares/network/Manager.h +++ b/src/libcalamares/network/Manager.h @@ -37,6 +37,8 @@ namespace Network class DLLEXPORT RequestOptions { public: + using milliseconds = std::chrono::milliseconds; + enum Flag { FollowRedirect = 0x1, @@ -50,7 +52,7 @@ public: { } - RequestOptions( Flags f, std::chrono::milliseconds timeout = std::chrono::milliseconds( -1 ) ) + RequestOptions( Flags f, milliseconds timeout = milliseconds( -1 ) ) : m_flags( f ) , m_timeout( timeout ) { @@ -58,9 +60,12 @@ public: void applyToRequest( QNetworkRequest* ) const; + bool hasTimeout() const { return m_timeout > milliseconds( 0 ); } + auto timeout() const { return m_timeout; } + private: Flags m_flags; - std::chrono::milliseconds m_timeout; + milliseconds m_timeout; }; Q_DECLARE_OPERATORS_FOR_FLAGS( RequestOptions::Flags );