diff --git a/python/PyQt6/gui/auto_generated/qgsnewhttpconnection.sip.in b/python/PyQt6/gui/auto_generated/qgsnewhttpconnection.sip.in index 3b2820211c9..85c422e646c 100644 --- a/python/PyQt6/gui/auto_generated/qgsnewhttpconnection.sip.in +++ b/python/PyQt6/gui/auto_generated/qgsnewhttpconnection.sip.in @@ -97,6 +97,13 @@ Returns the "test connection" button. + Qgis::HttpMethod preferredHttpMethod() const; +%Docstring +Returns the selected preferred HTTP method. + +.. versionadded:: 3.44 +%End + virtual QString wfsSettingsKey( const QString &base, const QString &connectionName ) const; %Docstring diff --git a/python/gui/auto_generated/qgsnewhttpconnection.sip.in b/python/gui/auto_generated/qgsnewhttpconnection.sip.in index 7a1aa97cb88..88cf4c30510 100644 --- a/python/gui/auto_generated/qgsnewhttpconnection.sip.in +++ b/python/gui/auto_generated/qgsnewhttpconnection.sip.in @@ -97,6 +97,13 @@ Returns the "test connection" button. + Qgis::HttpMethod preferredHttpMethod() const; +%Docstring +Returns the selected preferred HTTP method. + +.. versionadded:: 3.44 +%End + virtual QString wfsSettingsKey( const QString &base, const QString &connectionName ) const; %Docstring diff --git a/src/core/qgsowsconnection.cpp b/src/core/qgsowsconnection.cpp index c12ac06886d..aca81c12dad 100644 --- a/src/core/qgsowsconnection.cpp +++ b/src/core/qgsowsconnection.cpp @@ -76,6 +76,7 @@ const QgsSettingsEntryString *QgsOwsConnection::settingsUsername = new QgsSettin const QgsSettingsEntryString *QgsOwsConnection::settingsPassword = new QgsSettingsEntryString( QStringLiteral( "password" ), sTreeOwsConnections ) ; const QgsSettingsEntryString *QgsOwsConnection::settingsAuthCfg = new QgsSettingsEntryString( QStringLiteral( "authcfg" ), sTreeOwsConnections ) ; const QgsSettingsEntryInteger *QgsOwsConnection::settingsFeatureCount = new QgsSettingsEntryInteger( QStringLiteral( "feature-count" ), sTreeOwsConnections, 10 ); +const QgsSettingsEntryEnumFlag *QgsOwsConnection::settingsPreferredHttpMethod = new QgsSettingsEntryEnumFlag( QStringLiteral( "http-method" ), sTreeOwsConnections, Qgis::HttpMethod::Get, QString() ); QgsOwsConnection::QgsOwsConnection( const QString &service, const QString &connName ) : mConnName( connName ) @@ -260,6 +261,24 @@ QgsDataSourceUri &QgsOwsConnection::addWfsConnectionSettings( QgsDataSourceUri & uri.setParam( QStringLiteral( "maxNumFeatures" ), maxnumFeatures ); } + const Qgis::HttpMethod httpMethod = settingsPreferredHttpMethod->value( {service.toLower(), connName} ); + switch ( httpMethod ) + { + case Qgis::HttpMethod::Get: + // default, we don't set to explicitly set + break; + + case Qgis::HttpMethod::Post: + uri.setParam( QStringLiteral( "httpMethod" ), QStringLiteral( "post" ) ); + break; + + case Qgis::HttpMethod::Head: + case Qgis::HttpMethod::Put: + case Qgis::HttpMethod::Delete: + // not supported + break; + } + return uri; } diff --git a/src/core/qgsowsconnection.h b/src/core/qgsowsconnection.h index 7f33f09190d..d00ef788f2c 100644 --- a/src/core/qgsowsconnection.h +++ b/src/core/qgsowsconnection.h @@ -116,6 +116,7 @@ class CORE_EXPORT QgsOwsConnection : public QObject static const QgsSettingsEntryString *settingsPassword; static const QgsSettingsEntryString *settingsAuthCfg; static const QgsSettingsEntryInteger *settingsFeatureCount; + static const QgsSettingsEntryEnumFlag *settingsPreferredHttpMethod; #endif diff --git a/src/gui/qgsmanageconnectionsdialog.cpp b/src/gui/qgsmanageconnectionsdialog.cpp index 59bed6444fd..e6c5e6042ed 100644 --- a/src/gui/qgsmanageconnectionsdialog.cpp +++ b/src/gui/qgsmanageconnectionsdialog.cpp @@ -527,6 +527,7 @@ QDomDocument QgsManageConnectionsDialog::saveWfsConnections( const QStringList & el.setAttribute( QStringLiteral( "invertAxisOrientation" ), QgsOwsConnection::settingsInvertAxisOrientation->value( { QStringLiteral( "wfs" ), connections[i] } ) ); el.setAttribute( QStringLiteral( "username" ), QgsOwsConnection::settingsUsername->value( { QStringLiteral( "wfs" ), connections[i] } ) ); el.setAttribute( QStringLiteral( "password" ), QgsOwsConnection::settingsPassword->value( { QStringLiteral( "wfs" ), connections[i] } ) ); + el.setAttribute( QStringLiteral( "httpMethod" ), QgsOwsConnection::settingsPreferredHttpMethod->value( { QStringLiteral( "wfs" ), connections[i] } ) == Qgis::HttpMethod::Post ? QStringLiteral( "post" ) : QStringLiteral( "get" ) ); root.appendChild( el ); } @@ -1080,6 +1081,7 @@ void QgsManageConnectionsDialog::loadWfsConnections( const QDomDocument &doc, co QgsOwsConnection::settingsPagingEnabled->setValue( child.attribute( QStringLiteral( "pagingenabled" ) ), { QStringLiteral( "wfs" ), connectionName } ); QgsOwsConnection::settingsIgnoreAxisOrientation->setValue( child.attribute( QStringLiteral( "ignoreAxisOrientation" ) ).toInt(), { QStringLiteral( "wfs" ), connectionName } ); QgsOwsConnection::settingsInvertAxisOrientation->setValue( child.attribute( QStringLiteral( "invertAxisOrientation" ) ).toInt(), { QStringLiteral( "wfs" ), connectionName } ); + QgsOwsConnection::settingsPreferredHttpMethod->setValue( child.attribute( QStringLiteral( "httpMethod" ) ).compare( QLatin1String( "post" ), Qt::CaseInsensitive ) == 0 ? Qgis::HttpMethod::Post : Qgis::HttpMethod::Get, { QStringLiteral( "wfs" ), connectionName } ); if ( !child.attribute( QStringLiteral( "username" ) ).isEmpty() ) { diff --git a/src/gui/qgsnewhttpconnection.cpp b/src/gui/qgsnewhttpconnection.cpp index 226b40802f8..3d67c435b30 100644 --- a/src/gui/qgsnewhttpconnection.cpp +++ b/src/gui/qgsnewhttpconnection.cpp @@ -89,6 +89,10 @@ QgsNewHttpConnection::QgsNewHttpConnection( QWidget *parent, ConnectionTypes typ cmbVersion->addItem( tr( "OGC API - Features" ) ); connect( cmbVersion, static_cast( &QComboBox::currentIndexChanged ), this, &QgsNewHttpConnection::wfsVersionCurrentIndexChanged ); + mComboHttpMethod->addItem( QStringLiteral( "GET" ), QVariant::fromValue( Qgis::HttpMethod::Get ) ); + mComboHttpMethod->addItem( QStringLiteral( "POST" ), QVariant::fromValue( Qgis::HttpMethod::Post ) ); + mComboHttpMethod->setCurrentIndex( mComboHttpMethod->findData( QVariant::fromValue( Qgis::HttpMethod::Get ) ) ); + cmbFeaturePaging->clear(); cmbFeaturePaging->addItem( tr( "Default (trust server capabilities)" ) ); cmbFeaturePaging->addItem( tr( "Enabled" ) ); @@ -287,6 +291,11 @@ QLineEdit *QgsNewHttpConnection::wfsPageSizeLineEdit() return txtPageSize; } +Qgis::HttpMethod QgsNewHttpConnection::preferredHttpMethod() const +{ + return mComboHttpMethod->currentData().value< Qgis::HttpMethod >(); +} + QString QgsNewHttpConnection::wfsSettingsKey( const QString &base, const QString &connectionName ) const { return base + connectionName; @@ -347,6 +356,7 @@ void QgsNewHttpConnection::updateServiceSpecificSettings() else cmbFeaturePaging->setCurrentIndex( static_cast( QgsNewHttpConnection::WfsFeaturePagingIndex::DEFAULT ) ); + mComboHttpMethod->setCurrentIndex( mComboHttpMethod->findData( QVariant::fromValue( QgsOwsConnection::settingsPreferredHttpMethod->value( detailsParameters ) ) ) ); txtPageSize->setText( QgsOwsConnection::settingsPagesize->value( detailsParameters ) ); } @@ -449,6 +459,7 @@ void QgsNewHttpConnection::accept() QgsOwsConnection::settingsVersion->setValue( version, detailsParameters ); QgsOwsConnection::settingsMaxNumFeatures->setValue( txtMaxNumFeatures->text(), detailsParameters ); QgsOwsConnection::settingsPagesize->setValue( txtPageSize->text(), detailsParameters ); + QgsOwsConnection::settingsPreferredHttpMethod->setValue( mComboHttpMethod->currentData().value< Qgis::HttpMethod >(), detailsParameters ); QString pagingEnabled = QStringLiteral( "default" ); switch ( cmbFeaturePaging->currentIndex() ) diff --git a/src/gui/qgsnewhttpconnection.h b/src/gui/qgsnewhttpconnection.h index 7567c5f332a..ab6a54337b3 100644 --- a/src/gui/qgsnewhttpconnection.h +++ b/src/gui/qgsnewhttpconnection.h @@ -169,6 +169,13 @@ class GUI_EXPORT QgsNewHttpConnection : public QDialog, private Ui::QgsNewHttpCo */ QLineEdit *wfsPageSizeLineEdit() SIP_SKIP; + /** + * Returns the selected preferred HTTP method. + * + * \since QGIS 3.44 + */ + Qgis::HttpMethod preferredHttpMethod() const; + /** * Returns the url. * \since QGIS 3.2 diff --git a/src/providers/wfs/qgswfsconnection.cpp b/src/providers/wfs/qgswfsconnection.cpp index 6ec5d242f3b..5e8f3b1dd88 100644 --- a/src/providers/wfs/qgswfsconnection.cpp +++ b/src/providers/wfs/qgswfsconnection.cpp @@ -18,7 +18,7 @@ #include "qgswfsconstants.h" #include "qgslogger.h" #include "qgssettingsentryimpl.h" - +#include "qgssettingsentryenumflag.h" static const QString SERVICE_WFS = QStringLiteral( "WFS" ); @@ -60,6 +60,27 @@ QgsWfsConnection::QgsWfsConnection( const QString &connName ) mUri.setParam( QgsWFSConstants::URI_PARAM_WFST_1_1_PREFER_COORDINATES, settingsPreferCoordinatesForWfsT11->value( detailsParameters ) ? QStringLiteral( "true" ) : QStringLiteral( "false" ) ); } + if ( settingsPreferredHttpMethod->exists( detailsParameters ) ) + { + mUri.removeParam( QgsWFSConstants::URI_PARAM_HTTPMETHOD ); // setParam allow for duplicates! + switch ( settingsPreferredHttpMethod->value( detailsParameters ) ) + { + case Qgis::HttpMethod::Get: + // default, we don't set to explicitly set + break; + + case Qgis::HttpMethod::Post: + mUri.setParam( QgsWFSConstants::URI_PARAM_HTTPMETHOD, QStringLiteral( "post" ) ); + break; + + case Qgis::HttpMethod::Head: + case Qgis::HttpMethod::Put: + case Qgis::HttpMethod::Delete: + // not supported + break; + } + } + QgsDebugMsgLevel( QStringLiteral( "WFS full uri: '%1'." ).arg( QString( mUri.uri() ) ), 4 ); } diff --git a/src/providers/wfs/qgswfsconstants.cpp b/src/providers/wfs/qgswfsconstants.cpp index 7713344c32d..94d1bd2e47b 100644 --- a/src/providers/wfs/qgswfsconstants.cpp +++ b/src/providers/wfs/qgswfsconstants.cpp @@ -44,5 +44,6 @@ const QString QgsWFSConstants::URI_PARAM_WFST_1_1_PREFER_COORDINATES( QStringLit const QString QgsWFSConstants::URI_PARAM_SKIP_INITIAL_GET_FEATURE( QStringLiteral( "skipInitialGetFeature" ) ); const QString QgsWFSConstants::URI_PARAM_GEOMETRY_TYPE_FILTER( QStringLiteral( "geometryTypeFilter" ) ); const QString QgsWFSConstants::URI_PARAM_SQL( QStringLiteral( "sql" ) ); +const QString QgsWFSConstants::URI_PARAM_HTTPMETHOD( QStringLiteral( "httpMethod" ) ); const QString QgsWFSConstants::VERSION_AUTO( QStringLiteral( "auto" ) ); diff --git a/src/providers/wfs/qgswfsconstants.h b/src/providers/wfs/qgswfsconstants.h index f918555f693..48eae12a561 100644 --- a/src/providers/wfs/qgswfsconstants.h +++ b/src/providers/wfs/qgswfsconstants.h @@ -52,6 +52,7 @@ struct QgsWFSConstants static const QString URI_PARAM_SKIP_INITIAL_GET_FEATURE; static const QString URI_PARAM_GEOMETRY_TYPE_FILTER; static const QString URI_PARAM_SQL; + static const QString URI_PARAM_HTTPMETHOD; // static const QString VERSION_AUTO; diff --git a/src/providers/wfs/qgswfsdataitemguiprovider.cpp b/src/providers/wfs/qgswfsdataitemguiprovider.cpp index e1b04845e06..2c6d54434ff 100644 --- a/src/providers/wfs/qgswfsdataitemguiprovider.cpp +++ b/src/providers/wfs/qgswfsdataitemguiprovider.cpp @@ -22,6 +22,7 @@ #include "qgswfsconstants.h" #include "qgswfsdataitems.h" #include "qgsdataitemguiproviderutils.h" +#include "qgssettingsentryenumflag.h" #include #include @@ -117,6 +118,8 @@ void QgsWfsDataItemGuiProvider::duplicateConnection( QgsDataItem *item ) QgsOwsConnection::settingsPagesize->setValue( QgsOwsConnection::settingsPagesize->value( detailsParameters ), newDetailsParameters ); QgsOwsConnection::settingsPagingEnabled->setValue( QgsOwsConnection::settingsPagingEnabled->value( detailsParameters ), newDetailsParameters ); + QgsOwsConnection::settingsPreferredHttpMethod->setValue( QgsOwsConnection::settingsPreferredHttpMethod->value( detailsParameters ), newDetailsParameters ); + QgsOwsConnection::settingsUsername->setValue( QgsOwsConnection::settingsUsername->value( detailsParameters ), newDetailsParameters ); QgsOwsConnection::settingsPassword->setValue( QgsOwsConnection::settingsPassword->value( detailsParameters ), newDetailsParameters ); QgsOwsConnection::settingsAuthCfg->setValue( QgsOwsConnection::settingsAuthCfg->value( detailsParameters ), newDetailsParameters ); diff --git a/src/providers/wfs/qgswfsdatasourceuri.cpp b/src/providers/wfs/qgswfsdatasourceuri.cpp index 4a7d0187806..ad1f1f701db 100644 --- a/src/providers/wfs/qgswfsdatasourceuri.cpp +++ b/src/providers/wfs/qgswfsdatasourceuri.cpp @@ -192,6 +192,7 @@ QSet QgsWFSDataSourceURI::unknownParamKeys() const QgsWFSConstants::URI_PARAM_SKIP_INITIAL_GET_FEATURE, QgsWFSConstants::URI_PARAM_GEOMETRY_TYPE_FILTER, QgsWFSConstants::URI_PARAM_SQL, + QgsWFSConstants::URI_PARAM_HTTPMETHOD }; QSet l_unknownParamKeys; @@ -418,6 +419,19 @@ void QgsWFSDataSourceURI::setOutputFormat( const QString &outputFormat ) mURI.setParam( QgsWFSConstants::URI_PARAM_OUTPUTFORMAT, outputFormat ); } +Qgis::HttpMethod QgsWFSDataSourceURI::httpMethod() const +{ + if ( !mURI.hasParam( QgsWFSConstants::URI_PARAM_HTTPMETHOD ) ) + return Qgis::HttpMethod::Get; + + const QString method = mURI.param( QgsWFSConstants::URI_PARAM_HTTPMETHOD ); + if ( method.compare( QLatin1String( "post" ), Qt::CaseInsensitive ) == 0 ) + return Qgis::HttpMethod::Post; + + // default + return Qgis::HttpMethod::Get; +} + bool QgsWFSDataSourceURI::isRestrictedToRequestBBOX() const { if ( mURI.hasParam( QgsWFSConstants::URI_PARAM_RESTRICT_TO_REQUEST_BBOX ) && mURI.param( QgsWFSConstants::URI_PARAM_RESTRICT_TO_REQUEST_BBOX ).toInt() == 1 ) diff --git a/src/providers/wfs/qgswfsdatasourceuri.h b/src/providers/wfs/qgswfsdatasourceuri.h index ee7fbeee930..db00313ed36 100644 --- a/src/providers/wfs/qgswfsdatasourceuri.h +++ b/src/providers/wfs/qgswfsdatasourceuri.h @@ -111,6 +111,9 @@ class QgsWFSDataSourceURI //! Sets GetFeature output format void setOutputFormat( const QString &outputFormat ); + //! Returns the preferred HTTP method for requests + Qgis::HttpMethod httpMethod() const; + //! Returns whether GetFeature request should include the request bounding box. Defaults to false bool isRestrictedToRequestBBOX() const; diff --git a/src/ui/qgsnewhttpconnectionbase.ui b/src/ui/qgsnewhttpconnectionbase.ui index 2150ab4931a..275f8fa2716 100644 --- a/src/ui/qgsnewhttpconnectionbase.ui +++ b/src/ui/qgsnewhttpconnectionbase.ui @@ -111,6 +111,16 @@ + + + + Preferred HTTP method + + + + + + @@ -380,6 +390,7 @@ txtUrl cmbVersion mWfsVersionDetectButton + mComboHttpMethod txtMaxNumFeatures cmbFeaturePaging txtPageSize