Replace all use of 'referer' http header as single var by QgsHttpHeader class

* add wrappers in QgsHttpHeader to read from/write to QMap, QUrlQuery, DomElement
* add QgsHttpHeader in QgsDataSoureUri, QgsXyzConnection, QgsVectorTileProviderConnection::Data, QgsWmsAuthorization
* fix tests
This commit is contained in:
bdm-oslandia 2022-05-20 12:27:57 +02:00 committed by Nyall Dawson
parent cb436fe3d6
commit 60db820f19
31 changed files with 412 additions and 158 deletions

View File

@ -9,6 +9,7 @@
class QgsHttpHeaders
{
%Docstring(signature="appended")
@ -48,10 +49,27 @@ Constructor from :py:class:`QgsSettings` ``settings`` object and root ``key``
Constructor from default :py:class:`QgsSettings` object and root ``key``
:param key:
%End
QgsHttpHeaders( const QDomElement &element );
%Docstring
Constructor from a QDomElement ``element``
:param element:
%End
virtual ~QgsHttpHeaders();
bool updateSettings( QgsSettings &settings, const QString &key = QString() ) const;
%Docstring
Updates the ``settings`` by adding all the http headers in the path "key/KEY_PREFIX/"
:param settings:
:param key: sub group path
:return: ``True`` if the update succeed
%End
bool updateNetworkRequest( QNetworkRequest &request ) const;
%Docstring
Updates a ``request`` by adding all the HTTP headers
@ -59,19 +77,25 @@ Updates a ``request`` by adding all the HTTP headers
:return: ``True`` if the update succeed
%End
bool updateDataSourceUri( QgsDataSourceUri &uri ) const;
bool updateUrlQuery( QUrlQuery &uri ) const;
%Docstring
Updates an ``uri`` by adding all the HTTP headers
:return: ``True`` if the update succeed
%End
void updateSettings( QgsSettings &settings, const QString &key = QString() ) const;
bool updateMap( QVariantMap &map ) const;
%Docstring
Updates the ``settings`` by adding all the http headers in the path "key/KEY_PREFIX/"
Updates a ``map`` by adding all the HTTP headers
:param settings:
:param key: sub group path
:return: ``True`` if the update succeed
%End
bool updateDomElement( QDomElement &el ) const;
%Docstring
Updates a ``map`` by adding all the HTTP headers
:return: ``True`` if the update succeed
%End
void setFromSettings( const QgsSettings &settings, const QString &key = QString() );
@ -80,6 +104,27 @@ Loads headers from the ``settings``
:param settings:
:param key: sub group path
%End
void setFromUrlQuery( const QUrlQuery &uri );
%Docstring
Loads headers from the ``uri``
:param uri:
%End
void setFromMap( const QVariantMap &map );
%Docstring
Loads headers from the ``map``
:param map:
%End
void setFromDomElement( const QDomElement &element );
%Docstring
Loads headers from the ``element``
:param element:
%End
QString sanitizeKey( const QString &key ) const;
@ -98,6 +143,11 @@ Returns a cleansed ``key``
:return: the list of all http header keys
%End
QString toSpacedString() const;
%Docstring
Returns key/value pairs as strings separated by space
%End
};

View File

@ -353,6 +353,24 @@ Sets geometry column name to ``geometryColumn``
%Docstring
Returns parameter keys used in the uri: specialized ones ("table", "schema", etc.) or generic parameters.
.. versionadded:: 3.26
%End
QgsHttpHeaders &httpHeaders();
%Docstring
Returns http headers
%End
QString httpHeader( const QString &key );
%Docstring
Returns the http header value according to ``key``
%End
void setHttpHeaders( const QgsHttpHeaders &headers );
%Docstring
Sets headers to ``headers``
.. versionadded:: 3.26
%End

View File

@ -19,13 +19,18 @@
***************************************************************************/
#include "qgshttpheaders.h"
#include "qgsdatasourceuri.h"
#include <QDir>
#include <QNetworkRequest>
#include <QUrlQuery>
#include <QDomElement>
//
// QgsHttpHeaders
//
const QString QgsHttpHeaders::KEY_PREFIX = "http-header/";
const QString QgsHttpHeaders::PATH_PREFIX = "http-header/";
const QString QgsHttpHeaders::PARAM_PREFIX = "http-header:";
const QString QgsHttpHeaders::KEY_REFERER = "referer";
QgsHttpHeaders::QgsHttpHeaders() = default;
@ -46,6 +51,11 @@ QgsHttpHeaders::QgsHttpHeaders( const QString &key )
setFromSettings( QgsSettings(), key );
}
QgsHttpHeaders::QgsHttpHeaders( const QDomElement &element )
{
setFromDomElement( element );
}
QgsHttpHeaders::~QgsHttpHeaders() = default;
bool QgsHttpHeaders::updateNetworkRequest( QNetworkRequest &request ) const
@ -57,22 +67,22 @@ bool QgsHttpHeaders::updateNetworkRequest( QNetworkRequest &request ) const
return true;
}
bool QgsHttpHeaders::updateDataSourceUri( QgsDataSourceUri &uri ) const
bool QgsHttpHeaders::updateUrlQuery( QUrlQuery &uri ) const
{
for ( auto ite = mHeaders.constBegin(); ite != mHeaders.constEnd(); ++ite )
{
uri.setParam( ite.key().toUtf8(), ite.value().toString().toUtf8() );
uri.addQueryItem( QgsHttpHeaders::PARAM_PREFIX + ite.key().toUtf8(), ite.value().toString().toUtf8() );
}
return true;
}
void QgsHttpHeaders::updateSettings( QgsSettings &settings, const QString &key ) const
bool QgsHttpHeaders::updateSettings( QgsSettings &settings, const QString &key ) const
{
QString keyFixed = sanitizeKey( key );
if ( !keyFixed.isEmpty() )
keyFixed = keyFixed + "/";
QString keyHH = keyFixed + QgsHttpHeaders::KEY_PREFIX;
QString keyHH = keyFixed + QgsHttpHeaders::PATH_PREFIX;
settings.remove( keyHH ); // cleanup
for ( auto ite = mHeaders.constBegin(); ite != mHeaders.constEnd(); ++ite )
{
@ -90,14 +100,48 @@ void QgsHttpHeaders::updateSettings( QgsSettings &settings, const QString &key )
if ( k.startsWith( keyFixed ) )
QgsLogger::debug( QString( "updateSettings in settings: %1=%2" ).arg( k, settings.value( k ).toString() ) );
#endif
return true;
}
bool QgsHttpHeaders::updateMap( QVariantMap &map ) const
{
for ( auto ite = mHeaders.constBegin(); ite != mHeaders.constEnd(); ++ite )
{
map.insert( QgsHttpHeaders::PARAM_PREFIX + ite.key().toUtf8(), ite.value().toString() );
}
if ( mHeaders.contains( QgsHttpHeaders::KEY_REFERER ) )
{
map.insert( QgsHttpHeaders::KEY_REFERER, mHeaders[QgsHttpHeaders::KEY_REFERER].toString() );
}
return true;
}
bool QgsHttpHeaders::updateDomElement( QDomElement &el ) const
{
for ( auto ite = mHeaders.constBegin(); ite != mHeaders.constEnd(); ++ite )
{
el.setAttribute( QgsHttpHeaders::PARAM_PREFIX + ite.key().toUtf8(), ite.value().toString() );
}
if ( mHeaders.contains( QgsHttpHeaders::KEY_REFERER ) )
{
el.setAttribute( QgsHttpHeaders::KEY_REFERER, mHeaders[QgsHttpHeaders::KEY_REFERER].toString() );
}
return true;
}
void QgsHttpHeaders::setFromSettings( const QgsSettings &settings, const QString &key )
{
QString keyFixed = sanitizeKey( key );
if ( !keyFixed.isEmpty() )
keyFixed = keyFixed + "/";
QString keyHH = keyFixed + QgsHttpHeaders::KEY_PREFIX;
QString keyHH = keyFixed + QgsHttpHeaders::PATH_PREFIX;
#if 0
QgsLogger::debug( QString( "setFromSettings key: %1" ).arg( keyFixed ) );
@ -116,6 +160,7 @@ void QgsHttpHeaders::setFromSettings( const QgsSettings &settings, const QString
mHeaders.insert( name, settings.value( *ite ).toString() );
}
}
if ( settings.contains( keyFixed + QgsHttpHeaders::KEY_REFERER ) ) // backward comptibility
{
mHeaders[QgsHttpHeaders::KEY_REFERER] = settings.value( keyFixed + QgsHttpHeaders::KEY_REFERER ).toString(); // retrieve value from old location
@ -127,6 +172,75 @@ void QgsHttpHeaders::setFromSettings( const QgsSettings &settings, const QString
#endif
}
void QgsHttpHeaders::setFromUrlQuery( const QUrlQuery &uri )
{
const auto constQueryItems = uri.queryItems( QUrl::ComponentFormattingOption::FullyDecoded );
for ( const QPair<QString, QString> &item : constQueryItems )
{
const QString &key = item.first;
if ( key.startsWith( QgsHttpHeaders::PARAM_PREFIX ) )
{
QString name = key.right( key.size() - QgsHttpHeaders::PARAM_PREFIX.size() );
mHeaders[sanitizeKey( name )] = item.second;
}
}
}
void QgsHttpHeaders::setFromMap( const QVariantMap &map )
{
for ( auto ite = map.keyBegin(); ite != map.keyEnd(); ++ite )
{
QString key = *ite;
if ( key.startsWith( QgsHttpHeaders::PARAM_PREFIX ) )
{
QString name = key.right( key.size() - QgsHttpHeaders::PARAM_PREFIX.size() );
mHeaders[sanitizeKey( name )] = map [key].toString();
}
}
if ( map.contains( QgsHttpHeaders::KEY_REFERER ) )
{
mHeaders[QgsHttpHeaders::KEY_REFERER] = map [QgsHttpHeaders::KEY_REFERER].toString();
}
}
void QgsHttpHeaders::setFromDomElement( const QDomElement &el )
{
QDomNamedNodeMap attribs = el.attributes();
for ( int i = 0; i < attribs.length(); i++ )
{
QDomNode item = attribs.item( i );
QString key = item.nodeName();
if ( key.startsWith( QgsHttpHeaders::PARAM_PREFIX ) )
{
QString name = key.right( key.size() - QgsHttpHeaders::PARAM_PREFIX.size() );
mHeaders[sanitizeKey( name )] = item.nodeValue();
}
}
if ( attribs.contains( QgsHttpHeaders::KEY_REFERER ) )
{
mHeaders[QgsHttpHeaders::KEY_REFERER] = attribs.namedItem( QgsHttpHeaders::KEY_REFERER ).nodeValue();
}
}
QString QgsHttpHeaders::toSpacedString() const
{
QString out;
for ( auto ite = mHeaders.constBegin(); ite != mHeaders.constEnd(); ++ite )
{
out += QStringLiteral( " %1%2='%3'" ).arg( QgsHttpHeaders::PARAM_PREFIX, ite.key(), ite.value().toString() );
}
if ( !mHeaders [ QgsHttpHeaders::KEY_REFERER ].toString().isEmpty() )
out += QStringLiteral( " %1='%2'" ).arg( QgsHttpHeaders::KEY_REFERER, mHeaders [QgsHttpHeaders::KEY_REFERER].toString() );
return out;
}
// To clean the path
QString QgsHttpHeaders::sanitizeKey( const QString &key ) const
{

View File

@ -21,12 +21,14 @@
#ifndef QGSHTTPHEADERS_H
#define QGSHTTPHEADERS_H
#include <QNetworkRequest>
#include <QMap>
#include "qgis_core.h"
#include "qgis_sip.h"
#include "qgssettingsentry.h"
#include "qgsdatasourceuri.h"
class QNetworkRequest;
class QUrlQuery;
class QDomElement;
/**
* \ingroup core
@ -39,15 +41,15 @@ class CORE_EXPORT QgsHttpHeaders
#ifndef SIP_RUN
/**
* Used in settings as the group name
*/
static const QString KEY_PREFIX;
//! Used in settings as the group name
static const QString PATH_PREFIX;
/**
* Used in settings as the referer key
*/
//! Used in settings as the referer key
static const QString KEY_REFERER;
//! Used in uri to pass headers as params
static const QString PARAM_PREFIX;
#endif
/**
@ -74,8 +76,23 @@ class CORE_EXPORT QgsHttpHeaders
*/
QgsHttpHeaders( const QString &key );
/**
* \brief Constructor from a QDomElement \a element
* \param element
*/
QgsHttpHeaders( const QDomElement &element );
//! default detructor
virtual ~QgsHttpHeaders();
/**
* \brief Updates the \a settings by adding all the http headers in the path "key/KEY_PREFIX/"
* \param settings
* \param key sub group path
* \return TRUE if the update succeed
*/
bool updateSettings( QgsSettings &settings, const QString &key = QString() ) const;
/**
* \brief Updates a \a request by adding all the HTTP headers
* \return TRUE if the update succeed
@ -86,14 +103,19 @@ class CORE_EXPORT QgsHttpHeaders
* \brief Updates an \a uri by adding all the HTTP headers
* \return TRUE if the update succeed
*/
bool updateDataSourceUri( QgsDataSourceUri &uri ) const;
bool updateUrlQuery( QUrlQuery &uri ) const;
/**
* \brief Updates the \a settings by adding all the http headers in the path "key/KEY_PREFIX/"
* \param settings
* \param key sub group path
* \brief Updates a \a map by adding all the HTTP headers
* \return TRUE if the update succeed
*/
void updateSettings( QgsSettings &settings, const QString &key = QString() ) const;
bool updateMap( QVariantMap &map ) const;
/**
* \brief Updates a \a map by adding all the HTTP headers
* \return TRUE if the update succeed
*/
bool updateDomElement( QDomElement &el ) const;
/**
* \brief Loads headers from the \a settings
@ -102,6 +124,24 @@ class CORE_EXPORT QgsHttpHeaders
*/
void setFromSettings( const QgsSettings &settings, const QString &key = QString() );
/**
* \brief Loads headers from the \a uri
* \param uri
*/
void setFromUrlQuery( const QUrlQuery &uri );
/**
* \brief Loads headers from the \a map
* \param map
*/
void setFromMap( const QVariantMap &map );
/**
* \brief Loads headers from the \a element
* \param element
*/
void setFromDomElement( const QDomElement &element );
/**
* \brief Returns a cleansed \a key
* \param key a key to be sanitized
@ -121,6 +161,9 @@ class CORE_EXPORT QgsHttpHeaders
*/
QList<QString> keys() const;
//! Returns key/value pairs as strings separated by space
QString toSpacedString() const;
#ifndef SIP_RUN
/**

View File

@ -445,15 +445,12 @@ QgsArcGisAsyncQuery::~QgsArcGisAsyncQuery()
mReply->deleteLater();
}
void QgsArcGisAsyncQuery::start( const QUrl &url, const QString &authCfg, QByteArray *result, bool allowCache, const QgsStringMap &headers )
void QgsArcGisAsyncQuery::start( const QUrl &url, const QString &authCfg, QByteArray *result, bool allowCache, const QgsHttpHeaders &headers )
{
mResult = result;
QNetworkRequest request( url );
for ( auto it = headers.constBegin(); it != headers.constEnd(); ++it )
{
request.setRawHeader( it.key().toUtf8(), it.value().toUtf8() );
}
headers.updateNetworkRequest( request );
if ( !authCfg.isEmpty() && !QgsApplication::authManager()->updateNetworkRequest( request, authCfg ) )
{

View File

@ -117,7 +117,7 @@ class CORE_EXPORT QgsArcGisAsyncQuery : public QObject
QgsArcGisAsyncQuery( QObject *parent = nullptr );
~QgsArcGisAsyncQuery() override;
void start( const QUrl &url, const QString &authCfg, QByteArray *result, bool allowCache = false, const QgsStringMap &headers = QgsStringMap() );
void start( const QUrl &url, const QString &authCfg, QByteArray *result, bool allowCache = false, const QgsHttpHeaders &headers = QgsHttpHeaders() );
signals:
void finished();
void failed( QString errorTitle, QString errorName );

View File

@ -578,6 +578,8 @@ QString QgsDataSourceUri::uri( bool expandAuthConfig ) const
uri += ' ' + it.key() + "='" + escape( it.value() ) + '\'';
}
uri += mHttpHeaders.toSpacedString();
QString columnName( mGeometryColumn );
columnName.replace( '\\', QLatin1String( "\\\\" ) );
columnName.replace( ')', QLatin1String( "\\)" ) );
@ -626,6 +628,8 @@ QByteArray QgsDataSourceUri::encodedUri() const
if ( !mAuthConfigId.isEmpty() )
url.addQueryItem( QStringLiteral( "authcfg" ), mAuthConfigId );
mHttpHeaders.updateUrlQuery( url );
return toLatin1_helper( url.toString( QUrl::FullyEncoded ) );
}
@ -640,17 +644,22 @@ void QgsDataSourceUri::setEncodedUri( const QByteArray &uri )
url.setQuery( QString::fromLatin1( uri ) );
const QUrlQuery query( url );
mHttpHeaders.setFromUrlQuery( query );
const auto constQueryItems = query.queryItems( QUrl::ComponentFormattingOption::FullyDecoded );
for ( const QPair<QString, QString> &item : constQueryItems )
{
if ( item.first == QLatin1String( "username" ) )
mUsername = item.second;
else if ( item.first == QLatin1String( "password" ) )
mPassword = item.second;
else if ( item.first == QLatin1String( "authcfg" ) )
mAuthConfigId = item.second;
else
mParams.insert( item.first, item.second );
if ( !item.first.startsWith( QgsHttpHeaders::PARAM_PREFIX ) )
{
if ( item.first == QLatin1String( "username" ) )
mUsername = item.second;
else if ( item.first == QLatin1String( "password" ) )
mPassword = item.second;
else if ( item.first == QLatin1String( "authcfg" ) )
mAuthConfigId = item.second;
else
mParams.insert( item.first, item.second );
}
}
}

View File

@ -22,6 +22,7 @@
#include "qgis_core.h"
#include "qgis_sip.h"
#include "qgswkbtypes.h"
#include "qgshttpheaders.h"
#include <QMap>
#include <QSet>
@ -325,6 +326,23 @@ class CORE_EXPORT QgsDataSourceUri
*/
QSet<QString> parameterKeys() const;
#ifndef SIP_RUN
//! Returns http headers
QgsHttpHeaders httpHeaders() const { return mHttpHeaders; }
#endif
//! Returns http headers
QgsHttpHeaders &httpHeaders() { return mHttpHeaders; }
//! Returns the http header value according to \a key
QString httpHeader( const QString &key ) { return mHttpHeaders[key].toString(); }
/**
* Sets headers to \a headers
* \since QGIS 3.26
*/
void setHttpHeaders( const QgsHttpHeaders &headers ) { mHttpHeaders = headers; }
#ifdef SIP_RUN
SIP_PYOBJECT __repr__();
% MethodCode
@ -380,6 +398,8 @@ class CORE_EXPORT QgsDataSourceUri
QString mSrid;
//! Generic params store
QMultiMap<QString, QString> mParams;
//! http header store
QgsHttpHeaders mHttpHeaders;
};
#endif //QGSDATASOURCEURI_H

View File

@ -62,10 +62,10 @@ QgsOwsConnection::QgsOwsConnection( const QString &service, const QString &connN
mConnectionInfo.append( ",authcfg=" + authcfg );
QgsHttpHeaders httpHeaders( QString( "%3/connections-%1/%2/" ).arg( mService.toLower(), mConnName, QgsSettings::Prefix::QGIS ) );
mUri.setHttpHeaders( httpHeaders );
const QString referer = httpHeaders[QgsHttpHeaders::KEY_REFERER].toString();
if ( !referer.isEmpty() )
{
mUri.setParam( QStringLiteral( "referer" ), referer );
mConnectionInfo.append( ",referer=" + referer );
}
@ -109,8 +109,7 @@ QgsDataSourceUri &QgsOwsConnection::addWmsWcsConnectionSettings( QgsDataSourceUr
Q_NOWARN_DEPRECATED_POP
const QgsSettings settings;
QgsHttpHeaders httpHeaders( settings, settingsKey );
httpHeaders.updateDataSourceUri( uri );
uri.httpHeaders().setFromSettings( settings, settingsKey );
if ( settings.value( settingsKey + QStringLiteral( "/ignoreGetMapURI" ), false ).toBool() )
{
@ -141,8 +140,9 @@ QgsDataSourceUri &QgsOwsConnection::addWmsWcsConnectionSettings( QgsDataSourceUr
{
addCommonConnectionSettings( uri, service, connName );
QgsHttpHeaders httpHeaders( QString( "%3/connections-%1/%2/" ).arg( service.toLower(), connName, QgsSettings::Prefix::QGIS ) );
httpHeaders.updateDataSourceUri( uri );
QString settingsKey = QString( "%3/connections-%1/%2/" ).arg( service.toLower(), connName, QgsSettings::Prefix::QGIS );
const QgsSettings settings;
uri.httpHeaders().setFromSettings( settings, settingsKey );
if ( settingsConnectionIgnoreGetMapURI.value( {service.toLower(), connName} ) )
{

View File

@ -50,11 +50,11 @@ QString QgsVectorTileProviderConnection::encodedUri( const QgsVectorTileProvider
uri.setUsername( conn.username );
if ( !conn.password.isEmpty() )
uri.setPassword( conn.password );
if ( !conn.referer.isEmpty() )
uri.setParam( QStringLiteral( "referer" ), conn.referer );
if ( !conn.styleUrl.isEmpty() )
uri.setParam( QStringLiteral( "styleUrl" ), conn.styleUrl );
uri.setHttpHeaders( conn.httpHeaders );
switch ( conn.serviceType )
{
case Generic:
@ -80,9 +80,10 @@ QgsVectorTileProviderConnection::Data QgsVectorTileProviderConnection::decodedUr
conn.authCfg = dsUri.authConfigId();
conn.username = dsUri.username();
conn.password = dsUri.password();
conn.referer = dsUri.param( QStringLiteral( "referer" ) );
conn.styleUrl = dsUri.param( QStringLiteral( "styleUrl" ) );
conn.httpHeaders = dsUri.httpHeaders();
if ( dsUri.hasParam( QStringLiteral( "serviceType" ) ) )
{
if ( dsUri.param( QStringLiteral( "serviceType" ) ) == QLatin1String( "arcgis" ) )
@ -118,11 +119,11 @@ QString QgsVectorTileProviderConnection::encodedLayerUri( const QgsVectorTilePro
uri.setUsername( conn.username );
if ( !conn.password.isEmpty() )
uri.setPassword( conn.password );
if ( !conn.referer.isEmpty() )
uri.setParam( QStringLiteral( "referer" ), conn.referer );
if ( !conn.styleUrl.isEmpty() )
uri.setParam( QStringLiteral( "styleUrl" ), conn.styleUrl );
uri.setHttpHeaders( conn.httpHeaders );
switch ( conn.serviceType )
{
case Generic:
@ -160,9 +161,10 @@ QgsVectorTileProviderConnection::Data QgsVectorTileProviderConnection::connectio
conn.authCfg = settings.value( QStringLiteral( "authcfg" ) ).toString();
conn.username = settings.value( QStringLiteral( "username" ) ).toString();
conn.password = settings.value( QStringLiteral( "password" ) ).toString();
conn.referer = QgsHttpHeaders( settings )[ QStringLiteral( "referer" ) ].toString();
conn.styleUrl = settings.value( QStringLiteral( "styleUrl" ) ).toString();
conn.httpHeaders = QgsHttpHeaders( settings );
if ( settings.contains( QStringLiteral( "serviceType" ) ) )
{
if ( settings.value( QStringLiteral( "serviceType" ) ) == QLatin1String( "arcgis" ) )
@ -189,9 +191,10 @@ void QgsVectorTileProviderConnection::addConnection( const QString &name, QgsVec
settings.setValue( QStringLiteral( "authcfg" ), conn.authCfg );
settings.setValue( QStringLiteral( "username" ), conn.username );
settings.setValue( QStringLiteral( "password" ), conn.password );
QgsHttpHeaders( QVariantMap( { {QStringLiteral( "referer" ), conn.referer}} ) ).updateSettings( settings );
settings.setValue( QStringLiteral( "styleUrl" ), conn.styleUrl );
conn.httpHeaders.updateSettings( settings );
switch ( conn.serviceType )
{
case Generic:

View File

@ -61,8 +61,8 @@ class CORE_EXPORT QgsVectorTileProviderConnection : public QgsAbstractProviderCo
QString username;
//! HTTP Basic password
QString password;
//! Referer
QString referer;
//! HTTP headers
QgsHttpHeaders httpHeaders;
//! Optional style URL (will override any default styles)
QString styleUrl;

View File

@ -812,10 +812,8 @@ QByteArray QgsVectorTileLayer::getRawTile( QgsTileXYZ tileID )
QgsDataSourceUri dsUri;
dsUri.setEncodedUri( mDataSource );
const QString authcfg = dsUri.authConfigId();
QgsHttpHeaders headers;
headers [QStringLiteral( "referer" ) ] = dsUri.param( QStringLiteral( "referer" ) );
QList<QgsVectorTileRawData> rawTiles = QgsVectorTileLoader::blockingFetchTileRawData( mSourceType, mSourcePath, tileMatrix, QPointF(), tileRange, authcfg, headers );
QList<QgsVectorTileRawData> rawTiles = QgsVectorTileLoader::blockingFetchTileRawData( mSourceType, mSourcePath, tileMatrix, QPointF(), tileRange, authcfg, dsUri.httpHeaders() );
if ( rawTiles.isEmpty() )
return QByteArray();
return rawTiles.first().data;

View File

@ -45,7 +45,7 @@ QgsVectorTileLayerRenderer::QgsVectorTileLayerRenderer( QgsVectorTileLayer *laye
QgsDataSourceUri dsUri;
dsUri.setEncodedUri( layer->source() );
mAuthCfg = dsUri.authConfigId();
mHeaders [QStringLiteral( "referer" ) ] = dsUri.param( QStringLiteral( "referer" ) );
mHeaders = dsUri.httpHeaders();
if ( QgsLabelingEngine *engine = context.labelingEngine() )
{

View File

@ -86,8 +86,8 @@ QVariantMap QgsVectorTileProviderMetadata::decodeUri( const QString &uri ) const
if ( dsUri.hasParam( QStringLiteral( "zmax" ) ) )
uriComponents.insert( QStringLiteral( "zmax" ), dsUri.param( QStringLiteral( "zmax" ) ) );
if ( dsUri.hasParam( QStringLiteral( "referer" ) ) )
uriComponents.insert( QStringLiteral( "referer" ), dsUri.param( QStringLiteral( "referer" ) ) );
dsUri.httpHeaders().updateMap( uriComponents );
if ( dsUri.hasParam( QStringLiteral( "styleUrl" ) ) )
uriComponents.insert( QStringLiteral( "styleUrl" ), dsUri.param( QStringLiteral( "styleUrl" ) ) );
@ -111,8 +111,8 @@ QString QgsVectorTileProviderMetadata::encodeUri( const QVariantMap &parts ) con
if ( parts.contains( QStringLiteral( "zmax" ) ) )
dsUri.setParam( QStringLiteral( "zmax" ), parts[ QStringLiteral( "zmax" ) ].toString() );
if ( parts.contains( QStringLiteral( "referer" ) ) )
dsUri.setParam( QStringLiteral( "referer" ), parts[ QStringLiteral( "referer" ) ].toString() );
dsUri.httpHeaders().setFromMap( parts );
if ( parts.contains( QStringLiteral( "styleUrl" ) ) )
dsUri.setParam( QStringLiteral( "styleUrl" ), parts[ QStringLiteral( "styleUrl" ) ].toString() );

View File

@ -22,7 +22,7 @@
#include "qgssettings.h"
#include "qgsmanageconnectionsdialog.h"
#include "qgshttpheaders.h"
QgsManageConnectionsDialog::QgsManageConnectionsDialog( QWidget *parent, Mode mode, Type type, const QString &fileName )
: QDialog( parent )
@ -457,9 +457,11 @@ QDomDocument QgsManageConnectionsDialog::saveOWSConnections( const QStringList &
el.setAttribute( QStringLiteral( "ignoreGetFeatureInfoURI" ), settings.value( path + connections[i] + "/ignoreGetFeatureInfoURI", false ).toBool() ? "true" : "false" );
el.setAttribute( QStringLiteral( "ignoreAxisOrientation" ), settings.value( path + connections[i] + "/ignoreAxisOrientation", false ).toBool() ? "true" : "false" );
el.setAttribute( QStringLiteral( "invertAxisOrientation" ), settings.value( path + connections[i] + "/invertAxisOrientation", false ).toBool() ? "true" : "false" );
el.setAttribute( QStringLiteral( "referer" ), settings.value( path + connections[ i ] + "/referer" ).toString() );
el.setAttribute( QStringLiteral( "smoothPixmapTransform" ), settings.value( path + connections[i] + "/smoothPixmapTransform", false ).toBool() ? "true" : "false" );
el.setAttribute( QStringLiteral( "dpiMode" ), settings.value( path + connections[i] + "/dpiMode", "7" ).toInt() );
QgsHttpHeaders httpHeader( path + connections[ i ] );
httpHeader.updateDomElement( el );
}
path = "/qgis/" + service.toUpper() + '/';
@ -730,9 +732,11 @@ QDomDocument QgsManageConnectionsDialog::saveXyzTilesConnections( const QStringL
el.setAttribute( QStringLiteral( "authcfg" ), settings.value( path + "/authcfg" ).toString() );
el.setAttribute( QStringLiteral( "username" ), settings.value( path + "/username" ).toString() );
el.setAttribute( QStringLiteral( "password" ), settings.value( path + "/password" ).toString() );
el.setAttribute( QStringLiteral( "referer" ), settings.value( path + "/referer" ).toString() );
el.setAttribute( QStringLiteral( "tilePixelRatio" ), settings.value( path + "/tilePixelRatio", 0 ).toDouble() );
QgsHttpHeaders httpHeader( path );
httpHeader.updateDomElement( el );
root.appendChild( el );
}
@ -754,7 +758,9 @@ QDomDocument QgsManageConnectionsDialog::saveArcgisConnections( const QStringLis
QDomElement el = doc.createElement( service.toLower() );
el.setAttribute( QStringLiteral( "name" ), connections[ i ] );
el.setAttribute( QStringLiteral( "url" ), settings.value( path + connections[ i ] + "/url" ).toString() );
el.setAttribute( QStringLiteral( "referer" ), settings.value( path + connections[ i ] + "/referer" ).toString() );
QgsHttpHeaders httpHeader( path + connections[ i ] );
httpHeader.updateDomElement( el );
path = "/qgis/" + service.toUpper() + '/';
el.setAttribute( QStringLiteral( "username" ), settings.value( path + connections[ i ] + "/username" ).toString() );
@ -788,9 +794,11 @@ QDomDocument QgsManageConnectionsDialog::saveVectorTileConnections( const QStrin
el.setAttribute( QStringLiteral( "authcfg" ), settings.value( path + "/authcfg" ).toString() );
el.setAttribute( QStringLiteral( "username" ), settings.value( path + "/username" ).toString() );
el.setAttribute( QStringLiteral( "password" ), settings.value( path + "/password" ).toString() );
el.setAttribute( QStringLiteral( "referer" ), settings.value( path + "/referer" ).toString() );
el.setAttribute( QStringLiteral( "styleUrl" ), settings.value( path + "/styleUrl" ).toString() );
QgsHttpHeaders httpHeader( path );
httpHeader.updateDomElement( el );
root.appendChild( el );
}
@ -875,9 +883,12 @@ void QgsManageConnectionsDialog::loadOWSConnections( const QDomDocument &doc, co
settings.setValue( QString( '/' + connectionName + "/ignoreGetFeatureInfoURI" ), child.attribute( QStringLiteral( "ignoreGetFeatureInfoURI" ) ) == QLatin1String( "true" ) );
settings.setValue( QString( '/' + connectionName + "/ignoreAxisOrientation" ), child.attribute( QStringLiteral( "ignoreAxisOrientation" ) ) == QLatin1String( "true" ) );
settings.setValue( QString( '/' + connectionName + "/invertAxisOrientation" ), child.attribute( QStringLiteral( "invertAxisOrientation" ) ) == QLatin1String( "true" ) );
settings.setValue( QString( '/' + connectionName + "/referer" ), child.attribute( QStringLiteral( "referer" ) ) );
settings.setValue( QString( '/' + connectionName + "/smoothPixmapTransform" ), child.attribute( QStringLiteral( "smoothPixmapTransform" ) ) == QLatin1String( "true" ) );
settings.setValue( QString( '/' + connectionName + "/dpiMode" ), child.attribute( QStringLiteral( "dpiMode" ), QStringLiteral( "7" ) ).toInt() );
QgsHttpHeaders httpHeader( child );
httpHeader.updateSettings( settings, QString( '/' + connectionName ) );
settings.endGroup();
if ( !child.attribute( QStringLiteral( "username" ) ).isEmpty() )
@ -1538,8 +1549,11 @@ void QgsManageConnectionsDialog::loadXyzTilesConnections( const QDomDocument &do
settings.setValue( QStringLiteral( "authcfg" ), child.attribute( QStringLiteral( "authcfg" ) ) );
settings.setValue( QStringLiteral( "username" ), child.attribute( QStringLiteral( "username" ) ) );
settings.setValue( QStringLiteral( "password" ), child.attribute( QStringLiteral( "password" ) ) );
settings.setValue( QStringLiteral( "referer" ), child.attribute( QStringLiteral( "referer" ) ) );
settings.setValue( QStringLiteral( "tilePixelRatio" ), child.attribute( QStringLiteral( "tilePixelRatio" ) ) );
QgsHttpHeaders httpHeader( child );
httpHeader.updateSettings( settings );
settings.endGroup();
child = child.nextSiblingElement();
@ -1620,7 +1634,10 @@ void QgsManageConnectionsDialog::loadArcgisConnections( const QDomDocument &doc,
// no dups detected or overwrite is allowed
settings.beginGroup( "/qgis/connections-" + service.toLower() );
settings.setValue( QString( '/' + connectionName + "/url" ), child.attribute( QStringLiteral( "url" ) ) );
settings.setValue( QString( '/' + connectionName + "/referer" ), child.attribute( QStringLiteral( "referer" ) ) );
QgsHttpHeaders httpHeader( child );
httpHeader.updateSettings( settings, QString( '/' + connectionName ) );
settings.endGroup();
settings.beginGroup( "/qgis/" + service.toUpper() + '/' + connectionName );
@ -1712,9 +1729,11 @@ void QgsManageConnectionsDialog::loadVectorTileConnections( const QDomDocument &
settings.setValue( QStringLiteral( "authcfg" ), child.attribute( QStringLiteral( "authcfg" ) ) );
settings.setValue( QStringLiteral( "username" ), child.attribute( QStringLiteral( "username" ) ) );
settings.setValue( QStringLiteral( "password" ), child.attribute( QStringLiteral( "password" ) ) );
settings.setValue( QStringLiteral( "referer" ), child.attribute( QStringLiteral( "referer" ) ) );
settings.setValue( QStringLiteral( "styleUrl" ), child.attribute( QStringLiteral( "styleUrl" ) ) );
QgsHttpHeaders httpHeader( child );
httpHeader.updateSettings( settings );
settings.endGroup();
child = child.nextSiblingElement();

View File

@ -57,7 +57,7 @@ void QgsArcgisVectorTileConnectionDialog::setConnection( const QString &name, co
mAuthSettings->setUsername( conn.username );
mAuthSettings->setPassword( conn.password );
mEditReferer->setText( conn.referer );
mEditReferer->setText( conn.httpHeaders[QgsHttpHeaders::KEY_REFERER].toString() );
mAuthSettings->setConfigId( conn.authCfg );
mEditStyleUrl->setText( conn.styleUrl );
@ -79,7 +79,7 @@ QString QgsArcgisVectorTileConnectionDialog::connectionUri() const
conn.username = mAuthSettings->username();
conn.password = mAuthSettings->password();
conn.referer = mEditReferer->text();
conn.httpHeaders[QgsHttpHeaders::KEY_REFERER] = mEditReferer->text();
conn.authCfg = mAuthSettings->configId( );
conn.styleUrl = mEditStyleUrl->text();

View File

@ -56,7 +56,7 @@ void QgsVectorTileConnectionDialog::setConnection( const QString &name, const QS
mAuthSettings->setUsername( conn.username );
mAuthSettings->setPassword( conn.password );
mEditReferer->setText( conn.referer );
mEditReferer->setText( conn.httpHeaders[QgsHttpHeaders::KEY_REFERER].toString() );
mAuthSettings->setConfigId( conn.authCfg );
mEditStyleUrl->setText( conn.styleUrl );
@ -72,7 +72,7 @@ QString QgsVectorTileConnectionDialog::connectionUri() const
conn.zMax = mSpinZMax->value();
conn.username = mAuthSettings->username();
conn.password = mAuthSettings->password();
conn.referer = mEditReferer->text();
conn.httpHeaders[QgsHttpHeaders::KEY_REFERER] = mEditReferer->text();
conn.authCfg = mAuthSettings->configId( );
conn.styleUrl = mEditStyleUrl->text();
return QgsVectorTileProviderConnection::encodedUri( conn );

View File

@ -45,9 +45,7 @@ QgsAfsProvider::QgsAfsProvider( const QString &uri, const ProviderOptions &optio
// Get layer info
QString errorTitle, errorMessage;
const QString referer = mSharedData->mDataSource.param( QStringLiteral( "referer" ) );
if ( !referer.isEmpty() )
mRequestHeaders[ QStringLiteral( "referer" )] = referer;
mRequestHeaders = mSharedData->mDataSource.httpHeaders();
std::unique_ptr< QgsScopedRuntimeProfile > profile;
if ( QgsApplication::profiler()->groupIsActive( QStringLiteral( "projectload" ) ) )
@ -433,10 +431,9 @@ QVariantMap QgsAfsProviderMetadata::decodeUri( const QString &uri ) const
if ( xminOk && yminOk && xmaxOk && ymaxOk )
components.insert( QStringLiteral( "bounds" ), r );
}
if ( !dsUri.param( QStringLiteral( "referer" ) ).isEmpty() )
{
components.insert( QStringLiteral( "referer" ), dsUri.param( QStringLiteral( "referer" ) ) );
}
dsUri.httpHeaders().updateMap( components );
if ( !dsUri.param( QStringLiteral( "crs" ) ).isEmpty() )
{
components.insert( QStringLiteral( "crs" ), dsUri.param( QStringLiteral( "crs" ) ) );
@ -463,10 +460,9 @@ QString QgsAfsProviderMetadata::encodeUri( const QVariantMap &parts ) const
{
dsUri.setParam( QStringLiteral( "crs" ), parts.value( QStringLiteral( "crs" ) ).toString() );
}
if ( !parts.value( QStringLiteral( "referer" ) ).toString().isEmpty() )
{
dsUri.setParam( QStringLiteral( "referer" ), parts.value( QStringLiteral( "referer" ) ).toString() );
}
dsUri.httpHeaders().setFromMap( parts );
if ( !parts.value( QStringLiteral( "authcfg" ) ).toString().isEmpty() )
{
dsUri.setAuthConfigId( parts.value( QStringLiteral( "authcfg" ) ).toString() );

View File

@ -60,15 +60,10 @@ bool QgsAfsSharedData::getFeature( QgsFeatureId id, QgsFeature &f, const QgsRect
QString errorTitle, errorMessage;
const QString authcfg = mDataSource.authConfigId();
QgsHttpHeaders headers;
const QString referer = mDataSource.param( QStringLiteral( "referer" ) );
if ( !referer.isEmpty() )
headers[ QStringLiteral( "Referer" )] = referer;
const QVariantMap queryData = QgsArcGisRestQueryUtils::getObjects(
mDataSource.param( QStringLiteral( "url" ) ), authcfg, objectIds, mDataSource.param( QStringLiteral( "crs" ) ), true,
QStringList(), QgsWkbTypes::hasM( mGeometryType ), QgsWkbTypes::hasZ( mGeometryType ),
filterRect, errorTitle, errorMessage, headers, feedback );
filterRect, errorTitle, errorMessage, mDataSource.httpHeaders(), feedback );
if ( queryData.isEmpty() )
{
@ -151,12 +146,8 @@ QgsFeatureIds QgsAfsSharedData::getFeatureIdsInExtent( const QgsRectangle &exten
QString errorText;
const QString authcfg = mDataSource.authConfigId();
QgsHttpHeaders headers;
const QString referer = mDataSource.param( QStringLiteral( "referer" ) );
if ( !referer.isEmpty() )
headers[ QStringLiteral( "Referer" )] = referer;
const QList<quint32> featuresInRect = QgsArcGisRestQueryUtils::getObjectIdsByExtent( mDataSource.param( QStringLiteral( "url" ) ),
extent, errorTitle, errorText, authcfg, headers, feedback );
extent, errorTitle, errorText, authcfg, mDataSource.httpHeaders(), feedback );
QgsFeatureIds ids;
for ( const quint32 id : featuresInRect )

View File

@ -81,16 +81,12 @@ void QgsAmsLegendFetcher::start()
// http://sampleserver5.arcgisonline.com/arcgis/rest/services/CommunityAddressing/MapServer/legend?f=pjson
QgsDataSourceUri dataSource( mProvider->dataSourceUri() );
const QString authCfg = dataSource.authConfigId();
const QString referer = dataSource.param( QStringLiteral( "referer" ) );
QgsStringMap headers;
if ( !referer.isEmpty() )
headers[ QStringLiteral( "referer" )] = referer;
QUrl queryUrl( dataSource.param( QStringLiteral( "url" ) ) + "/legend" );
QUrlQuery query( queryUrl );
query.addQueryItem( QStringLiteral( "f" ), QStringLiteral( "json" ) );
queryUrl.setQuery( query );
mQuery->start( queryUrl, authCfg, &mQueryReply, false, headers );
mQuery->start( queryUrl, authCfg, &mQueryReply, false, dataSource.httpHeaders() );
}
else
{
@ -196,9 +192,7 @@ QgsAmsProvider::QgsAmsProvider( const QString &uri, const ProviderOptions &optio
: QgsRasterDataProvider( uri, options, flags )
{
QgsDataSourceUri dataSource( dataSourceUri() );
const QString referer = dataSource.param( QStringLiteral( "referer" ) );
if ( !referer.isEmpty() )
mRequestHeaders[ QStringLiteral( "referer" )] = referer;
mRequestHeaders = dataSource.httpHeaders();
mLegendFetcher = new QgsAmsLegendFetcher( this, QImage() );
@ -1258,10 +1252,8 @@ QVariantMap QgsAmsProviderMetadata::decodeUri( const QString &uri ) const
QVariantMap components;
components.insert( QStringLiteral( "url" ), dsUri.param( QStringLiteral( "url" ) ) );
if ( !dsUri.param( QStringLiteral( "referer" ) ).isEmpty() )
{
components.insert( QStringLiteral( "referer" ), dsUri.param( QStringLiteral( "referer" ) ) );
}
dsUri.httpHeaders().updateMap( components );
if ( !dsUri.param( QStringLiteral( "crs" ) ).isEmpty() )
{
components.insert( QStringLiteral( "crs" ), dsUri.param( QStringLiteral( "crs" ) ) );
@ -1291,10 +1283,9 @@ QString QgsAmsProviderMetadata::encodeUri( const QVariantMap &parts ) const
{
dsUri.setParam( QStringLiteral( "crs" ), parts.value( QStringLiteral( "crs" ) ).toString() );
}
if ( !parts.value( QStringLiteral( "referer" ) ).toString().isEmpty() )
{
dsUri.setParam( QStringLiteral( "referer" ), parts.value( QStringLiteral( "referer" ) ).toString() );
}
dsUri.httpHeaders().setFromMap( parts );
if ( !parts.value( QStringLiteral( "authcfg" ) ).toString().isEmpty() )
{
dsUri.setAuthConfigId( parts.value( QStringLiteral( "authcfg" ) ).toString() );

View File

@ -195,15 +195,13 @@ QVector<QgsDataItem *> QgsArcGisRestConnectionItem::createChildren()
const QgsOwsConnection connection( QStringLiteral( "ARCGISFEATURESERVER" ), mConnName );
const QString url = connection.uri().param( QStringLiteral( "url" ) );
const QString authcfg = connection.uri().authConfigId();
const QString referer = connection.uri().param( QStringLiteral( "referer" ) );
QgsHttpHeaders headers;
if ( ! referer.isEmpty() )
headers[ QStringLiteral( "referer" )] = referer;
QgsHttpHeaders headers = connection.uri().httpHeaders();
QVector<QgsDataItem *> items;
if ( !mPortalCommunityEndpoint.isEmpty() && !mPortalContentEndpoint.isEmpty() )
{
items << new QgsArcGisPortalGroupsItem( this, QStringLiteral( "groups" ), authcfg, headers, mPortalCommunityEndpoint, mPortalContentEndpoint );
items << new QgsArcGisPortalGroupsItem( this, QStringLiteral( "groups" ), authcfg, connection.uri().httpHeaders(), mPortalCommunityEndpoint, mPortalContentEndpoint );
items << new QgsArcGisRestServicesItem( this, url, QStringLiteral( "services" ), authcfg, headers );
}
else
@ -573,8 +571,9 @@ QgsArcGisFeatureServiceLayerItem::QgsArcGisFeatureServiceLayerItem( QgsDataItem
mUri = QStringLiteral( "crs='%1' url='%2'" ).arg( authid, url );
if ( !authcfg.isEmpty() )
mUri += QStringLiteral( " authcfg='%1'" ).arg( authcfg );
if ( !headers [ QStringLiteral( "referer" ) ].toString().isEmpty() )
mUri += QStringLiteral( " referer='%1'" ).arg( headers[ QStringLiteral( "referer" ) ].toString() );
mUri += headers.toSpacedString();
setState( Qgis::BrowserItemState::Populated );
setToolTip( url );
}
@ -590,8 +589,9 @@ QgsArcGisMapServiceLayerItem::QgsArcGisMapServiceLayerItem( QgsDataItem *parent,
mUri = QStringLiteral( "crs='%1' format='%2' layer='%3' url='%4'" ).arg( authid, format, id, trimmedUrl );
if ( !authcfg.isEmpty() )
mUri += QStringLiteral( " authcfg='%1'" ).arg( authcfg );
if ( !headers [ QStringLiteral( "referer" ) ].toString().isEmpty() )
mUri += QStringLiteral( " referer='%1'" ).arg( headers [ QStringLiteral( "referer" ) ].toString() );
mUri += headers.toSpacedString();
setState( Qgis::BrowserItemState::Populated );
setToolTip( mPath );
}

View File

@ -52,7 +52,7 @@ bool QgsWmsSettings::parseUri( const QString &uriString )
mAuth.mAuthCfg = uri.authConfigId();
}
mAuth.mReferer = uri.param( QStringLiteral( "referer" ) );
mAuth.mHttpHeaders = uri.httpHeaders();
mXyz = false; // assume WMS / WMTS
if ( uri.hasParam( QStringLiteral( "interpretation" ) ) )

View File

@ -656,10 +656,10 @@ struct QgsWmsParserSettings
struct QgsWmsAuthorization
{
QgsWmsAuthorization( const QString &userName = QString(), const QString &password = QString(), const QString &referer = QString(), const QString &authcfg = QString() )
QgsWmsAuthorization( const QString &userName = QString(), const QString &password = QString(), const QgsHttpHeaders &httpHeaders = QgsHttpHeaders(), const QString &authcfg = QString() )
: mUserName( userName )
, mPassword( password )
, mReferer( referer )
, mHttpHeaders( httpHeaders )
, mAuthCfg( authcfg )
{}
@ -674,10 +674,8 @@ struct QgsWmsAuthorization
request.setRawHeader( "Authorization", "Basic " + QStringLiteral( "%1:%2" ).arg( mUserName, mPassword ).toUtf8().toBase64() );
}
if ( !mReferer.isEmpty() )
{
request.setRawHeader( "Referer", mReferer.toLatin1() );
}
mHttpHeaders.updateNetworkRequest( request );
return true;
}
//! Sets authorization reply
@ -696,8 +694,8 @@ struct QgsWmsAuthorization
//! Password for basic http authentication
QString mPassword;
//! Referer for http requests
QString mReferer;
//! headers for http requests
QgsHttpHeaders mHttpHeaders;
//! Authentication configuration ID
QString mAuthCfg;

View File

@ -34,8 +34,9 @@ QString QgsXyzConnection::encodedUri() const
uri.setUsername( username );
if ( ! password.isEmpty() )
uri.setPassword( password );
if ( ! referer.isEmpty() )
uri.setParam( QStringLiteral( "referer" ), referer );
uri.setHttpHeaders( httpHeaders );
if ( tilePixelRatio != 0 )
uri.setParam( QStringLiteral( "tilePixelRatio" ), QString::number( tilePixelRatio ) );
if ( !interpretation.isEmpty() )
@ -93,7 +94,9 @@ QgsXyzConnection QgsXyzConnectionUtils::connection( const QString &name )
conn.authCfg = settings.value( QStringLiteral( "authcfg" ) ).toString();
conn.username = settings.value( QStringLiteral( "username" ) ).toString();
conn.password = settings.value( QStringLiteral( "password" ) ).toString();
conn.referer = settings.value( QStringLiteral( "referer" ) ).toString();
conn.httpHeaders.setFromSettings( settings );
conn.tilePixelRatio = settings.value( QStringLiteral( "tilePixelRatio" ), 0 ).toDouble();
conn.hidden = settings.value( QStringLiteral( "hidden" ) ).toBool();
conn.interpretation = settings.value( QStringLiteral( "interpretation" ), QString() ).toString();
@ -137,7 +140,9 @@ void QgsXyzConnectionUtils::addConnection( const QgsXyzConnection &conn )
settings.setValue( QStringLiteral( "authcfg" ), conn.authCfg );
settings.setValue( QStringLiteral( "username" ), conn.username );
settings.setValue( QStringLiteral( "password" ), conn.password );
settings.setValue( QStringLiteral( "referer" ), conn.referer );
conn.httpHeaders.updateSettings( settings );
settings.setValue( QStringLiteral( "tilePixelRatio" ), conn.tilePixelRatio );
settings.setValue( QStringLiteral( "interpretation" ), conn.interpretation );
if ( addHiddenProperty )

View File

@ -17,6 +17,8 @@
#define QGSXYZCONNECTION_H
#include <QStringList>
#include "qgshttpheaders.h"
struct QgsXyzConnection
{
@ -30,8 +32,8 @@ struct QgsXyzConnection
QString username;
// HTTP Basic password
QString password;
// Referer
QString referer;
// http headers
QgsHttpHeaders httpHeaders;
// tile pixel ratio (0 = unknown (not scaled), 1.0 = 256x256, 2.0 = 512x512)
double tilePixelRatio = 0;
bool hidden = false;

View File

@ -49,7 +49,7 @@ void QgsXyzConnectionDialog::setConnection( const QgsXyzConnection &conn )
mSourceWidget->setZMax( conn.zMax );
mSourceWidget->setUsername( conn.username );
mSourceWidget->setPassword( conn.password );
mSourceWidget->setReferer( conn.referer );
mSourceWidget->setReferer( conn.httpHeaders[QgsHttpHeaders::KEY_REFERER].toString() );
mSourceWidget->setTilePixelRatio( conn.tilePixelRatio );
mSourceWidget->setAuthCfg( conn.authCfg );
mSourceWidget->setInterpretation( conn.interpretation );
@ -64,7 +64,7 @@ QgsXyzConnection QgsXyzConnectionDialog::connection() const
conn.zMax = mSourceWidget->zMax();
conn.username = mSourceWidget->username();
conn.password = mSourceWidget->password();
conn.referer = mSourceWidget->referer();
conn.httpHeaders[QgsHttpHeaders::KEY_REFERER] = mSourceWidget->referer();
conn.tilePixelRatio = mSourceWidget->tilePixelRatio();
conn.authCfg = mSourceWidget->authcfg( );
conn.interpretation = mSourceWidget->interpretation();

View File

@ -75,8 +75,8 @@ void TestQgsHttpheaders::setFromSettings( const QString &keyBase )
settings.remove( keyBase ); // cleanup
settings.setValue( keyBase + outOfHeaderKey, "value" );
settings.setValue( keyBase + QgsHttpHeaders::KEY_PREFIX + "key1", "value1" );
settings.setValue( keyBase + QgsHttpHeaders::KEY_PREFIX + QgsHttpHeaders::KEY_REFERER, "valueHH_R" );
settings.setValue( keyBase + QgsHttpHeaders::PATH_PREFIX + "key1", "value1" );
settings.setValue( keyBase + QgsHttpHeaders::PATH_PREFIX + QgsHttpHeaders::KEY_REFERER, "valueHH_R" );
QgsHttpHeaders h( settings, keyBase );
QVERIFY( ! h.keys().contains( outOfHeaderKey ) );
@ -99,26 +99,26 @@ void TestQgsHttpheaders::updateSettings()
QgsHttpHeaders h( QVariantMap( { {QStringLiteral( "key1" ), "value1"}} ) );
h.updateSettings( settings, keyBase );
QVERIFY( settings.contains( keyBase + QgsHttpHeaders::KEY_PREFIX + "key1" ) );
QCOMPARE( settings.value( keyBase + QgsHttpHeaders::KEY_PREFIX + "key1" ).toString(), "value1" );
QVERIFY( settings.contains( keyBase + QgsHttpHeaders::PATH_PREFIX + "key1" ) );
QCOMPARE( settings.value( keyBase + QgsHttpHeaders::PATH_PREFIX + "key1" ).toString(), "value1" );
QVERIFY( ! settings.contains( keyBase + QgsHttpHeaders::KEY_REFERER ) );
QVERIFY( ! settings.contains( keyBase + QgsHttpHeaders::KEY_PREFIX + QgsHttpHeaders::KEY_REFERER ) );
QVERIFY( ! settings.contains( keyBase + QgsHttpHeaders::PATH_PREFIX + QgsHttpHeaders::KEY_REFERER ) );
// at old location
settings.remove( keyBase + QgsHttpHeaders::KEY_REFERER );
h [QgsHttpHeaders::KEY_REFERER] = QStringLiteral( "http://gg.com" );
h.updateSettings( settings, keyBase );
QVERIFY( settings.contains( keyBase + QgsHttpHeaders::KEY_PREFIX + QgsHttpHeaders::KEY_REFERER ) );
QCOMPARE( settings.value( keyBase + QgsHttpHeaders::KEY_PREFIX + QgsHttpHeaders::KEY_REFERER ).toString(), "http://gg.com" );
QVERIFY( settings.contains( keyBase + QgsHttpHeaders::PATH_PREFIX + QgsHttpHeaders::KEY_REFERER ) );
QCOMPARE( settings.value( keyBase + QgsHttpHeaders::PATH_PREFIX + QgsHttpHeaders::KEY_REFERER ).toString(), "http://gg.com" );
QVERIFY( ! settings.contains( keyBase + QgsHttpHeaders::KEY_REFERER ) );
// test backward compatibility
settings.setValue( keyBase + QgsHttpHeaders::KEY_REFERER, "paf" ) ; // legacy referer, should be overridden
h.updateSettings( settings, keyBase );
QVERIFY( settings.contains( keyBase + QgsHttpHeaders::KEY_PREFIX + QgsHttpHeaders::KEY_REFERER ) );
QCOMPARE( settings.value( keyBase + QgsHttpHeaders::KEY_PREFIX + QgsHttpHeaders::KEY_REFERER ).toString(), "http://gg.com" );
QVERIFY( settings.contains( keyBase + QgsHttpHeaders::PATH_PREFIX + QgsHttpHeaders::KEY_REFERER ) );
QCOMPARE( settings.value( keyBase + QgsHttpHeaders::PATH_PREFIX + QgsHttpHeaders::KEY_REFERER ).toString(), "http://gg.com" );
QVERIFY( settings.contains( keyBase + QgsHttpHeaders::KEY_REFERER ) );
QCOMPARE( settings.value( keyBase + QgsHttpHeaders::KEY_REFERER ).toString(), "http://gg.com" );
}
@ -127,18 +127,18 @@ void TestQgsHttpheaders::updateSettings()
void TestQgsHttpheaders::createQgsOwsConnection()
{
QgsSettings settings;
settings.setValue( QString( QgsSettings::Prefix::QGIS ) + "/connections-service/name/" + QgsHttpHeaders::KEY_PREFIX + QgsHttpHeaders::KEY_REFERER,
settings.setValue( QString( QgsSettings::Prefix::QGIS ) + "/connections-service/name/" + QgsHttpHeaders::PATH_PREFIX + QgsHttpHeaders::KEY_REFERER,
"http://test.com" );
settings.setValue( QString( QgsSettings::Prefix::QGIS ) + "/connections-service/name/" + QgsHttpHeaders::KEY_PREFIX + "other_http_header",
settings.setValue( QString( QgsSettings::Prefix::QGIS ) + "/connections-service/name/" + QgsHttpHeaders::PATH_PREFIX + "other_http_header",
"value" );
QgsOwsConnection ows( "service", "name" );
QCOMPARE( ows.connectionInfo(), ",authcfg=,referer=http://test.com" );
QCOMPARE( ows.uri().encodedUri(), "referer=http://test.com&url" );
QCOMPARE( ows.uri().encodedUri(), "url&http-header:other_http_header=value&http-header:referer=http://test.com" );
QgsDataSourceUri uri( QString( "https://www.ogc.org/?p1=v1" ) );
QgsDataSourceUri uri2 = ows.addWmsWcsConnectionSettings( uri, "service", "name" );
QCOMPARE( uri2.encodedUri(), "https://www.ogc.org/?p1=v1&other_http_header=value&referer=http://test.com" );
QCOMPARE( uri2.encodedUri(), "https://www.ogc.org/?p1=v1&http-header:other_http_header=value&http-header:referer=http://test.com" );
}
QGSTEST_MAIN( TestQgsHttpheaders )

View File

@ -478,7 +478,7 @@ class TestPyQgsAFSProvider(unittest.TestCase, ProviderTestCase):
"""
parts = {'url': 'http://blah.com', 'crs': 'epsg:4326', 'referer': 'me', 'bounds': QgsRectangle(1, 2, 3, 4)}
uri = QgsProviderRegistry.instance().encodeUri(self.vl.dataProvider().name(), parts)
self.assertEqual(uri, " bbox='1,2,3,4' crs='epsg:4326' referer='me' url='http://blah.com'")
self.assertEqual(uri, " bbox='1,2,3,4' crs='epsg:4326' url='http://blah.com' http-header:referer='me' referer='me'")
def testObjectIdDifferentName(self):
""" Test that object id fields not named OBJECTID work correctly """

View File

@ -57,7 +57,7 @@ class TestQgsGeoNodeConnection(unittest.TestCase):
uri = c.uri()
c.addWmsConnectionSettings(uri)
self.assertEqual(uri.param('referer'), 'my_ref')
self.assertEqual(uri.httpHeader('referer'), 'my_ref')
self.assertEqual(uri.param('IgnoreGetMapUrl'), '1')
self.assertEqual(uri.param('IgnoreGetFeatureInfoUrl'), '1')
self.assertEqual(uri.param('SmoothPixmapTransform'), '1')

View File

@ -54,7 +54,7 @@ class TestQgsOwsConnection(unittest.TestCase):
uri = c.uri()
self.assertEqual(uri.param('url'), 'aaa.bbb.com')
self.assertEqual(uri.param('referer'), 'my_ref')
self.assertEqual(uri.httpHeader('referer'), 'my_ref')
self.assertEqual(uri.param('IgnoreGetMapUrl'), '1')
self.assertEqual(uri.param('IgnoreGetFeatureInfoUrl'), '1')
self.assertEqual(uri.param('SmoothPixmapTransform'), '1')
@ -66,7 +66,7 @@ class TestQgsOwsConnection(unittest.TestCase):
uri = QgsDataSourceUri()
QgsOwsConnection.addWmsWcsConnectionSettings(uri, 'qgis/connections-wms/test/')
self.assertEqual(uri.param('referer'), 'my_ref')
self.assertEqual(uri.httpHeader('referer'), 'my_ref')
self.assertEqual(uri.param('IgnoreGetMapUrl'), '1')
self.assertEqual(uri.param('IgnoreGetFeatureInfoUrl'), '1')
self.assertEqual(uri.param('SmoothPixmapTransform'), '1')

View File

@ -110,13 +110,13 @@ class TestVectorTile(unittest.TestCase):
uri = md.encodeUri(parts)
self.assertEqual(uri, 'type=xyz&url=https://fake.new.server/%7Bx%7D/%7By%7D/%7Bz%7D.png&zmax=2&zmin=0')
uri = 'type=xyz&serviceType=arcgis&url=https://fake.server/%7Bx%7D/%7By%7D/%7Bz%7D.png&zmax=2&referer=https://qgis.org/&styleUrl=https://qgis.org/'
uri = 'type=xyz&serviceType=arcgis&url=https://fake.server/%7Bx%7D/%7By%7D/%7Bz%7D.png&zmax=2&http-header:referer=https://qgis.org/&styleUrl=https://qgis.org/'
parts = md.decodeUri(uri)
self.assertEqual(parts, {'type': 'xyz', 'serviceType': 'arcgis', 'url': 'https://fake.server/{x}/{y}/{z}.png', 'zmax': '2', 'referer': 'https://qgis.org/', 'styleUrl': 'https://qgis.org/'})
self.assertEqual(parts, {'type': 'xyz', 'serviceType': 'arcgis', 'url': 'https://fake.server/{x}/{y}/{z}.png', 'zmax': '2', 'http-header:referer': 'https://qgis.org/', 'referer': 'https://qgis.org/', 'styleUrl': 'https://qgis.org/'})
parts['url'] = 'https://fake.new.server/{x}/{y}/{z}.png'
uri = md.encodeUri(parts)
self.assertEqual(uri, 'referer=https://qgis.org/&serviceType=arcgis&styleUrl=https://qgis.org/&type=xyz&url=https://fake.new.server/%7Bx%7D/%7By%7D/%7Bz%7D.png&zmax=2')
self.assertEqual(uri, 'serviceType=arcgis&styleUrl=https://qgis.org/&type=xyz&url=https://fake.new.server/%7Bx%7D/%7By%7D/%7Bz%7D.png&zmax=2&http-header:referer=https://qgis.org/')
def testZoomRange(self):
"""