Skip to content

Commit b434ab1

Browse files
committed
Start implementing the provider test suite for ArcGIS Feature Server provider
1 parent 227689a commit b434ab1

File tree

4 files changed

+497
-1
lines changed

4 files changed

+497
-1
lines changed

src/providers/arcgisrest/qgsarcgisrestutils.cpp

+48-1
Original file line numberDiff line numberDiff line change
@@ -415,9 +415,10 @@ QVariantMap QgsArcGisRestUtils::getObjects( const QString &layerurl, const QList
415415
return queryServiceJSON( queryUrl, errorTitle, errorText );
416416
}
417417

418-
QByteArray QgsArcGisRestUtils::queryService( const QUrl &url, QString &errorTitle, QString &errorText )
418+
QByteArray QgsArcGisRestUtils::queryService( const QUrl &u, QString &errorTitle, QString &errorText )
419419
{
420420
QEventLoop loop;
421+
QUrl url = parseUrl( u );
421422

422423
QNetworkRequest request( url );
423424
QNetworkReply *reply = nullptr;
@@ -477,6 +478,52 @@ QVariantMap QgsArcGisRestUtils::queryServiceJSON( const QUrl &url, QString &erro
477478
return doc.object().toVariantMap();
478479
}
479480

481+
QUrl QgsArcGisRestUtils::parseUrl( const QUrl &url )
482+
{
483+
QUrl modifiedUrl( url );
484+
if ( modifiedUrl.toString().contains( QLatin1String( "fake_qgis_http_endpoint" ) ) )
485+
{
486+
// Just for testing with local files instead of http:// resources
487+
QString modifiedUrlString = modifiedUrl.toString();
488+
// Qt5 does URL encoding from some reason (of the FILTER parameter for example)
489+
modifiedUrlString = QUrl::fromPercentEncoding( modifiedUrlString.toUtf8() );
490+
modifiedUrlString.replace( QStringLiteral( "fake_qgis_http_endpoint/" ), QStringLiteral( "fake_qgis_http_endpoint_" ) );
491+
QgsDebugMsg( QString( "Get %1" ).arg( modifiedUrlString ) );
492+
modifiedUrlString = modifiedUrlString.mid( QStringLiteral( "http://" ).size() );
493+
QString args = modifiedUrlString.mid( modifiedUrlString.indexOf( '?' ) );
494+
if ( modifiedUrlString.size() > 256 )
495+
{
496+
args = QCryptographicHash::hash( args.toUtf8(), QCryptographicHash::Md5 ).toHex();
497+
}
498+
else
499+
{
500+
args.replace( QLatin1String( "?" ), QLatin1String( "_" ) );
501+
args.replace( QLatin1String( "&" ), QLatin1String( "_" ) );
502+
args.replace( QLatin1String( "<" ), QLatin1String( "_" ) );
503+
args.replace( QLatin1String( ">" ), QLatin1String( "_" ) );
504+
args.replace( QLatin1String( "'" ), QLatin1String( "_" ) );
505+
args.replace( QLatin1String( "\"" ), QLatin1String( "_" ) );
506+
args.replace( QLatin1String( " " ), QLatin1String( "_" ) );
507+
args.replace( QLatin1String( ":" ), QLatin1String( "_" ) );
508+
args.replace( QLatin1String( "/" ), QLatin1String( "_" ) );
509+
args.replace( QLatin1String( "\n" ), QLatin1String( "_" ) );
510+
}
511+
#ifdef Q_OS_WIN
512+
// Passing "urls" like "http://c:/path" to QUrl 'eats' the : after c,
513+
// so we must restore it
514+
if ( modifiedUrlString[1] == '/' )
515+
{
516+
modifiedUrlString = modifiedUrlString[0] + ":/" + modifiedUrlString.mid( 2 );
517+
}
518+
#endif
519+
modifiedUrlString = modifiedUrlString.mid( 0, modifiedUrlString.indexOf( '?' ) ) + args;
520+
QgsDebugMsg( QStringLiteral( "Get %1 (after laundering)" ).arg( modifiedUrlString ) );
521+
modifiedUrl = QUrl::fromLocalFile( modifiedUrlString );
522+
}
523+
524+
return modifiedUrl;
525+
}
526+
480527
///////////////////////////////////////////////////////////////////////////////
481528

482529
QgsArcGisAsyncQuery::QgsArcGisAsyncQuery( QObject *parent )

src/providers/arcgisrest/qgsarcgisrestutils.h

+2
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ class QgsArcGisRestUtils
4242
const QgsRectangle &filterRect, QString &errorTitle, QString &errorText );
4343
static QByteArray queryService( const QUrl &url, QString &errorTitle, QString &errorText );
4444
static QVariantMap queryServiceJSON( const QUrl &url, QString &errorTitle, QString &errorText );
45+
46+
static QUrl parseUrl( const QUrl &url );
4547
};
4648

4749
class QgsArcGisAsyncQuery : public QObject

tests/src/python/CMakeLists.txt

+1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ IF (WITH_SERVER)
99
ENDIF (WITH_SERVER)
1010

1111
ADD_PYTHON_TEST(PyQgsActionManager test_qgsactionmanager.py)
12+
ADD_PYTHON_TEST(PyQgsAFSProvider test_provider_afs.py)
1213
ADD_PYTHON_TEST(PyQgsAggregateCalculator test_qgsaggregatecalculator.py)
1314
ADD_PYTHON_TEST(PyQgsAnnotation test_qgsannotation.py)
1415
ADD_PYTHON_TEST(PyQgsApplication test_qgsapplication.py)

0 commit comments

Comments
 (0)