From b979e4ddf09636de95f6b307690f1ee1dd3e3b75 Mon Sep 17 00:00:00 2001 From: Nick Forbes-Smith Date: Fri, 1 Dec 2023 16:22:46 +1100 Subject: [PATCH 1/3] drop bad query params from WMS GetCapability --- CHANGES.md | 1 + .../Catalog/Ows/WebMapServiceCatalogItem.ts | 50 +++++++++------ .../Ows/WebMapServiceCatalogItemSpec.ts | 64 ++++++++++++------- 3 files changed, 72 insertions(+), 43 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index aec2ec356da..0bd33000e18 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -3,6 +3,7 @@ #### next release (8.4.1) - Fix a bug where `DragPoints` was interfering with pedstrian mode mouse movements. +- `WebMapServiceCatalogItem` will drop problematic query parameters from `url` when calling `GetCapabilities` (eg `"styles","version","format","srs","crs","format"`) - [The next improvement] #### 8.4.0 - 2023-12-01 diff --git a/lib/Models/Catalog/Ows/WebMapServiceCatalogItem.ts b/lib/Models/Catalog/Ows/WebMapServiceCatalogItem.ts index 7e768e53cc2..44ae738148d 100644 --- a/lib/Models/Catalog/Ows/WebMapServiceCatalogItem.ts +++ b/lib/Models/Catalog/Ows/WebMapServiceCatalogItem.ts @@ -45,6 +45,7 @@ import CreateModel from "../../Definition/CreateModel"; import LoadableStratum from "../../Definition/LoadableStratum"; import { BaseModel } from "../../Definition/Model"; import StratumOrder from "../../Definition/StratumOrder"; +import TerriaFeature from "../../Feature/Feature"; import FeatureInfoContext from "../../Feature/FeatureInfoContext"; import SelectableDimensions, { SelectableDimensionEnum @@ -54,7 +55,23 @@ import proxyCatalogItemUrl from "../proxyCatalogItemUrl"; import WebMapServiceCapabilities from "./WebMapServiceCapabilities"; import WebMapServiceCapabilitiesStratum from "./WebMapServiceCapabilitiesStratum"; import WebMapServiceCatalogGroup from "./WebMapServiceCatalogGroup"; -import TerriaFeature from "../../Feature/Feature"; + +// Remove problematic query parameters from URLs (GetCapabilities, GetMap, ...) - these are handled separately +const QUERY_PARAMETERS_TO_REMOVE = [ + "request", + "service", + "x", + "y", + "width", + "height", + "bbox", + "layers", + "styles", + "version", + "format", + "srs", + "crs" +]; /** This LoadableStratum is responsible for setting WMS version based on CatalogItem.url */ export class WebMapServiceUrlStratum extends LoadableStratum( @@ -288,8 +305,16 @@ class WebMapServiceCatalogItem protected get defaultGetCapabilitiesUrl(): string | undefined { if (this.uri) { - return this.uri - .clone() + const baseUrl = QUERY_PARAMETERS_TO_REMOVE.reduce( + (url, parameter) => + url + .removeQuery(parameter) + .removeQuery(parameter.toUpperCase()) + .removeQuery(parameter.toLowerCase()), + this.uri.clone() + ); + + return baseUrl .setSearch({ service: "WMS", version: this.useWmsVersion130 ? "1.3.0" : "1.1.1", @@ -540,23 +565,8 @@ class WebMapServiceCatalogItem Object.assign(parameters, diffModeParameters); // Remove problematic query parameters from URL - these are handled by the parameters objects - const queryParametersToRemove = [ - "request", - "service", - "x", - "y", - "width", - "height", - "bbox", - "layers", - "styles", - "version", - "format", - "srs", - "crs" - ]; - - const baseUrl = queryParametersToRemove.reduce( + + const baseUrl = QUERY_PARAMETERS_TO_REMOVE.reduce( (url, parameter) => url .removeQuery(parameter) diff --git a/test/Models/Catalog/Ows/WebMapServiceCatalogItemSpec.ts b/test/Models/Catalog/Ows/WebMapServiceCatalogItemSpec.ts index 2bc8bdde6a6..a5f0e7a9b10 100644 --- a/test/Models/Catalog/Ows/WebMapServiceCatalogItemSpec.ts +++ b/test/Models/Catalog/Ows/WebMapServiceCatalogItemSpec.ts @@ -10,32 +10,50 @@ import Terria from "../../../../lib/Models/Terria"; import TerriaFeature from "../../../../lib/Models/Feature/Feature"; describe("WebMapServiceCatalogItem", function () { - it("derives getCapabilitiesUrl from url if getCapabilitiesUrl is not specified", function () { - const terria = new Terria(); - const wms = new WebMapServiceCatalogItem("test", terria); - wms.setTrait("definition", "url", "foo.bar.baz"); - expect(wms.getCapabilitiesUrl).toBeDefined(); - expect(wms.url).toBeDefined(); - expect( - wms.getCapabilitiesUrl && - wms.getCapabilitiesUrl.indexOf(wms.url || "undefined") === 0 - ).toBe(true); + describe("derives getCapabilitiesUrl from url", () => { + it("if getCapabilitiesUrl is not specified", function () { + const terria = new Terria(); + const wms = new WebMapServiceCatalogItem("test", terria); + wms.setTrait("definition", "url", "foo.bar.baz"); + expect(wms.getCapabilitiesUrl).toBeDefined(); + expect(wms.url).toBeDefined(); + expect( + wms.getCapabilitiesUrl && + wms.getCapabilitiesUrl.indexOf(wms.url || "undefined") === 0 + ).toBe(true); - expect(wms.useWmsVersion130).toBeTruthy(); - }); + expect(wms.useWmsVersion130).toBeTruthy(); + }); - it("derives getCapabilitiesUrl from url - for WMS 1.1.1", function () { - const terria = new Terria(); - const wms = new WebMapServiceCatalogItem("test", terria); - wms.setTrait( - "definition", - "url", - "http://www.bom.gov.au/cgi-bin/ws/gis/ncc/cdio/wxs?service=WMS&version=1.1.1&request=GetCapabilities" - ); - expect(wms.getCapabilitiesUrl).toBeDefined(); - expect(wms.url).toBeDefined(); + it("for WMS 1.1.1", function () { + const terria = new Terria(); + const wms = new WebMapServiceCatalogItem("test", terria); + wms.setTrait( + "definition", + "url", + "http://www.bom.gov.au/cgi-bin/ws/gis/ncc/cdio/wxs?service=WMS&version=1.1.1&request=GetCapabilities" + ); + expect(wms.getCapabilitiesUrl).toBeDefined(); + expect(wms.url).toBeDefined(); - expect(wms.useWmsVersion130).toBeFalsy(); + expect(wms.useWmsVersion130).toBeFalsy(); + }); + + it("drops query bad parameters", function () { + const terria = new Terria(); + const wms = new WebMapServiceCatalogItem("test", terria); + wms.setTrait( + "definition", + "url", + "http://www.bom.gov.au/cgi-bin/ws/gis/ncc/cdio/wxs?service=WMS&version=1.1.1&request=GetMap&format=something&allowed=yes" + ); + expect(wms.getCapabilitiesUrl).toBeDefined(); + expect(wms.url).toBeDefined(); + + const queryParameters = new URL(wms.getCapabilitiesUrl!).searchParams; + expect(queryParameters.get("format")).toBeNull(); + expect(queryParameters.get("allowed")).toBe("yes"); + }); }); it("loads", function () { From a62e587a869469d8349a06cb3b833baa59c9c15f Mon Sep 17 00:00:00 2001 From: Nick Forbes-Smith Date: Fri, 15 Dec 2023 16:11:26 +1100 Subject: [PATCH 2/3] fix CHANGES --- CHANGES.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 80dc4ab18d2..f961fbf3e11 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -2,13 +2,12 @@ #### next release (8.5.0) -- Fix a bug where `DragPoints` was interfering with pedstrian mode mouse movements. -- `WebMapServiceCatalogItem` will drop problematic query parameters from `url` when calling `GetCapabilities` (eg `"styles","version","format","srs","crs","format"`) - **Breaking changes:** - Upgrade TypeScript to 5.2 - Switch Babel configuration to new JSX transform - Improve tsconfig files - Update `thredds-catalog-crawler` to `0.0.6` +- `WebMapServiceCatalogItem` will drop problematic query parameters from `url` when calling `GetCapabilities` (eg `"styles","version","format","srs","crs","format"`) - [The next improvement] #### 8.4.1 - 2023-12-08 From 90cf6b4cc4996d030c8bd8afae14a11559dcf2fe Mon Sep 17 00:00:00 2001 From: Nick Forbes-Smith Date: Fri, 15 Dec 2023 16:21:12 +1100 Subject: [PATCH 3/3] update changes again --- CHANGES.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index f961fbf3e11..e7d0fe15cb2 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -7,7 +7,7 @@ - Switch Babel configuration to new JSX transform - Improve tsconfig files - Update `thredds-catalog-crawler` to `0.0.6` -- `WebMapServiceCatalogItem` will drop problematic query parameters from `url` when calling `GetCapabilities` (eg `"styles","version","format","srs","crs","format"`) +- `WebMapServiceCatalogItem` will drop problematic query parameters from `url` when calling `GetCapabilities` (eg `"styles","srs","crs","format"`) - [The next improvement] #### 8.4.1 - 2023-12-08