Skip to content

Commit

Permalink
Fixes incorrect use of GET for WMS queries when admin setting has `…
Browse files Browse the repository at this point in the history
…CLIENT_OWS_METHOD = 'POST'` (#617)

* 🐛 Fix http method to query request based on ows_method

* 🐛 Fix layer variable

* 💡 Comments

* refactor `ProviderFactory.build` and `WMSDataProvider.query`

* depends on: https://github.com/g3w-suite/g3w-admin/tree/absolute-baseurl

* move custom `getOwsMethod` check into `ImageLayer`

* comments

* hotfix for invalid `baseurl`

* 🎨 Clean code. Readability and console.warn(e) in case of fail request

* BACKOMP for: `initiConfig.group` → `initiConfig`

depends on: g3w-suite/g3w-admin@9093bbc

* 🐛 Replace $.get $.post with XHR.get or XHR.post

* cjs to esm imports

* move `WFSDataProvider::_doRequest` into `WFSDataProvider::query`

* avoid using a provider factory for `this.providers`

* fix mutating `const` variable

* missing iife

* remove `handleQueryResponseFromServer`

* remove `getQueryResponseTimeoutKey`

* refactor `WFSDataProvider`

---------

Co-authored-by: Raruto <Raruto@users.noreply.github.com>
  • Loading branch information
volterra79 and Raruto committed May 6, 2024
1 parent 06522e0 commit 5fdc791
Show file tree
Hide file tree
Showing 6 changed files with 349 additions and 608 deletions.
15 changes: 15 additions & 0 deletions src/app/core/layers/imagelayer.js
Original file line number Diff line number Diff line change
Expand Up @@ -467,6 +467,21 @@ proto.getFormat = function() {
return base(this, 'getFormat');
};

/**
* @override ImageLayer~getOwsMethod
*
* @see https://github.com/g3w-suite/g3w-client/issues/616
*
* forces to `GET` when wms layer is external or query url isn't a qgis server endpoint (ie. doesn't start with `/ows/`).
*
* @since 3.10.0
*/
proto.getOwsMethod = function() {
return this.isExternalWMS() || !/^\/ows/.test((new URL(this.getQueryUrl(), window.initConfig.baseurl)).pathname)
? 'GET'
: this.config.ows_method;
};

ImageLayer.WMSServerTypes = [
Layer.ServerTypes.QGIS,
Layer.ServerTypes.Mapserver,
Expand Down
115 changes: 95 additions & 20 deletions src/app/core/layers/layer.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ const {
XHR,
} = require('utils');
const G3WObject = require('core/g3wobject');
const ProviderFactory = require('core/layers/providersfactory');
const Providers = require('core/layers/providersfactory');
const deprecate = require('util-deprecate');

// Base Class of all Layer
Expand Down Expand Up @@ -189,27 +189,102 @@ function Layer(config={}, options={}) {
// referred to (layersstore);
this._layersstore = config.layersstore || null;

/*
Providers that layer can use
const layerType = `${this.config.servertype} ${this.config.source && this.config.source.type}`;

Three type of provider:
1 - query
2 - filter
3 - data -- raw data del layer (editing)
/**
* Layer providers used to retrieve layer data from server
*
* 1 - data: raw layer data (editing)
* 2 - filter
* 3 - filtertoken
* 4 - query
* 5 - search
*/
const serverType = this.config.servertype;
const sourceType = this.config.source ? this.config.source.type : null; // NB: sourceType = source of layer

if (serverType && sourceType) {
//set providers that will take in account to get data from server
this.providers = {
query: ProviderFactory.build('query', serverType, sourceType, { layer: this }),
filter: ProviderFactory.build('filter', serverType, sourceType, { layer: this }),
filtertoken: ProviderFactory.build('filtertoken', serverType, sourceType, { layer: this }),
search: ProviderFactory.build('search', serverType, sourceType, { layer: this }),
data: ProviderFactory.build('data', serverType, sourceType, { layer: this })
};
}
this.providers = {

data: (() => {
if ([
'QGIS virtual',
'QGIS postgres',
'QGIS oracle',
'QGIS mssql',
'QGIS spatialite',
'QGIS ogr',
'QGIS delimitedtext',
'QGIS wfs',
].includes(layerType)) {
return new Providers.qgis({ layer: this });
}
if ('G3WSUITE geojson' === layerType) {
return new Providers.geojson({ layer: this });
}
})(),

filter: [
'QGIS virtual',
'QGIS postgres',
'QGIS oracle',
'QGIS mssql',
'QGIS spatialite',
'QGIS ogr',
'QGIS delimitedtext',
'QGIS wfs',
'QGIS wmst',
'QGIS wcs',
'QGIS wms',
].includes(layerType) && new Providers.wfs({ layer: this }),

filtertoken: [
'QGIS virtual',
'QGIS postgres',
'QGIS oracle',
'QGIS mssql',
'QGIS spatialite',
'QGIS ogr',
'QGIS delimitedtext',
].includes(layerType) && new Providers.qgis({ layer: this }),

query: (() => {
if ([
'QGIS virtual',
'QGIS postgres',
'QGIS oracle',
'QGIS mssql',
'QGIS spatialite',
'QGIS ogr',
'QGIS delimitedtext',
'QGIS wfs',
'QGIS wmst',
'QGIS wcs',
'QGIS wms',
'QGIS gdal',
/** @since 3.9.0 */
'QGIS postgresraster',
'QGIS vector-tile',
'QGIS vectortile',
'QGIS arcgismapserver',
'QGIS mdal',
'OGC wms',
].includes(layerType)) {
return new Providers.wms({ layer: this });
}
if ('G3WSUITE geojson' === layerType) {
return new Providers.geojson({ layer: this });
}
})(),

search: [
'QGIS virtual',
'QGIS postgres',
'QGIS oracle',
'QGIS mssql',
'QGIS spatialite',
'QGIS ogr',
'QGIS delimitedtext',
'QGIS wfs',
].includes(layerType) && new Providers.qgis({ layer: this }),

};

/**
* Store last proxy params (useful for repeat request info formats for wms external layer)
Expand Down

0 comments on commit 5fdc791

Please sign in to comment.