Skip to content

Commit 32fcb27

Browse files
committed
PB-1383: Work partially for check external layers providers.
1 parent 4a5b4df commit 32fcb27

File tree

3 files changed

+37
-118
lines changed

3 files changed

+37
-118
lines changed

packages/viewer/scripts/check-external-layers-providers.ts

Lines changed: 32 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#!./node_modules/.bin/vite-node --script
22

3+
34
import { JSDOM } from 'jsdom'
45

56
// faking browser support, so that OpenLayers has what it requires to parse XMLs
@@ -10,10 +11,9 @@ global.Node = dom.window.Node
1011
import { LV95 } from '@swissgeo/coordinates'
1112
import {
1213
EXTERNAL_SERVER_TIMEOUT,
13-
parseWmsCapabilities,
14-
parseWmtsCapabilities,
1514
setWmsGetMapParams,
1615
} from '@swissgeo/layers/api'
16+
import { wmsCapabilitiesParser, wmtsCapabilitiesParser } from '@swissgeo/layers/parsers'
1717
import axios, { AxiosError } from 'axios'
1818
import axiosRetry from 'axios-retry'
1919
import { promises as fs } from 'fs'
@@ -108,18 +108,16 @@ async function checkProviderGetMapTile(provider: string, capabilitiesResponse: a
108108

109109
async function handleWms(provider: string, content: string, result: any): Promise<boolean> {
110110
let isProviderMapValid = true
111-
const capabilities = parseWmsCapabilities(content) as any
112-
const layers = capabilities.getAllExternalLayerObjects(
113-
LV95,
114-
1, // opacity
115-
true, // visible
116-
false // throw error in case of an error
117-
)
111+
const capabilities = wmsCapabilitiesParser.parse(content, new URL(provider)) as any
112+
const layers = wmsCapabilitiesParser.getAllExternalLayers(capabilities, {
113+
outputProjection: LV95,
114+
initialValues: { opacity: 1, isVisible: true },
115+
})
118116

119117
const firstLeaf = findFirstLeaf(layers)
120-
const finding = capabilities.findLayer(firstLeaf.id)
118+
const capabilitiesLayer = wmsCapabilitiesParser.getCapabilitiesLayer(capabilities, firstLeaf.id)
121119
const crs = capabilities.Capability.Layer.CRS[0]
122-
const style = finding.layer?.Style ? finding.layer?.Style[0]?.Name : 'default'
120+
const style = capabilitiesLayer?.Style ? capabilitiesLayer?.Style[0]?.Identifier : 'default'
123121
const getCapabilitiesUrl =
124122
capabilities.Capability.Request.GetCapabilities.DCPType[0].HTTP.Get.OnlineResource
125123

@@ -131,16 +129,16 @@ async function handleWms(provider: string, content: string, result: any): Promis
131129
.filter((url: string) => getCapabilitiesUrl !== url)
132130

133131
for (const getMapUrl of getMapUrls) {
134-
const url = setWmsGetMapParams(new URL(getMapUrl), firstLeaf.id, crs, style).toString()
132+
const url = setWmsGetMapParams(new URL(getMapUrl), firstLeaf.id, crs, style!).toString()
135133

136134
try {
137-
const { responseGetMap, redirectHeaders } = await fetchMapTile(url, provider)
135+
const { response, redirectHeaders } = await fetchMapTile(url, provider)
138136
isProviderMapValid =
139137
isProviderMapValid &&
140138
(await checkProviderResponse(
141139
provider,
142140
url,
143-
responseGetMap,
141+
response,
144142
result,
145143
redirectHeaders,
146144
checkProviderResponseContentGetMap
@@ -156,13 +154,11 @@ async function handleWms(provider: string, content: string, result: any): Promis
156154

157155
async function handleWmts(provider: string, content: string, result: any): Promise<boolean> {
158156
let isProviderGetTileValid = true
159-
const capabilities = parseWmtsCapabilities(content, new URL(provider)) as any
160-
const layers = capabilities.getAllExternalLayerObjects(
161-
LV95,
162-
1, // opacity
163-
true, // visible
164-
false // throw error in case of an error
165-
)
157+
const capabilities = wmtsCapabilitiesParser.parse(content, new URL(provider)) as any
158+
const layers = wmtsCapabilitiesParser.getAllExternalLayers(capabilities, {
159+
outputProjection: LV95,
160+
initialValues: { opacity: 1, isVisible: true },
161+
})
166162

167163
const exampleLayer = findFirstLeaf(layers)
168164
const getTileUrlWithPlaceholders = exampleLayer.urlTemplate
@@ -233,7 +229,7 @@ async function fetchMapTile(url: string, provider: string): Promise<any> {
233229
)
234230
}
235231

236-
return { response, responseGetMap: response, redirectHeaders }
232+
return { response, redirectHeaders }
237233
}
238234

239235
function createErrorEntry(provider: string, url: string, error: Error, content: string): any {
@@ -346,7 +342,7 @@ async function checkProviderResponse(
346342
url: url,
347343
status: response.status,
348344
})
349-
} else if (!response.headers.hasOwnProperty('access-control-allow-origin')) {
345+
} else if (!response.headers.has('access-control-allow-origin')) {
350346
console.error(
351347
`Provider ${provider} does not support CORS: status=${response.status}, ` +
352348
`missing access-control-allow-origin header`
@@ -355,7 +351,7 @@ async function checkProviderResponse(
355351
provider: provider,
356352
url: url,
357353
status: response.status,
358-
headers: response.headers,
354+
headers: response.headers.toJSON(),
359355
})
360356
} else if (redirectHeaders.some((header) => !header['access-control-allow-origin'])) {
361357
console.error(
@@ -371,19 +367,19 @@ async function checkProviderResponse(
371367
})
372368
} else if (
373369
!['*', 'https://map.geo.admin.ch'].includes(
374-
response.headers['access-control-allow-origin']?.toString()?.trim()
370+
response.headers.get('access-control-allow-origin').toString()?.trim()
375371
)
376372
) {
377373
console.error(
378374
`Provider ${provider} does not have geoadmin in its CORS: status=${
379375
response.status
380-
}, Access-Control-Allow-Origin=${response.headers['access-control-allow-origin']}`
376+
}, Access-Control-Allow-Origin=${response.headers.get('access-control-allow-origin')}`
381377
)
382378
result.invalid_cors.push({
383379
provider: provider,
384380
url: url,
385381
status: response.status,
386-
headers: response.headers,
382+
headers: response.headers.toJSON(),
387383
})
388384
} else if (await checkContentFnc(provider, url, response, result)) {
389385
console.log(`Provider ${provider} is OK`)
@@ -394,19 +390,17 @@ async function checkProviderResponse(
394390

395391
function checkProviderResponseContent(provider: string, url: string, response: any, result: any): boolean {
396392
const content = response.data
397-
const parseCapabilities = (isCapFn: any, parseFn: any, type: string, result: any, resultArray: string): boolean => {
393+
const parseCapabilities = (isCapFn: any, parser: any, type: string, result: any, resultArray: string): boolean => {
398394
if (!isCapFn(content)) {
399395
return false
400396
}
401397

402398
try {
403-
const capabilities = parseFn(content, new URL(url))
404-
const layers = capabilities.getAllExternalLayerObjects(
405-
LV95,
406-
1, // opacity
407-
true, // visible
408-
false // throw Error in case of error
409-
)
399+
const capabilities = parser.parse(content, new URL(url))
400+
const layers = parser.getAllExternalLayers(capabilities, {
401+
outputProjection: LV95,
402+
initialValues: { opacity: 1, isVisible: true },
403+
})
410404

411405
if (layers.length === 0) {
412406
throw new Error(`No valid ${type} layers found`)
@@ -424,8 +418,8 @@ function checkProviderResponseContent(provider: string, url: string, response: a
424418
return true
425419
}
426420
if (
427-
parseCapabilities(isWmsGetCap, parseWmsCapabilities, 'WMS', result, 'invalid_wms') ||
428-
parseCapabilities(isWmtsGetCap, parseWmtsCapabilities, 'WMTS', result, 'invalid_wmts')
421+
parseCapabilities(isWmsGetCap, wmsCapabilitiesParser, 'WMS', result, 'invalid_wms') ||
422+
parseCapabilities(isWmtsGetCap, wmtsCapabilitiesParser, 'WMTS', result, 'invalid_wmts')
429423
) {
430424
return true
431425
}
@@ -434,7 +428,6 @@ function checkProviderResponseContent(provider: string, url: string, response: a
434428
result.invalid_content.push({
435429
provider,
436430
url,
437-
error: 'file type not recognized',
438431
content: content.slice(0, SIZE_OF_CONTENT_DISPLAY),
439432
})
440433
return false
@@ -546,4 +539,4 @@ async function main(): Promise<void> {
546539
}
547540
}
548541

549-
void main().then(() => exit())
542+
void main().then(() => exit())

packages/viewer/src/modules/menu/components/advancedTools/ImportCatalogue/utils.js

Lines changed: 0 additions & 59 deletions
This file was deleted.

packages/viewer/src/modules/menu/components/advancedTools/ImportCatalogue/utils.ts

Lines changed: 5 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import { setWmsGetCapabilitiesParams, setWmtsGetCapParams } from '@swissgeo/layers/api'
2+
13
/**
24
* Checks if file has WMS Capabilities XML content
35
*/
@@ -34,29 +36,12 @@ export function isWmtsUrl(url: string): boolean {
3436
* @returns Url object with backend parameters (eg. SERVICE=WMS, ...)
3537
*/
3638
export function guessExternalLayerUrl(provider: string, language: string): URL {
37-
// Note: setWmsGetCapParams and setWmtsGetCapParams would need to be migrated too
38-
// For now, just return a basic URL construction
39-
const url = new URL(provider)
40-
4139
if (isWmtsUrl(provider)) {
42-
// Add WMTS parameters
43-
url.searchParams.set('SERVICE', 'WMTS')
44-
url.searchParams.set('REQUEST', 'GetCapabilities')
45-
url.searchParams.set('lang', language)
46-
return url
40+
return setWmtsGetCapParams(new URL(provider), language)
4741
}
48-
4942
if (isWmsUrl(provider)) {
50-
// Add WMS parameters
51-
url.searchParams.set('SERVICE', 'WMS')
52-
url.searchParams.set('REQUEST', 'GetCapabilities')
53-
url.searchParams.set('lang', language)
54-
return url
43+
return setWmsGetCapabilitiesParams(new URL(provider), language)
5544
}
56-
5745
// By default if the URL service type cannot be guessed we use WMS
58-
url.searchParams.set('SERVICE', 'WMS')
59-
url.searchParams.set('REQUEST', 'GetCapabilities')
60-
url.searchParams.set('lang', language)
61-
return url
46+
return setWmsGetCapabilitiesParams(new URL(provider), language)
6247
}

0 commit comments

Comments
 (0)