diff --git a/python/PyQt6/core/auto_generated/network/qgshttpheaders.sip.in b/python/PyQt6/core/auto_generated/network/qgshttpheaders.sip.in index 3428ece4f42b..35b853d8e32f 100644 --- a/python/PyQt6/core/auto_generated/network/qgshttpheaders.sip.in +++ b/python/PyQt6/core/auto_generated/network/qgshttpheaders.sip.in @@ -109,15 +109,22 @@ KEY_REFERER value will be available at key "KEY_PREFIX+KEY_REFERER" and key "KEY :return: ``True`` if the update succeed %End - bool updateDomElement( QDomElement &el ) const; + bool updateDomElement( QDomElement &el ) const; %Docstring -Updates a ``map`` by adding all the HTTP headers +Updates a DOM element by adding all the HTTP headers KEY_REFERER value will be available at attribute "KEY_PREFIX+KEY_REFERER" and attribute "KEY_REFERER" (for backward compatibility) +:param el: DOM element + :return: ``True`` if the update succeed + +.. deprecated:: 3.42 + + Will be removed in QGIS 4.0. %End + void setFromSettings( const QgsSettings &settings, const QString &key = QString() ); %Docstring Loads headers from the ``settings`` diff --git a/python/core/auto_generated/network/qgshttpheaders.sip.in b/python/core/auto_generated/network/qgshttpheaders.sip.in index 3428ece4f42b..35b853d8e32f 100644 --- a/python/core/auto_generated/network/qgshttpheaders.sip.in +++ b/python/core/auto_generated/network/qgshttpheaders.sip.in @@ -109,15 +109,22 @@ KEY_REFERER value will be available at key "KEY_PREFIX+KEY_REFERER" and key "KEY :return: ``True`` if the update succeed %End - bool updateDomElement( QDomElement &el ) const; + bool updateDomElement( QDomElement &el ) const; %Docstring -Updates a ``map`` by adding all the HTTP headers +Updates a DOM element by adding all the HTTP headers KEY_REFERER value will be available at attribute "KEY_PREFIX+KEY_REFERER" and attribute "KEY_REFERER" (for backward compatibility) +:param el: DOM element + :return: ``True`` if the update succeed + +.. deprecated:: 3.42 + + Will be removed in QGIS 4.0. %End + void setFromSettings( const QgsSettings &settings, const QString &key = QString() ); %Docstring Loads headers from the ``settings`` diff --git a/src/core/network/qgshttpheaders.cpp b/src/core/network/qgshttpheaders.cpp index de9caeceeeeb..01436e579943 100644 --- a/src/core/network/qgshttpheaders.cpp +++ b/src/core/network/qgshttpheaders.cpp @@ -123,8 +123,18 @@ bool QgsHttpHeaders::updateMap( QVariantMap &map ) const bool QgsHttpHeaders::updateDomElement( QDomElement &el ) const { + QMap namespaceDeclarations; + return updateDomElement( el, namespaceDeclarations ); +} + +bool QgsHttpHeaders::updateDomElement( QDomElement &el, QMap &namespaceDeclarations ) const +{ + QString httpHeaderURIPrefix( QgsHttpHeaders::PARAM_PREFIX ); + httpHeaderURIPrefix.chop( 1 ); + for ( auto ite = mHeaders.constBegin(); ite != mHeaders.constEnd(); ++ite ) { + namespaceDeclarations.insert( httpHeaderURIPrefix, QStringLiteral( "https://qgis.org/" ) + httpHeaderURIPrefix ); el.setAttribute( QgsHttpHeaders::PARAM_PREFIX + ite.key().toUtf8(), ite.value().toString() ); } diff --git a/src/core/network/qgshttpheaders.h b/src/core/network/qgshttpheaders.h index 30e69ac70555..5bf4a7daf8d8 100644 --- a/src/core/network/qgshttpheaders.h +++ b/src/core/network/qgshttpheaders.h @@ -126,13 +126,26 @@ class CORE_EXPORT QgsHttpHeaders bool updateMap( QVariantMap &map ) const; /** - * \brief Updates a \a map by adding all the HTTP headers + * \brief Updates a DOM element by adding all the HTTP headers + * + * KEY_REFERER value will be available at attribute "KEY_PREFIX+KEY_REFERER" and attribute "KEY_REFERER" (for backward compatibility) + * + * \param el DOM element + * \return TRUE if the update succeed + * \deprecated QGIS 3.42. Will be removed in QGIS 4.0. + */ + Q_DECL_DEPRECATED bool updateDomElement( QDomElement &el ) const SIP_DEPRECATED; + + /** + * \brief Updates a DOM element by adding all the HTTP headers * * KEY_REFERER value will be available at attribute "KEY_PREFIX+KEY_REFERER" and attribute "KEY_REFERER" (for backward compatibility) * + * \param el DOM element + * \param[out] namespaceDeclarations Map of (prefix, URI) tuples for namespaces used by el. * \return TRUE if the update succeed */ - bool updateDomElement( QDomElement &el ) const; + bool updateDomElement( QDomElement &el, QMap &namespaceDeclarations ) const SIP_SKIP; /** * \brief Loads headers from the \a settings diff --git a/src/gui/qgsmanageconnectionsdialog.cpp b/src/gui/qgsmanageconnectionsdialog.cpp index dd0460ae0001..59bed6444fd7 100644 --- a/src/gui/qgsmanageconnectionsdialog.cpp +++ b/src/gui/qgsmanageconnectionsdialog.cpp @@ -461,6 +461,14 @@ bool QgsManageConnectionsDialog::populateConnections() return true; } +static void addNamespaceDeclarations( QDomElement &root, const QMap &namespaceDeclarations ) +{ + for ( auto it = namespaceDeclarations.begin(); it != namespaceDeclarations.end(); ++it ) + { + root.setAttribute( QStringLiteral( "xmlns:" ) + it.key(), it.value() ); + } +} + QDomDocument QgsManageConnectionsDialog::saveOWSConnections( const QStringList &connections, const QString &service ) { QDomDocument doc( QStringLiteral( "connections" ) ); @@ -468,6 +476,7 @@ QDomDocument QgsManageConnectionsDialog::saveOWSConnections( const QStringList & root.setAttribute( QStringLiteral( "version" ), QStringLiteral( "1.0" ) ); doc.appendChild( root ); + QMap namespaceDeclarations; for ( int i = 0; i < connections.count(); ++i ) { QDomElement el = doc.createElement( service.toLower() ); @@ -484,7 +493,7 @@ QDomDocument QgsManageConnectionsDialog::saveOWSConnections( const QStringList & el.setAttribute( QStringLiteral( "dpiMode" ), static_cast( QgsOwsConnection::settingsDpiMode->value( { service.toLower(), connections[i] } ) ) ); QgsHttpHeaders httpHeader( QgsOwsConnection::settingsHeaders->value( { service.toLower(), connections[i] } ) ); - httpHeader.updateDomElement( el ); + httpHeader.updateDomElement( el, namespaceDeclarations ); } el.setAttribute( QStringLiteral( "username" ), QgsOwsConnection::settingsUsername->value( { service.toLower(), connections[i] } ) ); @@ -492,6 +501,8 @@ QDomDocument QgsManageConnectionsDialog::saveOWSConnections( const QStringList & root.appendChild( el ); } + addNamespaceDeclarations( root, namespaceDeclarations ); + return doc; } @@ -710,6 +721,7 @@ QDomDocument QgsManageConnectionsDialog::saveXyzTilesConnections( const QStringL root.setAttribute( QStringLiteral( "version" ), QStringLiteral( "1.0" ) ); doc.appendChild( root ); + QMap namespaceDeclarations; for ( int i = 0; i < connections.count(); ++i ) { QDomElement el = doc.createElement( QStringLiteral( "xyztiles" ) ); @@ -724,11 +736,13 @@ QDomDocument QgsManageConnectionsDialog::saveXyzTilesConnections( const QStringL el.setAttribute( QStringLiteral( "tilePixelRatio" ), QgsXyzConnectionSettings::settingsTilePixelRatio->value( connections[i] ) ); QgsHttpHeaders httpHeader( QgsXyzConnectionSettings::settingsHeaders->value( connections[i] ) ); - httpHeader.updateDomElement( el ); + httpHeader.updateDomElement( el, namespaceDeclarations ); root.appendChild( el ); } + addNamespaceDeclarations( root, namespaceDeclarations ); + return doc; } @@ -739,6 +753,7 @@ QDomDocument QgsManageConnectionsDialog::saveArcgisConnections( const QStringLis root.setAttribute( QStringLiteral( "version" ), QStringLiteral( "1.0" ) ); doc.appendChild( root ); + QMap namespaceDeclarations; for ( const QString &connection : connections ) { QDomElement el = doc.createElement( QStringLiteral( "arcgisfeatureserver" ) ); @@ -746,7 +761,7 @@ QDomDocument QgsManageConnectionsDialog::saveArcgisConnections( const QStringLis el.setAttribute( QStringLiteral( "url" ), QgsArcGisConnectionSettings::settingsUrl->value( connection ) ); QgsHttpHeaders httpHeader( QgsArcGisConnectionSettings::settingsHeaders->value( connection ) ); - httpHeader.updateDomElement( el ); + httpHeader.updateDomElement( el, namespaceDeclarations ); el.setAttribute( QStringLiteral( "username" ), QgsArcGisConnectionSettings::settingsUsername->value( connection ) ); el.setAttribute( QStringLiteral( "password" ), QgsArcGisConnectionSettings::settingsPassword->value( connection ) ); @@ -755,6 +770,8 @@ QDomDocument QgsManageConnectionsDialog::saveArcgisConnections( const QStringLis root.appendChild( el ); } + addNamespaceDeclarations( root, namespaceDeclarations ); + return doc; } @@ -765,6 +782,7 @@ QDomDocument QgsManageConnectionsDialog::saveVectorTileConnections( const QStrin root.setAttribute( QStringLiteral( "version" ), QStringLiteral( "1.0" ) ); doc.appendChild( root ); + QMap namespaceDeclarations; for ( int i = 0; i < connections.count(); ++i ) { QDomElement el = doc.createElement( QStringLiteral( "vectortile" ) ); @@ -780,11 +798,13 @@ QDomDocument QgsManageConnectionsDialog::saveVectorTileConnections( const QStrin el.setAttribute( QStringLiteral( "styleUrl" ), QgsVectorTileProviderConnection::settingsStyleUrl->value( connections[i] ) ); QgsHttpHeaders httpHeader( QgsVectorTileProviderConnection::settingsHeaders->value( connections[i] ) ); - httpHeader.updateDomElement( el ); + httpHeader.updateDomElement( el, namespaceDeclarations ); root.appendChild( el ); } + addNamespaceDeclarations( root, namespaceDeclarations ); + return doc; } @@ -795,6 +815,7 @@ QDomDocument QgsManageConnectionsDialog::saveTiledSceneConnections( const QStrin root.setAttribute( QStringLiteral( "version" ), QStringLiteral( "1.0" ) ); doc.appendChild( root ); + QMap namespaceDeclarations; for ( int i = 0; i < connections.count(); ++i ) { QDomElement el = doc.createElement( QStringLiteral( "tiledscene" ) ); @@ -807,11 +828,13 @@ QDomDocument QgsManageConnectionsDialog::saveTiledSceneConnections( const QStrin el.setAttribute( QStringLiteral( "password" ), QgsTiledSceneProviderConnection::settingsPassword->value( connections[i] ) ); QgsHttpHeaders httpHeader( QgsTiledSceneProviderConnection::settingsHeaders->value( connections[i] ) ); - httpHeader.updateDomElement( el ); + httpHeader.updateDomElement( el, namespaceDeclarations ); root.appendChild( el ); } + addNamespaceDeclarations( root, namespaceDeclarations ); + return doc; } @@ -822,6 +845,7 @@ QDomDocument QgsManageConnectionsDialog::saveSensorThingsConnections( const QStr root.setAttribute( QStringLiteral( "version" ), QStringLiteral( "1.0" ) ); doc.appendChild( root ); + QMap namespaceDeclarations; for ( int i = 0; i < connections.count(); ++i ) { QDomElement el = doc.createElement( QStringLiteral( "sensorthings" ) ); @@ -833,11 +857,13 @@ QDomDocument QgsManageConnectionsDialog::saveSensorThingsConnections( const QStr el.setAttribute( QStringLiteral( "password" ), QgsSensorThingsProviderConnection::settingsPassword->value( connections[i] ) ); QgsHttpHeaders httpHeader( QgsTiledSceneProviderConnection::settingsHeaders->value( connections[i] ) ); - httpHeader.updateDomElement( el ); + httpHeader.updateDomElement( el, namespaceDeclarations ); root.appendChild( el ); } + addNamespaceDeclarations( root, namespaceDeclarations ); + return doc; } @@ -882,6 +908,7 @@ QDomDocument QgsManageConnectionsDialog::saveStacConnections( const QStringList root.setAttribute( QStringLiteral( "version" ), QStringLiteral( "1.0" ) ); doc.appendChild( root ); + QMap namespaceDeclarations; for ( int i = 0; i < connections.count(); ++i ) { QDomElement el = doc.createElement( QStringLiteral( "stac" ) ); @@ -893,11 +920,13 @@ QDomDocument QgsManageConnectionsDialog::saveStacConnections( const QStringList el.setAttribute( QStringLiteral( "password" ), QgsStacConnection::settingsPassword->value( connections[i] ) ); QgsHttpHeaders httpHeader( QgsStacConnection::settingsHeaders->value( connections[i] ) ); - httpHeader.updateDomElement( el ); + httpHeader.updateDomElement( el, namespaceDeclarations ); root.appendChild( el ); } + addNamespaceDeclarations( root, namespaceDeclarations ); + return doc; } diff --git a/tests/src/core/testqgshttpheaders.cpp b/tests/src/core/testqgshttpheaders.cpp index 9c2df3cc20ec..a47fc9654e85 100644 --- a/tests/src/core/testqgshttpheaders.cpp +++ b/tests/src/core/testqgshttpheaders.cpp @@ -272,7 +272,8 @@ void TestQgsHttpheaders::updateSetDomElement() QDomElement element = doc.createElement( "qgs" ); // === update QgsHttpHeaders h( QVariantMap( { { QStringLiteral( "key1" ), "value1" }, { QgsHttpHeaders::KEY_REFERER, "my_ref" } } ) ); - h.updateDomElement( element ); + QMap namespaceDeclarations; + h.updateDomElement( element, namespaceDeclarations ); QVERIFY( element.hasAttribute( QgsHttpHeaders::PARAM_PREFIX + "key1" ) ); QCOMPARE( element.attribute( QgsHttpHeaders::PARAM_PREFIX + "key1" ), "value1" ); @@ -284,6 +285,8 @@ void TestQgsHttpheaders::updateSetDomElement() QVERIFY( element.hasAttribute( QgsHttpHeaders::KEY_REFERER ) ); QCOMPARE( element.attribute( QgsHttpHeaders::KEY_REFERER ), "my_ref" ); + QCOMPARE( namespaceDeclarations["http-header"], "https://qgis.org/http-header" ); + // === setFrom QgsHttpHeaders h2; element.setAttribute( QgsHttpHeaders::KEY_REFERER, "my_ref_root" ); // overwrite root ref to ckeck backward compatibility