@@ -415,9 +415,10 @@ QVariantMap QgsArcGisRestUtils::getObjects( const QString &layerurl, const QList
415
415
return queryServiceJSON ( queryUrl, errorTitle, errorText );
416
416
}
417
417
418
- QByteArray QgsArcGisRestUtils::queryService ( const QUrl &url , QString &errorTitle, QString &errorText )
418
+ QByteArray QgsArcGisRestUtils::queryService ( const QUrl &u , QString &errorTitle, QString &errorText )
419
419
{
420
420
QEventLoop loop;
421
+ QUrl url = parseUrl ( u );
421
422
422
423
QNetworkRequest request ( url );
423
424
QNetworkReply *reply = nullptr ;
@@ -477,6 +478,52 @@ QVariantMap QgsArcGisRestUtils::queryServiceJSON( const QUrl &url, QString &erro
477
478
return doc.object ().toVariantMap ();
478
479
}
479
480
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
+
480
527
// /////////////////////////////////////////////////////////////////////////////
481
528
482
529
QgsArcGisAsyncQuery::QgsArcGisAsyncQuery ( QObject *parent )
0 commit comments