Skip to content

Commit

Permalink
Merge pull request #6995 from TerriaJS/wms-getcap-drop-params
Browse files Browse the repository at this point in the history
Drop bad query params from WMS GetCapabilities
  • Loading branch information
nf-s committed Dec 15, 2023
2 parents f6739a7 + 90cf6b4 commit 0f202bc
Show file tree
Hide file tree
Showing 3 changed files with 72 additions and 43 deletions.
1 change: 1 addition & 0 deletions CHANGES.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +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","srs","crs","format"`)
- [The next improvement]

#### 8.4.1 - 2023-12-08
Expand Down
50 changes: 30 additions & 20 deletions lib/Models/Catalog/Ows/WebMapServiceCatalogItem.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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(
Expand Down Expand Up @@ -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",
Expand Down Expand Up @@ -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)
Expand Down
64 changes: 41 additions & 23 deletions test/Models/Catalog/Ows/WebMapServiceCatalogItemSpec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 () {
Expand Down

0 comments on commit 0f202bc

Please sign in to comment.