[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 <QNetworkReply>
#include <QNetworkRequest>
#include <QTimer>
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();
}

View File

@ -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 );