Skip to content

Commit df2d660

Browse files
committedDec 20, 2018
[afs] Use QgsBlockingNetworkRequest instead of event loop
Instantly a more stable provider!
1 parent d1a1d75 commit df2d660

File tree

2 files changed

+15
-55
lines changed

2 files changed

+15
-55
lines changed
 

‎src/providers/arcgisrest/qgsafsprovider.cpp

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,21 +21,13 @@
2121
#include "qgsdatasourceuri.h"
2222
#include "qgsafsdataitems.h"
2323
#include "qgslogger.h"
24-
#include "geometry/qgsgeometry.h"
25-
#include "qgsnetworkaccessmanager.h"
2624
#include "qgsdataitemprovider.h"
2725

2826
#ifdef HAVE_GUI
2927
#include "qgsafssourceselect.h"
3028
#include "qgssourceselectprovider.h"
3129
#endif
3230

33-
#include <QEventLoop>
34-
#include <QMessageBox>
35-
#include <QNetworkRequest>
36-
#include <QNetworkReply>
37-
38-
3931
static const QString TEXT_PROVIDER_KEY = QStringLiteral( "arcgisfeatureserver" );
4032
static const QString TEXT_PROVIDER_DESCRIPTION = QStringLiteral( "ArcGIS Feature Server data provider" );
4133

‎src/providers/arcgisrest/qgsarcgisrestutils.cpp

Lines changed: 15 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,8 @@
4242
#include "qgscategorizedsymbolrenderer.h"
4343
#include "qgsvectorlayerlabeling.h"
4444

45-
#include <QEventLoop>
4645
#include <QNetworkRequest>
47-
#include <QNetworkReply>
48-
#include <QThread>
46+
#include "qgsblockingnetworkrequest.h"
4947
#include <QJsonDocument>
5048
#include <QJsonObject>
5149

@@ -471,57 +469,27 @@ QList<quint32> QgsArcGisRestUtils::getObjectIdsByExtent( const QString &layerurl
471469

472470
QByteArray QgsArcGisRestUtils::queryService( const QUrl &u, const QString &authcfg, QString &errorTitle, QString &errorText, QgsFeedback *feedback )
473471
{
474-
QEventLoop loop;
475472
QUrl url = parseUrl( u );
476473

477474
QNetworkRequest request( url );
475+
QgsBlockingNetworkRequest networkRequest;
476+
networkRequest.setAuthCfg( authcfg );
477+
const QgsBlockingNetworkRequest::ErrorCode error = networkRequest.get( request, false, feedback );
478478

479-
if ( !authcfg.isEmpty() )
480-
{
481-
QgsApplication::authManager()->updateNetworkRequest( request, authcfg );
482-
}
483-
484-
QNetworkReply *reply = nullptr;
485-
QgsNetworkAccessManager *nam = QgsNetworkAccessManager::instance();
479+
if ( feedback && feedback->isCanceled() )
480+
return QByteArray();
486481

487-
// Request data, handling redirects
488-
while ( true )
482+
// Handle network errors
483+
if ( error != QgsBlockingNetworkRequest::NoError )
489484
{
490-
reply = nam->get( request );
491-
QObject::connect( reply, &QNetworkReply::finished, &loop, &QEventLoop::quit );
492-
if ( feedback )
493-
{
494-
QObject::connect( feedback, &QgsFeedback::canceled, reply, &QNetworkReply::abort );
495-
}
496-
497-
loop.exec( QEventLoop::ExcludeUserInputEvents );
498-
499-
reply->deleteLater();
500-
501-
if ( feedback && feedback->isCanceled() )
502-
return QByteArray();
503-
504-
// Handle network errors
505-
if ( reply->error() != QNetworkReply::NoError )
506-
{
507-
QgsDebugMsg( QStringLiteral( "Network error: %1" ).arg( reply->errorString() ) );
508-
errorTitle = QStringLiteral( "Network error" );
509-
errorText = reply->errorString();
510-
return QByteArray();
511-
}
512-
513-
// Handle HTTP redirects
514-
QVariant redirect = reply->attribute( QNetworkRequest::RedirectionTargetAttribute );
515-
if ( redirect.isNull() )
516-
{
517-
break;
518-
}
519-
520-
QgsDebugMsg( "redirecting to " + redirect.toUrl().toString() );
521-
request.setUrl( redirect.toUrl() );
485+
QgsDebugMsg( QStringLiteral( "Network error: %1" ).arg( networkRequest.errorMessage() ) );
486+
errorTitle = QStringLiteral( "Network error" );
487+
errorText = networkRequest.errorMessage();
488+
return QByteArray();
522489
}
523-
QByteArray result = reply->readAll();
524-
return result;
490+
491+
const QgsNetworkReplyContent content = networkRequest.reply();
492+
return content.content();
525493
}
526494

527495
QVariantMap QgsArcGisRestUtils::queryServiceJSON( const QUrl &url, const QString &authcfg, QString &errorTitle, QString &errorText, QgsFeedback *feedback )

0 commit comments

Comments
 (0)
Please sign in to comment.