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
{

‎src/providers/arcgisrest/qgsarcgisrestutils.cpp

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -367,23 +367,23 @@ QgsCoordinateReferenceSystem QgsArcGisRestUtils::parseSpatialReference( const QV
367367
}
368368

369369

370-
QVariantMap QgsArcGisRestUtils::getServiceInfo( const QString &baseurl, const QString &authcfg, QString &errorTitle, QString &errorText )
370+
QVariantMap QgsArcGisRestUtils::getServiceInfo( const QString &baseurl, const QString &authcfg, QString &errorTitle, QString &errorText, const QgsStringMap &requestHeaders )
371371
{
372372
// http://sampleserver5.arcgisonline.com/arcgis/rest/services/Energy/Geology/FeatureServer?f=json
373373
QUrl queryUrl( baseurl );
374374
queryUrl.addQueryItem( QStringLiteral( "f" ), QStringLiteral( "json" ) );
375-
return queryServiceJSON( queryUrl, authcfg, errorTitle, errorText );
375+
return queryServiceJSON( queryUrl, authcfg, errorTitle, errorText, requestHeaders );
376376
}
377377

378-
QVariantMap QgsArcGisRestUtils::getLayerInfo( const QString &layerurl, const QString &authcfg, QString &errorTitle, QString &errorText )
378+
QVariantMap QgsArcGisRestUtils::getLayerInfo( const QString &layerurl, const QString &authcfg, QString &errorTitle, QString &errorText, const QgsStringMap &requestHeaders )
379379
{
380380
// http://sampleserver5.arcgisonline.com/arcgis/rest/services/Energy/Geology/FeatureServer/1?f=json
381381
QUrl queryUrl( layerurl );
382382
queryUrl.addQueryItem( QStringLiteral( "f" ), QStringLiteral( "json" ) );
383-
return queryServiceJSON( queryUrl, authcfg, errorTitle, errorText );
383+
return queryServiceJSON( queryUrl, authcfg, errorTitle, errorText, requestHeaders );
384384
}
385385

386-
QVariantMap QgsArcGisRestUtils::getObjectIds( const QString &layerurl, const QString &authcfg, const QString &objectIdFieldName, QString &errorTitle, QString &errorText, const QgsRectangle &bbox )
386+
QVariantMap QgsArcGisRestUtils::getObjectIds( const QString &layerurl, const QString &authcfg, const QString &objectIdFieldName, QString &errorTitle, QString &errorText, const QgsStringMap &requestHeaders, const QgsRectangle &bbox )
387387
{
388388
// http://sampleserver5.arcgisonline.com/arcgis/rest/services/Energy/Geology/FeatureServer/1/query?where=objectid%3Dobjectid&returnIdsOnly=true&f=json
389389
QUrl queryUrl( layerurl + "/query" );
@@ -398,14 +398,14 @@ QVariantMap QgsArcGisRestUtils::getObjectIds( const QString &layerurl, const QSt
398398
queryUrl.addQueryItem( QStringLiteral( "geometryType" ), QStringLiteral( "esriGeometryEnvelope" ) );
399399
queryUrl.addQueryItem( QStringLiteral( "spatialRel" ), QStringLiteral( "esriSpatialRelEnvelopeIntersects" ) );
400400
}
401-
return queryServiceJSON( queryUrl, authcfg, errorTitle, errorText );
401+
return queryServiceJSON( queryUrl, authcfg, errorTitle, errorText, requestHeaders );
402402
}
403403

404404
QVariantMap QgsArcGisRestUtils::getObjects( const QString &layerurl, const QString &authcfg, const QList<quint32> &objectIds, const QString &crs,
405405
bool fetchGeometry, const QStringList &fetchAttributes,
406406
bool fetchM, bool fetchZ,
407407
const QgsRectangle &filterRect,
408-
QString &errorTitle, QString &errorText, QgsFeedback *feedback )
408+
QString &errorTitle, QString &errorText, const QgsStringMap &requestHeaders, QgsFeedback *feedback )
409409
{
410410
QStringList ids;
411411
for ( int id : objectIds )
@@ -439,10 +439,10 @@ QVariantMap QgsArcGisRestUtils::getObjects( const QString &layerurl, const QStri
439439
queryUrl.addQueryItem( QStringLiteral( "geometryType" ), QStringLiteral( "esriGeometryEnvelope" ) );
440440
queryUrl.addQueryItem( QStringLiteral( "spatialRel" ), QStringLiteral( "esriSpatialRelEnvelopeIntersects" ) );
441441
}
442-
return queryServiceJSON( queryUrl, authcfg, errorTitle, errorText, feedback );
442+
return queryServiceJSON( queryUrl, authcfg, errorTitle, errorText, requestHeaders, feedback );
443443
}
444444

445-
QList<quint32> QgsArcGisRestUtils::getObjectIdsByExtent( const QString &layerurl, const QString &objectIdField, const QgsRectangle &filterRect, QString &errorTitle, QString &errorText, const QString &authcfg, QgsFeedback *feedback )
445+
QList<quint32> QgsArcGisRestUtils::getObjectIdsByExtent( const QString &layerurl, const QString &objectIdField, const QgsRectangle &filterRect, QString &errorTitle, QString &errorText, const QString &authcfg, const QgsStringMap &requestHeaders, QgsFeedback *feedback )
446446
{
447447
QUrl queryUrl( layerurl + "/query" );
448448
queryUrl.addQueryItem( QStringLiteral( "f" ), QStringLiteral( "json" ) );
@@ -453,7 +453,7 @@ QList<quint32> QgsArcGisRestUtils::getObjectIdsByExtent( const QString &layerurl
453453
.arg( filterRect.xMaximum(), 0, 'f', -1 ).arg( filterRect.yMaximum(), 0, 'f', -1 ) );
454454
queryUrl.addQueryItem( QStringLiteral( "geometryType" ), QStringLiteral( "esriGeometryEnvelope" ) );
455455
queryUrl.addQueryItem( QStringLiteral( "spatialRel" ), QStringLiteral( "esriSpatialRelEnvelopeIntersects" ) );
456-
const QVariantMap objectIdData = queryServiceJSON( queryUrl, authcfg, errorTitle, errorText, feedback );
456+
const QVariantMap objectIdData = queryServiceJSON( queryUrl, authcfg, errorTitle, errorText, requestHeaders, feedback );
457457

458458
if ( objectIdData.isEmpty() )
459459
{
@@ -470,12 +470,16 @@ QList<quint32> QgsArcGisRestUtils::getObjectIdsByExtent( const QString &layerurl
470470
return ids;
471471
}
472472

473-
QByteArray QgsArcGisRestUtils::queryService( const QUrl &u, const QString &authcfg, QString &errorTitle, QString &errorText, QgsFeedback *feedback )
473+
QByteArray QgsArcGisRestUtils::queryService( const QUrl &u, const QString &authcfg, QString &errorTitle, QString &errorText, const QgsStringMap &requestHeaders, QgsFeedback *feedback )
474474
{
475475
QEventLoop loop;
476476
QUrl url = parseUrl( u );
477477

478478
QNetworkRequest request( url );
479+
for ( auto it = requestHeaders.constBegin(); it != requestHeaders.constEnd(); ++it )
480+
{
481+
request.setRawHeader( it.key().toUtf8(), it.value().toUtf8() );
482+
}
479483

480484
if ( !authcfg.isEmpty() )
481485
{
@@ -525,9 +529,9 @@ QByteArray QgsArcGisRestUtils::queryService( const QUrl &u, const QString &authc
525529
return result;
526530
}
527531

528-
QVariantMap QgsArcGisRestUtils::queryServiceJSON( const QUrl &url, const QString &authcfg, QString &errorTitle, QString &errorText, QgsFeedback *feedback )
532+
QVariantMap QgsArcGisRestUtils::queryServiceJSON( const QUrl &url, const QString &authcfg, QString &errorTitle, QString &errorText, const QgsStringMap &requestHeaders, QgsFeedback *feedback )
529533
{
530-
QByteArray reply = queryService( url, authcfg, errorTitle, errorText, feedback );
534+
QByteArray reply = queryService( url, authcfg, errorTitle, errorText, requestHeaders, feedback );
531535
if ( !errorTitle.isEmpty() )
532536
{
533537
return QVariantMap();

‎src/providers/arcgisrest/qgsarcgisrestutils.h

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -41,16 +41,16 @@ class QgsArcGisRestUtils
4141
static std::unique_ptr< QgsAbstractGeometry > parseEsriGeoJSON( const QVariantMap &geometryData, const QString &esriGeometryType, bool readM, bool readZ, QgsCoordinateReferenceSystem *crs = nullptr );
4242
static QgsCoordinateReferenceSystem parseSpatialReference( const QVariantMap &spatialReferenceMap );
4343

44-
static QVariantMap getServiceInfo( const QString &baseurl, const QString &authcfg, QString &errorTitle, QString &errorText );
45-
static QVariantMap getLayerInfo( const QString &layerurl, const QString &authcfg, QString &errorTitle, QString &errorText );
46-
static QVariantMap getObjectIds( const QString &layerurl, const QString &authcfg, const QString &objectIdFieldName, QString &errorTitle, QString &errorText,
44+
static QVariantMap getServiceInfo( const QString &baseurl, const QString &authcfg, QString &errorTitle, QString &errorText, const QgsStringMap &requestHeaders = QgsStringMap() );
45+
static QVariantMap getLayerInfo( const QString &layerurl, const QString &authcfg, QString &errorTitle, QString &errorText, const QgsStringMap &requestHeaders = QgsStringMap() );
46+
static QVariantMap getObjectIds( const QString &layerurl, const QString &authcfg, const QString &objectIdFieldName, QString &errorTitle, QString &errorText, const QgsStringMap &requestHeaders = QgsStringMap(),
4747
const QgsRectangle &bbox = QgsRectangle() );
4848
static QVariantMap getObjects( const QString &layerurl, const QString &authcfg, const QList<quint32> &objectIds, const QString &crs,
4949
bool fetchGeometry, const QStringList &fetchAttributes, bool fetchM, bool fetchZ,
50-
const QgsRectangle &filterRect, QString &errorTitle, QString &errorText, QgsFeedback *feedback = nullptr );
51-
static QList<quint32> getObjectIdsByExtent( const QString &layerurl, const QString &objectIdField, const QgsRectangle &filterRect, QString &errorTitle, QString &errorText, const QString &authcfg, QgsFeedback *feedback = nullptr );
52-
static QByteArray queryService( const QUrl &url, const QString &authcfg, QString &errorTitle, QString &errorText, QgsFeedback *feedback = nullptr );
53-
static QVariantMap queryServiceJSON( const QUrl &url, const QString &authcfg, QString &errorTitle, QString &errorText, QgsFeedback *feedback = nullptr );
50+
const QgsRectangle &filterRect, QString &errorTitle, QString &errorText, const QgsStringMap &requestHeaders = QgsStringMap(), QgsFeedback *feedback = nullptr );
51+
static QList<quint32> getObjectIdsByExtent( const QString &layerurl, const QString &objectIdField, const QgsRectangle &filterRect, QString &errorTitle, QString &errorText, const QString &authcfg, const QgsStringMap &requestHeaders = QgsStringMap(), QgsFeedback *feedback = nullptr );
52+
static QByteArray queryService( const QUrl &url, const QString &authcfg, QString &errorTitle, QString &errorText, const QgsStringMap &requestHeaders = QgsStringMap(), QgsFeedback *feedback = nullptr );
53+
static QVariantMap queryServiceJSON( const QUrl &url, const QString &authcfg, QString &errorTitle, QString &errorText, const QgsStringMap &requestHeaders = QgsStringMap(), QgsFeedback *feedback = nullptr );
5454

5555
static std::unique_ptr< QgsSymbol > parseEsriSymbolJson( const QVariantMap &symbolData );
5656
static std::unique_ptr< QgsLineSymbol > parseEsriLineSymbolJson( const QVariantMap &symbolData );

‎src/providers/arcgisrest/qgsarcgisservicesourceselect.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,7 @@ void QgsArcGisServiceSourceSelect::refresh()
208208

209209
void QgsArcGisServiceSourceSelect::addEntryToServerList()
210210
{
211-
QgsNewHttpConnection nc( nullptr, QgsNewHttpConnection::ConnectionOther, QStringLiteral( "qgis/connections-%1/" ).arg( mServiceName.toLower() ) );
211+
QgsNewHttpConnection nc( nullptr, QgsNewHttpConnection::ConnectionOther, QStringLiteral( "qgis/connections-%1/" ).arg( mServiceName.toLower() ), QString(), QgsNewHttpConnection::FlagShowHttpSettings );
212212
nc.setWindowTitle( tr( "Create a New %1 Connection" ).arg( mServiceName ) );
213213

214214
if ( nc.exec() )
@@ -220,7 +220,7 @@ void QgsArcGisServiceSourceSelect::addEntryToServerList()
220220

221221
void QgsArcGisServiceSourceSelect::modifyEntryOfServerList()
222222
{
223-
QgsNewHttpConnection nc( nullptr, QgsNewHttpConnection::ConnectionOther, QStringLiteral( "qgis/connections-%1/" ).arg( mServiceName.toLower() ), cmbConnections->currentText() );
223+
QgsNewHttpConnection nc( nullptr, QgsNewHttpConnection::ConnectionOther, QStringLiteral( "qgis/connections-%1/" ).arg( mServiceName.toLower() ), cmbConnections->currentText(), QgsNewHttpConnection::FlagShowHttpSettings );
224224
nc.setWindowTitle( tr( "Modify %1 Connection" ).arg( mServiceName ) );
225225

226226
if ( nc.exec() )

‎src/ui/qgsnewhttpconnectionbase.ui

Lines changed: 174 additions & 149 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,160 @@
2626
<string>Connection Details</string>
2727
</property>
2828
<layout class="QGridLayout">
29-
<item row="2" column="0" colspan="2">
29+
<item row="0" column="0" colspan="2">
30+
<widget class="QFrame" name="frame">
31+
<property name="sizePolicy">
32+
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Minimum">
33+
<horstretch>0</horstretch>
34+
<verstretch>0</verstretch>
35+
</sizepolicy>
36+
</property>
37+
<layout class="QGridLayout" name="gridLayout_5">
38+
<property name="leftMargin">
39+
<number>0</number>
40+
</property>
41+
<property name="topMargin">
42+
<number>0</number>
43+
</property>
44+
<property name="rightMargin">
45+
<number>0</number>
46+
</property>
47+
<property name="bottomMargin">
48+
<number>0</number>
49+
</property>
50+
<item row="0" column="0">
51+
<widget class="QLabel" name="TextLabel1_2">
52+
<property name="text">
53+
<string>Name</string>
54+
</property>
55+
<property name="wordWrap">
56+
<bool>true</bool>
57+
</property>
58+
<property name="margin">
59+
<number>5</number>
60+
</property>
61+
</widget>
62+
</item>
63+
<item row="0" column="1">
64+
<widget class="QLineEdit" name="txtName">
65+
<property name="minimumSize">
66+
<size>
67+
<width>0</width>
68+
<height>0</height>
69+
</size>
70+
</property>
71+
<property name="toolTip">
72+
<string>Name of the new connection</string>
73+
</property>
74+
<property name="frame">
75+
<bool>true</bool>
76+
</property>
77+
</widget>
78+
</item>
79+
<item row="1" column="0">
80+
<widget class="QLabel" name="TextLabel1">
81+
<property name="text">
82+
<string>URL</string>
83+
</property>
84+
<property name="margin">
85+
<number>5</number>
86+
</property>
87+
</widget>
88+
</item>
89+
<item row="1" column="1">
90+
<widget class="QLineEdit" name="txtUrl">
91+
<property name="toolTip">
92+
<string>HTTP address of the Web Map Server</string>
93+
</property>
94+
</widget>
95+
</item>
96+
</layout>
97+
</widget>
98+
</item>
99+
<item row="4" column="0" colspan="2">
100+
<widget class="QGroupBox" name="mWmsOptionsGroupBox">
101+
<property name="title">
102+
<string>WMS/WMTS Options</string>
103+
</property>
104+
<layout class="QGridLayout" name="gridLayout_2">
105+
<item row="5" column="0" colspan="2">
106+
<widget class="QCheckBox" name="cbxWmsInvertAxisOrientation">
107+
<property name="text">
108+
<string>Invert axis orientation</string>
109+
</property>
110+
</widget>
111+
</item>
112+
<item row="3" column="0" colspan="2">
113+
<widget class="QCheckBox" name="cbxIgnoreGetFeatureInfoURI">
114+
<property name="text">
115+
<string>Ignore GetFeatureInfo URI reported in capabilities</string>
116+
</property>
117+
</widget>
118+
</item>
119+
<item row="2" column="0" colspan="2">
120+
<widget class="QCheckBox" name="cbxIgnoreGetMapURI">
121+
<property name="text">
122+
<string>Ignore GetMap/GetTile URI reported in capabilities</string>
123+
</property>
124+
</widget>
125+
</item>
126+
<item row="9" column="0" colspan="2">
127+
<widget class="QCheckBox" name="cbxSmoothPixmapTransform">
128+
<property name="text">
129+
<string>Smooth pixmap transform</string>
130+
</property>
131+
</widget>
132+
</item>
133+
<item row="0" column="1">
134+
<widget class="QLineEdit" name="txtReferer"/>
135+
</item>
136+
<item row="1" column="1">
137+
<widget class="QComboBox" name="cmbDpiMode"/>
138+
</item>
139+
<item row="1" column="0">
140+
<widget class="QLabel" name="lblDpiMode">
141+
<property name="text">
142+
<string>DPI-&amp;Mode</string>
143+
</property>
144+
<property name="buddy">
145+
<cstring>cmbDpiMode</cstring>
146+
</property>
147+
</widget>
148+
</item>
149+
<item row="0" column="0">
150+
<widget class="QLabel" name="lblReferer">
151+
<property name="text">
152+
<string>&amp;Referer</string>
153+
</property>
154+
<property name="buddy">
155+
<cstring>txtReferer</cstring>
156+
</property>
157+
</widget>
158+
</item>
159+
<item row="4" column="0" colspan="2">
160+
<widget class="QCheckBox" name="cbxWmsIgnoreAxisOrientation">
161+
<property name="text">
162+
<string>Ignore axis orientation (WMS 1.3/WMTS)</string>
163+
</property>
164+
</widget>
165+
</item>
166+
</layout>
167+
</widget>
168+
</item>
169+
<item row="6" column="0">
170+
<spacer name="verticalSpacer">
171+
<property name="orientation">
172+
<enum>Qt::Vertical</enum>
173+
</property>
174+
<property name="sizeHint" stdset="0">
175+
<size>
176+
<width>0</width>
177+
<height>0</height>
178+
</size>
179+
</property>
180+
</spacer>
181+
</item>
182+
<item row="3" column="0" colspan="2">
30183
<widget class="QGroupBox" name="mWfsOptionsGroupBox">
31184
<property name="title">
32185
<string>WFS Options</string>
@@ -108,13 +261,6 @@
108261
</layout>
109262
</widget>
110263
</item>
111-
<item row="4" column="0" colspan="2">
112-
<widget class="QPushButton" name="mTestConnectionButton">
113-
<property name="text">
114-
<string>&amp;Test Connection</string>
115-
</property>
116-
</widget>
117-
</item>
118264
<item row="1" column="0" colspan="2">
119265
<widget class="QGroupBox" name="mAuthGroupBox">
120266
<property name="title">
@@ -146,159 +292,32 @@
146292
</layout>
147293
</widget>
148294
</item>
149-
<item row="3" column="0" colspan="2">
150-
<widget class="QGroupBox" name="mWmsOptionsGroupBox">
151-
<property name="title">
152-
<string>WMS/WMTS Options</string>
295+
<item row="5" column="0" colspan="2">
296+
<widget class="QPushButton" name="mTestConnectionButton">
297+
<property name="text">
298+
<string>&amp;Test Connection</string>
153299
</property>
154-
<layout class="QGridLayout" name="gridLayout_2">
155-
<item row="5" column="0" colspan="2">
156-
<widget class="QCheckBox" name="cbxWmsInvertAxisOrientation">
157-
<property name="text">
158-
<string>Invert axis orientation</string>
159-
</property>
160-
</widget>
161-
</item>
162-
<item row="3" column="0" colspan="2">
163-
<widget class="QCheckBox" name="cbxIgnoreGetFeatureInfoURI">
164-
<property name="text">
165-
<string>Ignore GetFeatureInfo URI reported in capabilities</string>
166-
</property>
167-
</widget>
168-
</item>
169-
<item row="2" column="0" colspan="2">
170-
<widget class="QCheckBox" name="cbxIgnoreGetMapURI">
171-
<property name="text">
172-
<string>Ignore GetMap/GetTile URI reported in capabilities</string>
173-
</property>
174-
</widget>
175-
</item>
176-
<item row="9" column="0" colspan="2">
177-
<widget class="QCheckBox" name="cbxSmoothPixmapTransform">
178-
<property name="text">
179-
<string>Smooth pixmap transform</string>
180-
</property>
181-
</widget>
182-
</item>
183-
<item row="0" column="1">
184-
<widget class="QLineEdit" name="txtReferer"/>
185-
</item>
186-
<item row="1" column="1">
187-
<widget class="QComboBox" name="cmbDpiMode"/>
188-
</item>
189-
<item row="1" column="0">
190-
<widget class="QLabel" name="lblDpiMode">
191-
<property name="text">
192-
<string>DPI-&amp;Mode</string>
193-
</property>
194-
<property name="buddy">
195-
<cstring>cmbDpiMode</cstring>
196-
</property>
197-
</widget>
198-
</item>
199-
<item row="0" column="0">
200-
<widget class="QLabel" name="lblReferer">
201-
<property name="text">
202-
<string>&amp;Referer</string>
203-
</property>
204-
<property name="buddy">
205-
<cstring>txtReferer</cstring>
206-
</property>
207-
</widget>
208-
</item>
209-
<item row="4" column="0" colspan="2">
210-
<widget class="QCheckBox" name="cbxWmsIgnoreAxisOrientation">
211-
<property name="text">
212-
<string>Ignore axis orientation (WMS 1.3/WMTS)</string>
213-
</property>
214-
</widget>
215-
</item>
216-
</layout>
217300
</widget>
218301
</item>
219-
<item row="0" column="0" colspan="2">
220-
<widget class="QFrame" name="frame">
221-
<property name="sizePolicy">
222-
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Minimum">
223-
<horstretch>0</horstretch>
224-
<verstretch>0</verstretch>
225-
</sizepolicy>
302+
<item row="2" column="0" colspan="2">
303+
<widget class="QGroupBox" name="mHttpGroupBox">
304+
<property name="title">
305+
<string>HTTP</string>
226306
</property>
227-
<layout class="QGridLayout" name="gridLayout_5">
228-
<property name="leftMargin">
229-
<number>0</number>
230-
</property>
231-
<property name="topMargin">
232-
<number>0</number>
233-
</property>
234-
<property name="rightMargin">
235-
<number>0</number>
236-
</property>
237-
<property name="bottomMargin">
238-
<number>0</number>
239-
</property>
240-
<item row="0" column="0">
241-
<widget class="QLabel" name="TextLabel1_2">
242-
<property name="text">
243-
<string>Name</string>
244-
</property>
245-
<property name="wordWrap">
246-
<bool>true</bool>
247-
</property>
248-
<property name="margin">
249-
<number>5</number>
250-
</property>
251-
</widget>
252-
</item>
253-
<item row="0" column="1">
254-
<widget class="QLineEdit" name="txtName">
255-
<property name="minimumSize">
256-
<size>
257-
<width>0</width>
258-
<height>0</height>
259-
</size>
260-
</property>
261-
<property name="toolTip">
262-
<string>Name of the new connection</string>
263-
</property>
264-
<property name="frame">
265-
<bool>true</bool>
266-
</property>
267-
</widget>
268-
</item>
269-
<item row="1" column="0">
270-
<widget class="QLabel" name="TextLabel1">
307+
<layout class="QHBoxLayout" name="horizontalLayout">
308+
<item>
309+
<widget class="QLabel" name="label">
271310
<property name="text">
272-
<string>URL</string>
273-
</property>
274-
<property name="margin">
275-
<number>5</number>
311+
<string>Referer</string>
276312
</property>
277313
</widget>
278314
</item>
279-
<item row="1" column="1">
280-
<widget class="QLineEdit" name="txtUrl">
281-
<property name="toolTip">
282-
<string>HTTP address of the Web Map Server</string>
283-
</property>
284-
</widget>
315+
<item>
316+
<widget class="QgsFilterLineEdit" name="mRefererLineEdit"/>
285317
</item>
286318
</layout>
287319
</widget>
288320
</item>
289-
<item row="5" column="0">
290-
<spacer name="verticalSpacer">
291-
<property name="orientation">
292-
<enum>Qt::Vertical</enum>
293-
</property>
294-
<property name="sizeHint" stdset="0">
295-
<size>
296-
<width>0</width>
297-
<height>0</height>
298-
</size>
299-
</property>
300-
</spacer>
301-
</item>
302321
</layout>
303322
</widget>
304323
</item>
@@ -313,6 +332,11 @@
313332
</widget>
314333
<layoutdefault spacing="6" margin="11"/>
315334
<customwidgets>
335+
<customwidget>
336+
<class>QgsFilterLineEdit</class>
337+
<extends>QLineEdit</extends>
338+
<header>qgsfilterlineedit.h</header>
339+
</customwidget>
316340
<customwidget>
317341
<class>QgsAuthSettingsWidget</class>
318342
<extends>QWidget</extends>
@@ -323,6 +347,7 @@
323347
<tabstops>
324348
<tabstop>txtName</tabstop>
325349
<tabstop>txtUrl</tabstop>
350+
<tabstop>mRefererLineEdit</tabstop>
326351
<tabstop>cmbVersion</tabstop>
327352
<tabstop>mWfsVersionDetectButton</tabstop>
328353
<tabstop>txtMaxNumFeatures</tabstop>

0 commit comments

Comments
 (0)
Please sign in to comment.