[libcalamares] Refactor synchronous get

- Add timeout support
 - Refactor into a static helper method
This commit is contained in:
Adriaan de Groot 2019-08-23 14:59:35 +02:00
parent 1f2b3b734d
commit 85f0d38698
2 changed files with 32 additions and 16 deletions

View File

@ -22,6 +22,7 @@
#include <QNetworkAccessManager> #include <QNetworkAccessManager>
#include <QNetworkReply> #include <QNetworkReply>
#include <QNetworkRequest> #include <QNetworkRequest>
#include <QTimer>
namespace CalamaresUtils namespace CalamaresUtils
{ {
@ -98,6 +99,28 @@ Manager::setCheckHasInternetUrl( const QUrl& url )
d->m_hasInternetUrl = 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 bool
Manager::synchronousPing( const QUrl& url, const RequestOptions& options ) Manager::synchronousPing( const QUrl& url, const RequestOptions& options )
{ {
@ -106,13 +129,7 @@ Manager::synchronousPing( const QUrl& url, const RequestOptions& options )
return false; return false;
} }
QNetworkRequest request = QNetworkRequest( url ); auto reply = synchronousRun( d->m_nam, url, options );
QNetworkReply* reply = d->m_nam->get( request );
QEventLoop loop;
options.applyToRequest( &request );
connect( reply, &QNetworkReply::finished, &loop, &QEventLoop::quit );
loop.exec();
reply->deleteLater();
return reply->bytesAvailable(); return reply->bytesAvailable();
} }
@ -124,13 +141,7 @@ Manager::synchronousGet( const QUrl& url, const RequestOptions& options )
return QByteArray(); return QByteArray();
} }
QNetworkRequest request( url ); auto reply = synchronousRun( d->m_nam, url, options );
QNetworkReply* reply = d->m_nam->get( request );
QEventLoop loop;
options.applyToRequest( &request );
connect( reply, &QNetworkReply::finished, &loop, &QEventLoop::quit );
loop.exec();
reply->deleteLater();
return reply->readAll(); return reply->readAll();
} }

View File

@ -37,6 +37,8 @@ namespace Network
class DLLEXPORT RequestOptions class DLLEXPORT RequestOptions
{ {
public: public:
using milliseconds = std::chrono::milliseconds;
enum Flag enum Flag
{ {
FollowRedirect = 0x1, 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_flags( f )
, m_timeout( timeout ) , m_timeout( timeout )
{ {
@ -58,9 +60,12 @@ public:
void applyToRequest( QNetworkRequest* ) const; void applyToRequest( QNetworkRequest* ) const;
bool hasTimeout() const { return m_timeout > milliseconds( 0 ); }
auto timeout() const { return m_timeout; }
private: private:
Flags m_flags; Flags m_flags;
std::chrono::milliseconds m_timeout; milliseconds m_timeout;
}; };
Q_DECLARE_OPERATORS_FOR_FLAGS( RequestOptions::Flags ); Q_DECLARE_OPERATORS_FOR_FLAGS( RequestOptions::Flags );