Skip to content

Commit 996f486

Browse files
committedJan 24, 2019
[afs][needs-docs] Allow users to set a specific referer for AFS connections, for
use with ArcGIS feature server requests Some servers are locked down to only allow requests with a specific referer URL - this allows us to open them in QGIS (but it requires users to manually determine the correct referer string and populate this setting for the connection -- we cannot do this for them!)
1 parent b0b196a commit 996f486

14 files changed

+285
-209
lines changed
 

‎python/gui/auto_generated/qgsnewhttpconnection.sip.in

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ information for an HTTP Server for WMS, etc.
3636
{
3737
FlagShowTestConnection,
3838
FlagHideAuthenticationGroup,
39+
FlagShowHttpSettings,
3940
};
4041
typedef QFlags<QgsNewHttpConnection::Flag> Flags;
4142

‎src/core/qgsowsconnection.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,13 @@ QgsOwsConnection::QgsOwsConnection( const QString &service, const QString &connN
6565
}
6666
mConnectionInfo.append( ",authcfg=" + authcfg );
6767

68+
const QString referer = settings.value( key + "/referer" ).toString();
69+
if ( !referer.isEmpty() )
70+
{
71+
mUri.setParam( QStringLiteral( "referer" ), referer );
72+
mConnectionInfo.append( ",referer=" + referer );
73+
}
74+
6875
if ( mService.compare( QLatin1String( "WMS" ), Qt::CaseInsensitive ) == 0
6976
|| mService.compare( QLatin1String( "WCS" ), Qt::CaseInsensitive ) == 0 )
7077
{

‎src/gui/qgsnewhttpconnection.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,9 @@ QgsNewHttpConnection::QgsNewHttpConnection( QWidget *parent, ConnectionTypes typ
3434
{
3535
setupUi( this );
3636

37+
if ( !( flags & FlagShowHttpSettings ) )
38+
mHttpGroupBox->hide();
39+
3740
QgsGui::enableAutoGeometryRestore( this );
3841

3942
connect( buttonBox, &QDialogButtonBox::helpRequested, this, &QgsNewHttpConnection::showHelp );
@@ -88,6 +91,7 @@ QgsNewHttpConnection::QgsNewHttpConnection( QWidget *parent, ConnectionTypes typ
8891
QString credentialsKey = "qgis/" + mCredentialsBaseKey + '/' + connectionName;
8992
txtName->setText( connectionName );
9093
txtUrl->setText( settings.value( key + "/url" ).toString() );
94+
mRefererLineEdit->setText( settings.value( key + "/referer" ).toString() );
9195

9296
updateServiceSpecificSettings();
9397

@@ -444,6 +448,9 @@ void QgsNewHttpConnection::accept()
444448

445449
settings.setValue( credentialsKey + "/authcfg", mAuthSettings->configId() );
446450

451+
if ( mHttpGroupBox->isVisible() )
452+
settings.setValue( key + "/referer", mRefererLineEdit->text() );
453+
447454
settings.setValue( mBaseKey + "/selected", txtName->text() );
448455

449456
QDialog::accept();

‎src/gui/qgsnewhttpconnection.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ class GUI_EXPORT QgsNewHttpConnection : public QDialog, private Ui::QgsNewHttpCo
5757
{
5858
FlagShowTestConnection = 1 << 1, //!< Display the 'test connection' button
5959
FlagHideAuthenticationGroup = 1 << 2, //!< Hide the Authentication group
60+
FlagShowHttpSettings = 1 << 3, //!< Display the 'http' group
6061
};
6162
Q_DECLARE_FLAGS( Flags, Flag )
6263

‎src/providers/arcgisrest/qgsafsdataitems.cpp

Lines changed: 37 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ void QgsAfsRootItem::onConnectionsChanged()
7575

7676
void QgsAfsRootItem::newConnection()
7777
{
78-
QgsNewHttpConnection nc( nullptr, QgsNewHttpConnection::ConnectionOther, QStringLiteral( "qgis/connections-arcgisfeatureserver/" ) );
78+
QgsNewHttpConnection nc( nullptr, QgsNewHttpConnection::ConnectionOther, QStringLiteral( "qgis/connections-arcgisfeatureserver/" ), QString(), QgsNewHttpConnection::FlagShowHttpSettings );
7979
nc.setWindowTitle( tr( "Create a New ArcGIS Feature Server Connection" ) );
8080

8181
if ( nc.exec() )
@@ -87,31 +87,31 @@ void QgsAfsRootItem::newConnection()
8787

8888
///////////////////////////////////////////////////////////////////////////////
8989

90-
void addFolderItems( QVector< QgsDataItem * > &items, const QVariantMap &serviceData, const QString &baseUrl, const QString &authcfg, QgsDataItem *parent )
90+
void addFolderItems( QVector< QgsDataItem * > &items, const QVariantMap &serviceData, const QString &baseUrl, const QString &authcfg, const QgsStringMap &headers, QgsDataItem *parent )
9191
{
92-
QgsArcGisRestUtils::visitFolderItems( [parent, &baseUrl, &items, authcfg]( const QString & name, const QString & url )
92+
QgsArcGisRestUtils::visitFolderItems( [parent, &baseUrl, &items, headers, authcfg]( const QString & name, const QString & url )
9393
{
94-
std::unique_ptr< QgsAfsFolderItem > folderItem = qgis::make_unique< QgsAfsFolderItem >( parent, name, url, baseUrl, authcfg );
94+
std::unique_ptr< QgsAfsFolderItem > folderItem = qgis::make_unique< QgsAfsFolderItem >( parent, name, url, baseUrl, authcfg, headers );
9595
items.append( folderItem.release() );
9696
}, serviceData, baseUrl );
9797
}
9898

99-
void addServiceItems( QVector< QgsDataItem * > &items, const QVariantMap &serviceData, const QString &baseUrl, const QString &authcfg, QgsDataItem *parent )
99+
void addServiceItems( QVector< QgsDataItem * > &items, const QVariantMap &serviceData, const QString &baseUrl, const QString &authcfg, const QgsStringMap &headers, QgsDataItem *parent )
100100
{
101101
QgsArcGisRestUtils::visitServiceItems(
102-
[&items, parent, authcfg]( const QString & name, const QString & url )
102+
[&items, parent, authcfg, headers]( const QString & name, const QString & url )
103103
{
104-
std::unique_ptr< QgsAfsServiceItem > serviceItem = qgis::make_unique< QgsAfsServiceItem >( parent, name, url, url, authcfg );
104+
std::unique_ptr< QgsAfsServiceItem > serviceItem = qgis::make_unique< QgsAfsServiceItem >( parent, name, url, url, authcfg, headers );
105105
items.append( serviceItem.release() );
106106
}, serviceData, baseUrl );
107107
}
108108

109-
void addLayerItems( QVector< QgsDataItem * > &items, const QVariantMap &serviceData, const QString &parentUrl, const QString &authcfg, QgsDataItem *parent )
109+
void addLayerItems( QVector< QgsDataItem * > &items, const QVariantMap &serviceData, const QString &parentUrl, const QString &authcfg, const QgsStringMap &headers, QgsDataItem *parent )
110110
{
111111
QMap< QString, QgsDataItem * > layerItems;
112112
QMap< QString, QString > parents;
113113

114-
QgsArcGisRestUtils::addLayerItems( [parent, &layerItems, &parents, authcfg]( const QString & parentLayerId, const QString & id, const QString & name, const QString & description, const QString & url, bool isParent, const QString & authid )
114+
QgsArcGisRestUtils::addLayerItems( [parent, &layerItems, &parents, authcfg, headers]( const QString & parentLayerId, const QString & id, const QString & name, const QString & description, const QString & url, bool isParent, const QString & authid )
115115
{
116116
Q_UNUSED( description );
117117

@@ -120,12 +120,12 @@ void addLayerItems( QVector< QgsDataItem * > &items, const QVariantMap &serviceD
120120

121121
if ( isParent )
122122
{
123-
std::unique_ptr< QgsAfsParentLayerItem > layerItem = qgis::make_unique< QgsAfsParentLayerItem >( parent, name, url, authcfg );
123+
std::unique_ptr< QgsAfsParentLayerItem > layerItem = qgis::make_unique< QgsAfsParentLayerItem >( parent, name, url, authcfg, headers );
124124
layerItems.insert( id, layerItem.release() );
125125
}
126126
else
127127
{
128-
std::unique_ptr< QgsAfsLayerItem > layerItem = qgis::make_unique< QgsAfsLayerItem >( parent, name, url, name, authid, authcfg );
128+
std::unique_ptr< QgsAfsLayerItem > layerItem = qgis::make_unique< QgsAfsLayerItem >( parent, name, url, name, authid, authcfg, headers );
129129
layerItems.insert( id, layerItem.release() );
130130
}
131131

@@ -158,10 +158,14 @@ QVector<QgsDataItem *> QgsAfsConnectionItem::createChildren()
158158
const QgsOwsConnection connection( QStringLiteral( "ARCGISFEATURESERVER" ), mConnName );
159159
const QString url = connection.uri().param( QStringLiteral( "url" ) );
160160
const QString authcfg = connection.uri().param( QStringLiteral( "authcfg" ) );
161+
const QString referer = connection.uri().param( QStringLiteral( "referer" ) );
162+
QgsStringMap headers;
163+
if ( ! referer.isEmpty() )
164+
headers[ QStringLiteral( "Referer" )] = referer;
161165

162166
QVector<QgsDataItem *> items;
163167
QString errorTitle, errorMessage;
164-
const QVariantMap serviceData = QgsArcGisRestUtils::getServiceInfo( url, authcfg, errorTitle, errorMessage );
168+
const QVariantMap serviceData = QgsArcGisRestUtils::getServiceInfo( url, authcfg, errorTitle, errorMessage, headers );
165169
if ( serviceData.isEmpty() )
166170
{
167171
if ( !errorMessage.isEmpty() )
@@ -174,9 +178,9 @@ QVector<QgsDataItem *> QgsAfsConnectionItem::createChildren()
174178
return items;
175179
}
176180

177-
addFolderItems( items, serviceData, url, authcfg, this );
178-
addServiceItems( items, serviceData, url, authcfg, this );
179-
addLayerItems( items, serviceData, url, authcfg, this );
181+
addFolderItems( items, serviceData, url, authcfg, headers, this );
182+
addServiceItems( items, serviceData, url, authcfg, headers, this );
183+
addLayerItems( items, serviceData, url, authcfg, headers, this );
180184

181185
return items;
182186
}
@@ -219,7 +223,7 @@ QList<QAction *> QgsAfsConnectionItem::actions( QWidget *parent )
219223

220224
void QgsAfsConnectionItem::editConnection()
221225
{
222-
QgsNewHttpConnection nc( nullptr, QgsNewHttpConnection::ConnectionOther, QStringLiteral( "qgis/connections-arcgisfeatureserver/" ), mName );
226+
QgsNewHttpConnection nc( nullptr, QgsNewHttpConnection::ConnectionOther, QStringLiteral( "qgis/connections-arcgisfeatureserver/" ), mName, QgsNewHttpConnection::FlagShowHttpSettings );
223227
nc.setWindowTitle( tr( "Modify ArcGIS Feature Server Connection" ) );
224228

225229
if ( nc.exec() )
@@ -255,10 +259,11 @@ void QgsAfsConnectionItem::refreshConnection()
255259
#endif
256260

257261

258-
QgsAfsFolderItem::QgsAfsFolderItem( QgsDataItem *parent, const QString &name, const QString &path, const QString &baseUrl, const QString &authcfg )
262+
QgsAfsFolderItem::QgsAfsFolderItem( QgsDataItem *parent, const QString &name, const QString &path, const QString &baseUrl, const QString &authcfg, const QgsStringMap &headers )
259263
: QgsDataCollectionItem( parent, name, path )
260264
, mBaseUrl( baseUrl )
261265
, mAuthCfg( authcfg )
266+
, mHeaders( headers )
262267
{
263268
mIconName = QStringLiteral( "mIconDbSchema.svg" );
264269
mCapabilities |= Collapse;
@@ -272,7 +277,7 @@ QVector<QgsDataItem *> QgsAfsFolderItem::createChildren()
272277

273278
QVector<QgsDataItem *> items;
274279
QString errorTitle, errorMessage;
275-
const QVariantMap serviceData = QgsArcGisRestUtils::getServiceInfo( url, mAuthCfg, errorTitle, errorMessage );
280+
const QVariantMap serviceData = QgsArcGisRestUtils::getServiceInfo( url, mAuthCfg, errorTitle, errorMessage, mHeaders );
276281
if ( serviceData.isEmpty() )
277282
{
278283
if ( !errorMessage.isEmpty() )
@@ -285,9 +290,9 @@ QVector<QgsDataItem *> QgsAfsFolderItem::createChildren()
285290
return items;
286291
}
287292

288-
addFolderItems( items, serviceData, mBaseUrl, mAuthCfg, this );
289-
addServiceItems( items, serviceData, mBaseUrl, mAuthCfg, this );
290-
addLayerItems( items, serviceData, mPath, mAuthCfg, this );
293+
addFolderItems( items, serviceData, mBaseUrl, mAuthCfg, mHeaders, this );
294+
addServiceItems( items, serviceData, mBaseUrl, mAuthCfg, mHeaders, this );
295+
addLayerItems( items, serviceData, mPath, mAuthCfg, mHeaders, this );
291296
return items;
292297
}
293298

@@ -297,10 +302,11 @@ bool QgsAfsFolderItem::equal( const QgsDataItem *other )
297302
return ( type() == other->type() && o && mPath == o->mPath && mName == o->mName );
298303
}
299304

300-
QgsAfsServiceItem::QgsAfsServiceItem( QgsDataItem *parent, const QString &name, const QString &path, const QString &baseUrl, const QString &authcfg )
305+
QgsAfsServiceItem::QgsAfsServiceItem( QgsDataItem *parent, const QString &name, const QString &path, const QString &baseUrl, const QString &authcfg, const QgsStringMap &headers )
301306
: QgsDataCollectionItem( parent, name, path )
302307
, mBaseUrl( baseUrl )
303308
, mAuthCfg( authcfg )
309+
, mHeaders( headers )
304310
{
305311
mIconName = QStringLiteral( "mIconDbSchema.svg" );
306312
mCapabilities |= Collapse;
@@ -313,7 +319,7 @@ QVector<QgsDataItem *> QgsAfsServiceItem::createChildren()
313319

314320
QVector<QgsDataItem *> items;
315321
QString errorTitle, errorMessage;
316-
const QVariantMap serviceData = QgsArcGisRestUtils::getServiceInfo( url, mAuthCfg, errorTitle, errorMessage );
322+
const QVariantMap serviceData = QgsArcGisRestUtils::getServiceInfo( url, mAuthCfg, errorTitle, errorMessage, mHeaders );
317323
if ( serviceData.isEmpty() )
318324
{
319325
if ( !errorMessage.isEmpty() )
@@ -326,9 +332,9 @@ QVector<QgsDataItem *> QgsAfsServiceItem::createChildren()
326332
return items;
327333
}
328334

329-
addFolderItems( items, serviceData, mBaseUrl, mAuthCfg, this );
330-
addServiceItems( items, serviceData, mBaseUrl, mAuthCfg, this );
331-
addLayerItems( items, serviceData, mPath, mAuthCfg, this );
335+
addFolderItems( items, serviceData, mBaseUrl, mAuthCfg, mHeaders, this );
336+
addServiceItems( items, serviceData, mBaseUrl, mAuthCfg, mHeaders, this );
337+
addLayerItems( items, serviceData, mPath, mAuthCfg, mHeaders, this );
332338
return items;
333339
}
334340

@@ -338,20 +344,23 @@ bool QgsAfsServiceItem::equal( const QgsDataItem *other )
338344
return ( type() == other->type() && o && mPath == o->mPath && mName == o->mName );
339345
}
340346

341-
QgsAfsLayerItem::QgsAfsLayerItem( QgsDataItem *parent, const QString &, const QString &url, const QString &title, const QString &authid, const QString &authcfg )
347+
QgsAfsLayerItem::QgsAfsLayerItem( QgsDataItem *parent, const QString &, const QString &url, const QString &title, const QString &authid, const QString &authcfg, const QgsStringMap &headers )
342348
: QgsLayerItem( parent, title, url, QString(), QgsLayerItem::Vector, QStringLiteral( "arcgisfeatureserver" ) )
343349
{
344350
mUri = QStringLiteral( "crs='%1' url='%2'" ).arg( authid, url );
345351
if ( !authcfg.isEmpty() )
346352
mUri += QStringLiteral( " authcfg='%1'" ).arg( authcfg );
353+
if ( !headers.value( QStringLiteral( "Referer" ) ).isEmpty() )
354+
mUri += QStringLiteral( " referer='%1'" ).arg( headers.value( QStringLiteral( "Referer" ) ) );
347355
setState( Populated );
348356
mIconName = QStringLiteral( "mIconAfs.svg" );
349357
setToolTip( url );
350358
}
351359

352-
QgsAfsParentLayerItem::QgsAfsParentLayerItem( QgsDataItem *parent, const QString &name, const QString &path, const QString &authcfg )
360+
QgsAfsParentLayerItem::QgsAfsParentLayerItem( QgsDataItem *parent, const QString &name, const QString &path, const QString &authcfg, const QgsStringMap &headers )
353361
: QgsDataItem( QgsDataItem::Collection, parent, name, path )
354362
, mAuthCfg( authcfg )
363+
, mHeaders( headers )
355364
{
356365
mCapabilities |= Fast;
357366
mIconName = QStringLiteral( "mIconDbSchema.svg" );

‎src/providers/arcgisrest/qgsafsdataitems.h

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -73,41 +73,44 @@ class QgsAfsFolderItem : public QgsDataCollectionItem
7373
{
7474
Q_OBJECT
7575
public:
76-
QgsAfsFolderItem( QgsDataItem *parent, const QString &name, const QString &path, const QString &baseUrl, const QString &authcfg );
76+
QgsAfsFolderItem( QgsDataItem *parent, const QString &name, const QString &path, const QString &baseUrl, const QString &authcfg, const QgsStringMap &headers );
7777
QVector<QgsDataItem *> createChildren() override;
7878
bool equal( const QgsDataItem *other ) override;
7979

8080
private:
8181
QString mFolder;
8282
QString mBaseUrl;
8383
QString mAuthCfg;
84+
QgsStringMap mHeaders;
8485
};
8586

8687
class QgsAfsServiceItem : public QgsDataCollectionItem
8788
{
8889
Q_OBJECT
8990
public:
90-
QgsAfsServiceItem( QgsDataItem *parent, const QString &name, const QString &path, const QString &baseUrl, const QString &authcfg );
91+
QgsAfsServiceItem( QgsDataItem *parent, const QString &name, const QString &path, const QString &baseUrl, const QString &authcfg, const QgsStringMap &headers );
9192
QVector<QgsDataItem *> createChildren() override;
9293
bool equal( const QgsDataItem *other ) override;
9394

9495
private:
9596
QString mFolder;
9697
QString mBaseUrl;
9798
QString mAuthCfg;
99+
QgsStringMap mHeaders;
98100
};
99101

100102
class QgsAfsParentLayerItem : public QgsDataItem
101103
{
102104
Q_OBJECT
103105
public:
104106

105-
QgsAfsParentLayerItem( QgsDataItem *parent, const QString &name, const QString &path, const QString &authcfg );
107+
QgsAfsParentLayerItem( QgsDataItem *parent, const QString &name, const QString &path, const QString &authcfg, const QgsStringMap &headers );
106108
bool equal( const QgsDataItem *other ) override;
107109

108110
private:
109111

110112
QString mAuthCfg;
113+
QgsStringMap mHeaders;
111114

112115
};
113116

@@ -117,7 +120,7 @@ class QgsAfsLayerItem : public QgsLayerItem
117120

118121
public:
119122

120-
QgsAfsLayerItem( QgsDataItem *parent, const QString &name, const QString &url, const QString &title, const QString &authid, const QString &authcfg );
123+
QgsAfsLayerItem( QgsDataItem *parent, const QString &name, const QString &url, const QString &title, const QString &authid, const QString &authcfg, const QgsStringMap &headers );
121124

122125
};
123126

‎src/providers/arcgisrest/qgsafsprovider.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,13 @@ QgsAfsProvider::QgsAfsProvider( const QString &uri, const ProviderOptions &optio
5454

5555
// Get layer info
5656
QString errorTitle, errorMessage;
57+
58+
const QString referer = mSharedData->mDataSource.param( QStringLiteral( "referer" ) );
59+
if ( !referer.isEmpty() )
60+
mRequestHeaders[ QStringLiteral( "Referer" )] = referer;
61+
5762
const QVariantMap layerData = QgsArcGisRestUtils::getLayerInfo( mSharedData->mDataSource.param( QStringLiteral( "url" ) ),
58-
authcfg, errorTitle, errorMessage );
63+
authcfg, errorTitle, errorMessage, mRequestHeaders );
5964
if ( layerData.isEmpty() )
6065
{
6166
pushError( errorTitle + ": " + errorMessage );
@@ -170,7 +175,7 @@ QgsAfsProvider::QgsAfsProvider( const QString &uri, const ProviderOptions &optio
170175
// and we need to store these to iterate through the features. This query
171176
// also returns the name of the ObjectID field.
172177
QVariantMap objectIdData = QgsArcGisRestUtils::getObjectIds( mSharedData->mDataSource.param( QStringLiteral( "url" ) ), authcfg,
173-
objectIdFieldName, errorTitle, errorMessage, limitBbox ? mSharedData->mExtent : QgsRectangle() );
178+
objectIdFieldName, errorTitle, errorMessage, mRequestHeaders, limitBbox ? mSharedData->mExtent : QgsRectangle() );
174179
if ( objectIdData.isEmpty() )
175180
{
176181
appendError( QgsErrorMessage( tr( "getObjectIds failed: %1 - %2" ).arg( errorTitle, errorMessage ), QStringLiteral( "AFSProvider" ) ) );

‎src/providers/arcgisrest/qgsafsprovider.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ class QgsAfsProvider : public QgsVectorDataProvider
8282
QgsLayerMetadata mLayerMetadata;
8383
QVariantMap mRendererDataMap;
8484
QVariantList mLabelingDataList;
85+
QgsStringMap mRequestHeaders;
8586
};
8687

8788
#endif // QGSAFSPROVIDER_H

‎src/providers/arcgisrest/qgsafsshareddata.cpp

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,10 +70,15 @@ bool QgsAfsSharedData::getFeature( QgsFeatureId id, QgsFeature &f, const QgsRect
7070
QString errorTitle, errorMessage;
7171

7272
const QString authcfg = mDataSource.authConfigId();
73+
QgsStringMap headers;
74+
const QString referer = mDataSource.param( QStringLiteral( "referer" ) );
75+
if ( !referer.isEmpty() )
76+
headers[ QStringLiteral( "Referer" )] = referer;
77+
7378
const QVariantMap queryData = QgsArcGisRestUtils::getObjects(
7479
mDataSource.param( QStringLiteral( "url" ) ), authcfg, objectIds, mDataSource.param( QStringLiteral( "crs" ) ), true,
7580
fetchAttribNames, QgsWkbTypes::hasM( mGeometryType ), QgsWkbTypes::hasZ( mGeometryType ),
76-
filterRect, errorTitle, errorMessage, feedback );
81+
filterRect, errorTitle, errorMessage, headers, feedback );
7782

7883
if ( queryData.isEmpty() )
7984
{
@@ -159,9 +164,13 @@ QgsFeatureIds QgsAfsSharedData::getFeatureIdsInExtent( const QgsRectangle &exten
159164
QString errorText;
160165

161166
const QString authcfg = mDataSource.authConfigId();
167+
QgsStringMap headers;
168+
const QString referer = mDataSource.param( QStringLiteral( "referer" ) );
169+
if ( !referer.isEmpty() )
170+
headers[ QStringLiteral( "Referer" )] = referer;
162171
const QList<quint32> featuresInRect = QgsArcGisRestUtils::getObjectIdsByExtent( mDataSource.param( QStringLiteral( "url" ) ),
163172
mObjectIdFieldName,
164-
extent, errorTitle, errorText, authcfg, feedback );
173+
extent, errorTitle, errorText, authcfg, headers, feedback );
165174

166175
QgsFeatureIds ids;
167176
for ( quint32 id : featuresInRect )

‎src/providers/arcgisrest/qgsafssourceselect.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,11 +40,15 @@ bool QgsAfsSourceSelect::connectToService( const QgsOwsConnection &connection )
4040

4141
const QString authcfg = connection.uri().param( QStringLiteral( "authcfg" ) );
4242
const QString baseUrl = connection.uri().param( QStringLiteral( "url" ) );
43+
const QString referer = connection.uri().param( QStringLiteral( "referer" ) );
44+
QgsStringMap headers;
45+
if ( ! referer.isEmpty() )
46+
headers[ QStringLiteral( "Referer" )] = referer;
4347

4448
std::function< bool( const QString &, QStandardItem * )> visitItemsRecursive;
45-
visitItemsRecursive = [this, &visitItemsRecursive, baseUrl, authcfg, &errorTitle, &errorMessage]( const QString & baseItemUrl, QStandardItem * parentItem ) -> bool
49+
visitItemsRecursive = [this, &visitItemsRecursive, baseUrl, authcfg, headers, &errorTitle, &errorMessage]( const QString & baseItemUrl, QStandardItem * parentItem ) -> bool
4650
{
47-
const QVariantMap serviceInfoMap = QgsArcGisRestUtils::getServiceInfo( baseItemUrl, authcfg, errorTitle, errorMessage );
51+
const QVariantMap serviceInfoMap = QgsArcGisRestUtils::getServiceInfo( baseItemUrl, authcfg, errorTitle, errorMessage, headers );
4852

4953
if ( serviceInfoMap.isEmpty() )
5054
{

0 commit comments

Comments
 (0)
Please sign in to comment.