@itwin/core-frontend 5.16.0-dev.4 → 5.16.0-dev.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (134) hide show
  1. package/CHANGELOG.md +9 -1
  2. package/lib/cjs/core-frontend.d.ts +1 -1
  3. package/lib/cjs/core-frontend.d.ts.map +1 -1
  4. package/lib/cjs/core-frontend.js +3 -2
  5. package/lib/cjs/core-frontend.js.map +1 -1
  6. package/lib/cjs/internal/cross-package.d.ts +1 -1
  7. package/lib/cjs/internal/cross-package.d.ts.map +1 -1
  8. package/lib/cjs/internal/cross-package.js +4 -1
  9. package/lib/cjs/internal/cross-package.js.map +1 -1
  10. package/lib/cjs/internal/tile/map/ArcGisUtilities.d.ts +15 -2
  11. package/lib/cjs/internal/tile/map/ArcGisUtilities.d.ts.map +1 -1
  12. package/lib/cjs/internal/tile/map/ArcGisUtilities.js +54 -29
  13. package/lib/cjs/internal/tile/map/ArcGisUtilities.js.map +1 -1
  14. package/lib/cjs/internal/tile/map/ImageryProviders/ArcGISImageryProvider.d.ts +14 -0
  15. package/lib/cjs/internal/tile/map/ImageryProviders/ArcGISImageryProvider.d.ts.map +1 -1
  16. package/lib/cjs/internal/tile/map/ImageryProviders/ArcGISImageryProvider.js +91 -45
  17. package/lib/cjs/internal/tile/map/ImageryProviders/ArcGISImageryProvider.js.map +1 -1
  18. package/lib/cjs/internal/tile/map/ImageryProviders/ArcGISMapLayerImageryProvider.d.ts.map +1 -1
  19. package/lib/cjs/internal/tile/map/ImageryProviders/ArcGISMapLayerImageryProvider.js +5 -4
  20. package/lib/cjs/internal/tile/map/ImageryProviders/ArcGISMapLayerImageryProvider.js.map +1 -1
  21. package/lib/cjs/internal/tile/map/ImageryProviders/WmsMapLayerImageryProvider.d.ts.map +1 -1
  22. package/lib/cjs/internal/tile/map/ImageryProviders/WmsMapLayerImageryProvider.js +8 -2
  23. package/lib/cjs/internal/tile/map/ImageryProviders/WmsMapLayerImageryProvider.js.map +1 -1
  24. package/lib/cjs/internal/tile/map/ImageryProviders/WmtsMapLayerImageryProvider.d.ts.map +1 -1
  25. package/lib/cjs/internal/tile/map/ImageryProviders/WmtsMapLayerImageryProvider.js +8 -2
  26. package/lib/cjs/internal/tile/map/ImageryProviders/WmtsMapLayerImageryProvider.js.map +1 -1
  27. package/lib/cjs/internal/tile/map/MapLayerFetch.d.ts +57 -0
  28. package/lib/cjs/internal/tile/map/MapLayerFetch.d.ts.map +1 -0
  29. package/lib/cjs/internal/tile/map/MapLayerFetch.js +95 -0
  30. package/lib/cjs/internal/tile/map/MapLayerFetch.js.map +1 -0
  31. package/lib/cjs/internal/tile/map/UrlUtils.js +1 -1
  32. package/lib/cjs/internal/tile/map/UrlUtils.js.map +1 -1
  33. package/lib/cjs/internal/tile/map/WmsCapabilities.d.ts +2 -5
  34. package/lib/cjs/internal/tile/map/WmsCapabilities.d.ts.map +1 -1
  35. package/lib/cjs/internal/tile/map/WmsCapabilities.js +16 -9
  36. package/lib/cjs/internal/tile/map/WmsCapabilities.js.map +1 -1
  37. package/lib/cjs/internal/tile/map/WmsUtilities.d.ts +29 -1
  38. package/lib/cjs/internal/tile/map/WmsUtilities.d.ts.map +1 -1
  39. package/lib/cjs/internal/tile/map/WmsUtilities.js +43 -11
  40. package/lib/cjs/internal/tile/map/WmsUtilities.js.map +1 -1
  41. package/lib/cjs/internal/tile/map/WmtsCapabilities.d.ts +2 -5
  42. package/lib/cjs/internal/tile/map/WmtsCapabilities.d.ts.map +1 -1
  43. package/lib/cjs/internal/tile/map/WmtsCapabilities.js +16 -9
  44. package/lib/cjs/internal/tile/map/WmtsCapabilities.js.map +1 -1
  45. package/lib/cjs/tile/internal.d.ts +2 -0
  46. package/lib/cjs/tile/internal.d.ts.map +1 -1
  47. package/lib/cjs/tile/internal.js +2 -0
  48. package/lib/cjs/tile/internal.js.map +1 -1
  49. package/lib/cjs/tile/map/MapLayerFetchHandler.d.ts +94 -0
  50. package/lib/cjs/tile/map/MapLayerFetchHandler.d.ts.map +1 -0
  51. package/lib/cjs/tile/map/MapLayerFetchHandler.js +10 -0
  52. package/lib/cjs/tile/map/MapLayerFetchHandler.js.map +1 -0
  53. package/lib/cjs/tile/map/MapLayerFormatRegistry.d.ts +27 -1
  54. package/lib/cjs/tile/map/MapLayerFormatRegistry.d.ts.map +1 -1
  55. package/lib/cjs/tile/map/MapLayerFormatRegistry.js +42 -1
  56. package/lib/cjs/tile/map/MapLayerFormatRegistry.js.map +1 -1
  57. package/lib/cjs/tile/map/MapLayerImageryFormats.d.ts.map +1 -1
  58. package/lib/cjs/tile/map/MapLayerImageryFormats.js +20 -4
  59. package/lib/cjs/tile/map/MapLayerImageryFormats.js.map +1 -1
  60. package/lib/cjs/tile/map/MapLayerImageryProvider.d.ts +28 -16
  61. package/lib/cjs/tile/map/MapLayerImageryProvider.d.ts.map +1 -1
  62. package/lib/cjs/tile/map/MapLayerImageryProvider.js +134 -66
  63. package/lib/cjs/tile/map/MapLayerImageryProvider.js.map +1 -1
  64. package/lib/cjs/tile/map/MapLayerSources.d.ts +19 -4
  65. package/lib/cjs/tile/map/MapLayerSources.d.ts.map +1 -1
  66. package/lib/cjs/tile/map/MapLayerSources.js +28 -11
  67. package/lib/cjs/tile/map/MapLayerSources.js.map +1 -1
  68. package/lib/esm/core-frontend.d.ts +1 -1
  69. package/lib/esm/core-frontend.d.ts.map +1 -1
  70. package/lib/esm/core-frontend.js +1 -1
  71. package/lib/esm/core-frontend.js.map +1 -1
  72. package/lib/esm/internal/cross-package.d.ts +1 -1
  73. package/lib/esm/internal/cross-package.d.ts.map +1 -1
  74. package/lib/esm/internal/cross-package.js +1 -1
  75. package/lib/esm/internal/cross-package.js.map +1 -1
  76. package/lib/esm/internal/tile/map/ArcGisUtilities.d.ts +15 -2
  77. package/lib/esm/internal/tile/map/ArcGisUtilities.d.ts.map +1 -1
  78. package/lib/esm/internal/tile/map/ArcGisUtilities.js +55 -30
  79. package/lib/esm/internal/tile/map/ArcGisUtilities.js.map +1 -1
  80. package/lib/esm/internal/tile/map/ImageryProviders/ArcGISImageryProvider.d.ts +14 -0
  81. package/lib/esm/internal/tile/map/ImageryProviders/ArcGISImageryProvider.d.ts.map +1 -1
  82. package/lib/esm/internal/tile/map/ImageryProviders/ArcGISImageryProvider.js +92 -46
  83. package/lib/esm/internal/tile/map/ImageryProviders/ArcGISImageryProvider.js.map +1 -1
  84. package/lib/esm/internal/tile/map/ImageryProviders/ArcGISMapLayerImageryProvider.d.ts.map +1 -1
  85. package/lib/esm/internal/tile/map/ImageryProviders/ArcGISMapLayerImageryProvider.js +5 -4
  86. package/lib/esm/internal/tile/map/ImageryProviders/ArcGISMapLayerImageryProvider.js.map +1 -1
  87. package/lib/esm/internal/tile/map/ImageryProviders/WmsMapLayerImageryProvider.d.ts.map +1 -1
  88. package/lib/esm/internal/tile/map/ImageryProviders/WmsMapLayerImageryProvider.js +9 -3
  89. package/lib/esm/internal/tile/map/ImageryProviders/WmsMapLayerImageryProvider.js.map +1 -1
  90. package/lib/esm/internal/tile/map/ImageryProviders/WmtsMapLayerImageryProvider.d.ts.map +1 -1
  91. package/lib/esm/internal/tile/map/ImageryProviders/WmtsMapLayerImageryProvider.js +9 -3
  92. package/lib/esm/internal/tile/map/ImageryProviders/WmtsMapLayerImageryProvider.js.map +1 -1
  93. package/lib/esm/internal/tile/map/MapLayerFetch.d.ts +57 -0
  94. package/lib/esm/internal/tile/map/MapLayerFetch.d.ts.map +1 -0
  95. package/lib/esm/internal/tile/map/MapLayerFetch.js +91 -0
  96. package/lib/esm/internal/tile/map/MapLayerFetch.js.map +1 -0
  97. package/lib/esm/internal/tile/map/UrlUtils.js +1 -1
  98. package/lib/esm/internal/tile/map/UrlUtils.js.map +1 -1
  99. package/lib/esm/internal/tile/map/WmsCapabilities.d.ts +2 -5
  100. package/lib/esm/internal/tile/map/WmsCapabilities.d.ts.map +1 -1
  101. package/lib/esm/internal/tile/map/WmsCapabilities.js +16 -9
  102. package/lib/esm/internal/tile/map/WmsCapabilities.js.map +1 -1
  103. package/lib/esm/internal/tile/map/WmsUtilities.d.ts +29 -1
  104. package/lib/esm/internal/tile/map/WmsUtilities.d.ts.map +1 -1
  105. package/lib/esm/internal/tile/map/WmsUtilities.js +44 -12
  106. package/lib/esm/internal/tile/map/WmsUtilities.js.map +1 -1
  107. package/lib/esm/internal/tile/map/WmtsCapabilities.d.ts +2 -5
  108. package/lib/esm/internal/tile/map/WmtsCapabilities.d.ts.map +1 -1
  109. package/lib/esm/internal/tile/map/WmtsCapabilities.js +16 -9
  110. package/lib/esm/internal/tile/map/WmtsCapabilities.js.map +1 -1
  111. package/lib/esm/tile/internal.d.ts +2 -0
  112. package/lib/esm/tile/internal.d.ts.map +1 -1
  113. package/lib/esm/tile/internal.js +2 -0
  114. package/lib/esm/tile/internal.js.map +1 -1
  115. package/lib/esm/tile/map/MapLayerFetchHandler.d.ts +94 -0
  116. package/lib/esm/tile/map/MapLayerFetchHandler.d.ts.map +1 -0
  117. package/lib/esm/tile/map/MapLayerFetchHandler.js +9 -0
  118. package/lib/esm/tile/map/MapLayerFetchHandler.js.map +1 -0
  119. package/lib/esm/tile/map/MapLayerFormatRegistry.d.ts +27 -1
  120. package/lib/esm/tile/map/MapLayerFormatRegistry.d.ts.map +1 -1
  121. package/lib/esm/tile/map/MapLayerFormatRegistry.js +40 -0
  122. package/lib/esm/tile/map/MapLayerFormatRegistry.js.map +1 -1
  123. package/lib/esm/tile/map/MapLayerImageryFormats.d.ts.map +1 -1
  124. package/lib/esm/tile/map/MapLayerImageryFormats.js +21 -5
  125. package/lib/esm/tile/map/MapLayerImageryFormats.js.map +1 -1
  126. package/lib/esm/tile/map/MapLayerImageryProvider.d.ts +28 -16
  127. package/lib/esm/tile/map/MapLayerImageryProvider.d.ts.map +1 -1
  128. package/lib/esm/tile/map/MapLayerImageryProvider.js +136 -68
  129. package/lib/esm/tile/map/MapLayerImageryProvider.js.map +1 -1
  130. package/lib/esm/tile/map/MapLayerSources.d.ts +19 -4
  131. package/lib/esm/tile/map/MapLayerSources.d.ts.map +1 -1
  132. package/lib/esm/tile/map/MapLayerSources.js +28 -11
  133. package/lib/esm/tile/map/MapLayerSources.js.map +1 -1
  134. package/package.json +21 -21
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MapLayerFetch.js","sourceRoot":"","sources":["../../../../../src/internal/tile/map/MapLayerFetch.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Tiles\r\n */\r\n\r\nimport { IModelApp } from \"../../../IModelApp\";\r\nimport { MapLayerRequest } from \"../../../tile/internal\";\r\nimport type { MapLayerProviderProperties } from \"@itwin/core-common\";\r\n\r\n/** The outcome of [[fetchMapLayerRequest]].\r\n * @internal\r\n */\r\nexport interface MapLayerFetchResult {\r\n response: Response;\r\n /** True when a [[MapLayerFetchHandler]] returned this response as its own — from a credentialed send or\r\n * by short-circuiting. The framework then applies none of its default response handling (status-code or\r\n * protocol-error classification into `RequireAuth`, `UntrustedOrigin`, etc.): the handler reports failures\r\n * by throwing [[MapLayerAuthenticationFailedError]]. False when no handler managed the request — none is\r\n * registered, or every one declined — and we issued our own original request, which is exactly what we would\r\n * have sent without handlers and gets the default handling.\r\n */\r\n managedByHandler: boolean;\r\n}\r\n\r\n/** Routes an outgoing map-layer request through the pipeline of [[MapLayerFetchHandler]]s registered via\r\n * [[MapLayerFormatRegistry.addMapLayerFetchHandler]]; issues the default send directly when there is none or\r\n * every handler declines. A handler may decline, pass a copy of the request with other query parameters or\r\n * headers to `fetchRequest` (which offers it to the remaining handlers, then sends it credentialed), call it\r\n * any number of times, short-circuit with its own response, or throw [[MapLayerAuthenticationFailedError]].\r\n * @internal\r\n */\r\nexport async function fetchMapLayerRequest(args: {\r\n url: string;\r\n formatId: string;\r\n layerUrl: string;\r\n /** The layer's provider-specific settings properties, exposed as [[MapLayerRequest.layerProperties]]. */\r\n layerProperties?: MapLayerProviderProperties;\r\n /** Pre-populated headers (e.g. settings-derived basic auth), if any. */\r\n headers?: Headers;\r\n /** The call site's default send. `credentialed` is true when the send may carry handler-injected credentials\r\n * (every send requested by a handler), false when the request is our own original one (no handler, or all\r\n * declined).\r\n */\r\n send: (request: MapLayerRequest, credentialed: boolean) => Promise<Response>;\r\n}): Promise<MapLayerFetchResult> {\r\n const headers = args.headers ?? new Headers();\r\n const { layerUrl, layerProperties, formatId } = args;\r\n // Snapshot: registrations changing while a handler awaits must not shift the pipeline of a request in flight.\r\n const handlers = [...(IModelApp.mapLayerFormatRegistry?.mapLayerFetchHandlers ?? [])];\r\n let parsed: URL | undefined;\r\n if (handlers.length > 0) {\r\n try {\r\n // Relative URLs are valid targets (fetch resolves them against the document); resolve them the same way so\r\n // they are not opted out of the pipeline. Parsing only: the URL sent stays the caller's unless its query changes.\r\n parsed = new URL(args.url, typeof document !== \"undefined\" ? document.baseURI : undefined);\r\n } catch {\r\n // Not a parseable URL; issue the original request unhandled.\r\n }\r\n }\r\n\r\n if (!parsed) {\r\n const unhandled = await args.send({ url: args.url, layerUrl, layerProperties, formatId, searchParams: new URLSearchParams(), headers }, false);\r\n return { response: unhandled, managedByHandler: false };\r\n }\r\n\r\n const original = parsed;\r\n const originalSearch = original.searchParams.toString();\r\n const request: MapLayerRequest = { url: args.url, layerUrl, layerProperties, formatId, searchParams: original.searchParams, headers };\r\n // Copies the mutable fields (including provider properties and their arrays; `readonly` is shallow), so a handler that\r\n // mutates its request in place and then declines cannot leak the mutation to the next handler or to the default\r\n // send. The URL string stays ours verbatim (URL serialization would normalize it) unless the query parameters\r\n // changed, in which case it is recomputed from them; the target never changes.\r\n const snapshot = (source: MapLayerRequest): MapLayerRequest => {\r\n const searchParams = new URLSearchParams(source.searchParams);\r\n let url = args.url;\r\n if (searchParams.toString() !== originalSearch) {\r\n const changed = new URL(original);\r\n changed.search = searchParams.toString();\r\n url = changed.toString();\r\n }\r\n // Properties are informational layer context, not handler-editable request data. Always clone the\r\n // original settings, not source.layerProperties, so forwarding a modified copy cannot change that context.\r\n return { url, layerUrl, layerProperties: layerProperties === undefined ? undefined : structuredClone(layerProperties), formatId, searchParams, headers: new Headers(source.headers) };\r\n };\r\n // Offers the request to handlers[index..]: a declined request goes unchanged to the next handler; a request a\r\n // handler sends is offered to the remaining ones, then issued credentialed.\r\n const dispatch = async (index: number, toOffer: MapLayerRequest): Promise<Response | undefined> => {\r\n for (let i = index; i < handlers.length; ++i) {\r\n const handled = await handlers[i](snapshot(toOffer), async (toSend) => {\r\n const next = snapshot(toSend);\r\n return (await dispatch(i + 1, next)) ?? args.send(next, true);\r\n });\r\n if (handled)\r\n return handled;\r\n }\r\n\r\n return undefined;\r\n };\r\n\r\n const response = await dispatch(0, request);\r\n if (response)\r\n return { response, managedByHandler: true };\r\n\r\n return { response: await args.send(request, false), managedByHandler: false };\r\n}\r\n\r\n/** The redirect policy for a request that carries credentials: browser credentials (see\r\n * [[MapLayerImageryProvider.includeUserCredentials]]), settings-derived basic auth, or values a fetch handler\r\n * injected (see [[MapLayerFetchRequest]]).\r\n *\r\n * When [[MapLayerFormatRegistry.restrictCredentialsToTrustedOrigins]] is enabled, redirects are refused\r\n * outright (`\"error\"`). `fetch` cannot be asked to follow only same-origin redirects, and by the time a\r\n * followed redirect can be inspected the credentials have already been delivered to the destination — so\r\n * refusing is the only way to honour the guarantee that credentials reach none but the origins listed in\r\n * [[MapLayerFormatRegistry.trustedCredentialsOrigins]]. Legitimate same-origin redirects fail as a result;\r\n * that is the cost of the opt-in restriction.\r\n *\r\n * When the restriction is disabled (the default), redirects are followed as before and\r\n * [[MapLayerImageryProvider.checkCredentialedRedirect]] reports the destination after the fact.\r\n * @internal\r\n */\r\nexport function credentialedFetchRedirect(): RequestRedirect | undefined {\r\n return IModelApp.mapLayerFormatRegistry.restrictCredentialsToTrustedOrigins ? \"error\" : undefined;\r\n}\r\n"]}
@@ -10,7 +10,7 @@ exports.appendQueryParams = appendQueryParams;
10
10
  * @internal
11
11
  */
12
12
  function appendQueryParams(url, queryParams) {
13
- if (!queryParams)
13
+ if (!queryParams || Object.keys(queryParams).length === 0)
14
14
  return url;
15
15
  // create a lower-case array of keys
16
16
  const currentParams = [];
@@ -1 +1 @@
1
- {"version":3,"file":"UrlUtils.js","sourceRoot":"","sources":["../../../../../src/internal/tile/map/UrlUtils.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;;AAM/F,8CAuCC;AA3CD;;;KAGK;AACL,SAAgB,iBAAiB,CAAC,GAAW,EAAE,WAAqC;IAClF,IAAI,CAAC,WAAW;QACd,OAAO,GAAG,CAAC;IAEb,oCAAoC;IACpC,MAAM,aAAa,GAAa,EAAE,CAAC;IACnC,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IAChC,UAAU,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE;QACvD,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,MAAM,uBAAuB,GAAG,CAAC,UAAoC,EAAE,MAAwB,EAAoB,EAAE;QACnH,MAAM,SAAS,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,eAAe,EAAE,CAAC,CAAC;QAC5D,IAAI,CAAC,UAAU;YACb,OAAO,SAAS,CAAC;QACnB,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YACtC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;gBAC5C,SAAS,CAAC,MAAM,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;QACH,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC;IAEF,MAAM,MAAM,GAAG,uBAAuB,CAAC,WAAW,CAAC,CAAC;IAEpD,MAAM,YAAY,GAAG,CAAC,CAAS,EAAE,EAAE;QACjC,IAAI,SAAS,GAAG,GAAG,CAAC;QACpB,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACpB,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;gBACjB,SAAS,GAAG,EAAE,CAAC;QACnB,CAAC;aAAM,CAAC;YACN,SAAS,GAAG,GAAG,CAAC;QAClB,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC;IACF,IAAK,MAAM,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QACrB,GAAG,GAAG,GAAG,GAAG,GAAG,YAAY,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC;IACzD,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\n/** Append custom parameters for settings to provided URL object.\r\n * Make sure custom parameters do no override query parameters already part of the URL (lower case comparison)\r\n * @internal\r\n */\r\nexport function appendQueryParams(url: string, queryParams?: {[key: string]: string}) {\r\n if (!queryParams)\r\n return url;\r\n\r\n // create a lower-case array of keys\r\n const currentParams: string[] = [];\r\n const currentUrl = new URL(url);\r\n currentUrl.searchParams.forEach((_value, key, _parent) => {\r\n currentParams.push(key.toLowerCase());\r\n });\r\n\r\n const urlParamsFromIndexArray = (indexArray?: {[key: string]: string}, result?: URLSearchParams): URLSearchParams => {\r\n const urlParams = (result ? result : new URLSearchParams());\r\n if (!indexArray)\r\n return urlParams;\r\n Object.keys(indexArray).forEach((key) => {\r\n if (!currentParams.includes(key.toLowerCase()))\r\n urlParams.append(key, indexArray[key]);\r\n });\r\n return urlParams;\r\n };\r\n\r\n const params = urlParamsFromIndexArray(queryParams);\r\n\r\n const getSeparator = (u: string) => {\r\n let separator = \"&\";\r\n if (u.includes(\"?\")) {\r\n if (u.endsWith(\"?\"))\r\n separator = \"\";\r\n } else {\r\n separator = \"?\";\r\n }\r\n return separator;\r\n };\r\n if ( params.size > 0) {\r\n url = `${url}${getSeparator(url)}${params.toString()}`;\r\n }\r\n\r\n return url;\r\n}\r\n"]}
1
+ {"version":3,"file":"UrlUtils.js","sourceRoot":"","sources":["../../../../../src/internal/tile/map/UrlUtils.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;;AAM/F,8CAuCC;AA3CD;;;KAGK;AACL,SAAgB,iBAAiB,CAAC,GAAW,EAAE,WAAqC;IAClF,IAAI,CAAC,WAAW,IAAI,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,KAAK,CAAC;QACvD,OAAO,GAAG,CAAC;IAEb,oCAAoC;IACpC,MAAM,aAAa,GAAa,EAAE,CAAC;IACnC,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IAChC,UAAU,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE;QACvD,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,MAAM,uBAAuB,GAAG,CAAC,UAAoC,EAAE,MAAwB,EAAoB,EAAE;QACnH,MAAM,SAAS,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,eAAe,EAAE,CAAC,CAAC;QAC5D,IAAI,CAAC,UAAU;YACb,OAAO,SAAS,CAAC;QACnB,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YACtC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;gBAC5C,SAAS,CAAC,MAAM,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;QACH,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC;IAEF,MAAM,MAAM,GAAG,uBAAuB,CAAC,WAAW,CAAC,CAAC;IAEpD,MAAM,YAAY,GAAG,CAAC,CAAS,EAAE,EAAE;QACjC,IAAI,SAAS,GAAG,GAAG,CAAC;QACpB,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACpB,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;gBACjB,SAAS,GAAG,EAAE,CAAC;QACnB,CAAC;aAAM,CAAC;YACN,SAAS,GAAG,GAAG,CAAC;QAClB,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC;IACF,IAAK,MAAM,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QACrB,GAAG,GAAG,GAAG,GAAG,GAAG,YAAY,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC;IACzD,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\n/** Append custom parameters for settings to provided URL object.\r\n * Make sure custom parameters do no override query parameters already part of the URL (lower case comparison)\r\n * @internal\r\n */\r\nexport function appendQueryParams(url: string, queryParams?: {[key: string]: string}) {\r\n if (!queryParams || Object.keys(queryParams).length === 0)\r\n return url;\r\n\r\n // create a lower-case array of keys\r\n const currentParams: string[] = [];\r\n const currentUrl = new URL(url);\r\n currentUrl.searchParams.forEach((_value, key, _parent) => {\r\n currentParams.push(key.toLowerCase());\r\n });\r\n\r\n const urlParamsFromIndexArray = (indexArray?: {[key: string]: string}, result?: URLSearchParams): URLSearchParams => {\r\n const urlParams = (result ? result : new URLSearchParams());\r\n if (!indexArray)\r\n return urlParams;\r\n Object.keys(indexArray).forEach((key) => {\r\n if (!currentParams.includes(key.toLowerCase()))\r\n urlParams.append(key, indexArray[key]);\r\n });\r\n return urlParams;\r\n };\r\n\r\n const params = urlParamsFromIndexArray(queryParams);\r\n\r\n const getSeparator = (u: string) => {\r\n let separator = \"&\";\r\n if (u.includes(\"?\")) {\r\n if (u.endsWith(\"?\"))\r\n separator = \"\";\r\n } else {\r\n separator = \"?\";\r\n }\r\n return separator;\r\n };\r\n if ( params.size > 0) {\r\n url = `${url}${getSeparator(url)}${params.toString()}`;\r\n }\r\n\r\n return url;\r\n}\r\n"]}
@@ -2,8 +2,7 @@
2
2
  * @module Views
3
3
  */
4
4
  import { MapSubLayerProps } from "@itwin/core-common";
5
- import { RequestBasicCredentials } from "../../../request/Request";
6
- import { MapCartoRectangle } from "../../../tile/internal";
5
+ import { MapCartoRectangle, WmsCapabilitiesCreateOptions } from "../../../tile/internal";
7
6
  /** Encapsulation of the capabilities for an WMS server
8
7
  */
9
8
  export declare namespace WmsCapability {
@@ -54,9 +53,7 @@ export declare class WmsCapabilities {
54
53
  constructor(_json: any);
55
54
  /** Parse a GetCapabilities XML response, returning undefined if it is not a valid WMS capabilities document. */
56
55
  private static tryParse;
57
- static create(url: string, credentials?: RequestBasicCredentials, ignoreCache?: boolean, queryParams?: {
58
- [key: string]: string;
59
- }): Promise<WmsCapabilities | undefined>;
56
+ static create(url: string, options?: WmsCapabilitiesCreateOptions): Promise<WmsCapabilities | undefined>;
60
57
  getSubLayers(visible?: boolean): undefined | MapSubLayerProps[];
61
58
  getSubLayersCrs(subLayerNames: string[]): Map<string, string[]> | undefined;
62
59
  }
@@ -1 +1 @@
1
- {"version":3,"file":"WmsCapabilities.d.ts","sourceRoot":"","sources":["../../../../../src/internal/tile/map/WmsCapabilities.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"WmsCapabilities.d.ts","sourceRoot":"","sources":["../../../../../src/internal/tile/map/WmsCapabilities.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAGtD,OAAO,EAAE,iBAAiB,EAAE,4BAA4B,EAAgB,MAAM,wBAAwB,CAAC;AA0BvG;GACG;AACH,yBAAiB,aAAa,CAAC;IAE7B,MAAa,OAAO;QAClB,SAAgB,IAAI,EAAE,MAAM,CAAC;QAC7B,SAAgB,KAAK,CAAC,EAAE,MAAM,CAAC;QAC/B,SAAgB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClC,SAAgB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxC,SAAgB,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAC5C,SAAgB,iBAAiB,CAAC,EAAE,MAAM,CAAC;oBAE/B,IAAI,EAAE,GAAG;KAQtB;IAED,MAAa,KAAK;QAChB,SAAgB,SAAS,EAAE,OAAO,CAAC;QACnC,SAAgB,KAAK,CAAC,EAAE,MAAM,CAAC;QAC/B,SAAgB,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;QAC/B,SAAgB,UAAU,CAAC,EAAE,iBAAiB,CAAC;QAC/C,SAAgB,SAAS,aAAyB;QAClD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAO;oBAEnC,IAAI,EAAE,GAAG,EAAE,YAAY,EAAE,eAAe;QAO7C,YAAY,CAAC,OAAO,UAAO,GAAG,gBAAgB,EAAE;QAiDhD,eAAe,CAAC,eAAe,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;KAiBzE;IAED,MAAa,QAAQ;iBAQ2D,MAAM,CAAC,EAAE,QAAQ;QAP/F,SAAgB,IAAI,EAAE,MAAM,CAAC;QAC7B,SAAgB,KAAK,EAAE,MAAM,CAAC;QAC9B,SAAgB,GAAG,EAAE,MAAM,EAAE,CAAC;QAC9B,SAAgB,MAAM,EAAE,MAAM,EAAE,CAAC;QACjC,SAAgB,UAAU,CAAC,EAAE,iBAAiB,CAAC;QAC/C,SAAgB,QAAQ,CAAC,EAAE,QAAQ,EAAE,CAAC;QACtC,SAAgB,SAAS,EAAE,OAAO,CAAC;oBAChB,KAAK,EAAE,GAAG,EAAE,YAAY,EAAE,eAAe,EAAkB,MAAM,CAAC,EAAE,QAAQ,YAAA;KA2BhG;CACF;AAED,qBAAa,eAAe;IAWd,OAAO,CAAC,KAAK;IAVzB,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAAkD;IACnF,SAAgB,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC;IAC/C,SAAgB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjC,SAAgB,WAAW,EAAE,OAAO,CAAC;IACrC,SAAgB,KAAK,CAAC,EAAE,aAAa,CAAC,KAAK,CAAC;IAC5C,IAAW,IAAI,QAAyB;IACxC,IAAW,QAAQ,IAAI,MAAM,CAA2D;IACxF,IAAW,UAAU,IAAI,iBAAiB,GAAG,SAAS,CAAmC;IACzF,IAAW,oBAAoB,YAA2E;IAC1G,IAAW,kBAAkB,IAAI,MAAM,EAAE,GAAG,SAAS,CAAuJ;gBACxL,KAAK,EAAE,GAAG;IAW9B,gHAAgH;IAChH,OAAO,CAAC,MAAM,CAAC,QAAQ;WAkBH,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,4BAA4B,GAAG,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC;IAsC9G,YAAY,CAAC,OAAO,UAAO,GAAG,SAAS,GAAG,gBAAgB,EAAE;IAI5D,eAAe,CAAC,aAAa,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,SAAS;CAGnF"}
@@ -12,6 +12,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
12
12
  Object.defineProperty(exports, "__esModule", { value: true });
13
13
  exports.WmsCapabilities = exports.WmsCapability = void 0;
14
14
  const wms_capabilities_1 = __importDefault(require("wms-capabilities"));
15
+ const IModelApp_1 = require("../../../IModelApp");
15
16
  const internal_1 = require("../../../tile/internal");
16
17
  function rangeFromJSONArray(json) {
17
18
  return (Array.isArray(json) && json.length === 4) ? internal_1.MapCartoRectangle.fromDegrees(json[0], json[1], json[2], json[3]) : undefined;
@@ -210,12 +211,8 @@ class WmsCapabilities {
210
211
  return undefined; // Degenerate capabilities document
211
212
  }
212
213
  }
213
- static async create(url, credentials, ignoreCache, queryParams) {
214
- if (!ignoreCache) {
215
- const cached = WmsCapabilities._capabilitiesCache.get(url);
216
- if (cached !== undefined)
217
- return cached;
218
- }
214
+ static async create(url, options) {
215
+ const { credentials, ignoreCache, queryParams, formatId, layerUrl, layerProperties } = options ?? {};
219
216
  const tmpUrl = new URL(internal_1.WmsUtilities.getBaseUrl(url));
220
217
  tmpUrl.searchParams.append("request", "GetCapabilities");
221
218
  tmpUrl.searchParams.append("service", "WMS");
@@ -225,15 +222,25 @@ class WmsCapabilities {
225
222
  tmpUrl.searchParams.append(paramKey, queryParams[paramKey]);
226
223
  });
227
224
  }
228
- const xmlCapabilities = await internal_1.WmsUtilities.fetchXml(tmpUrl.toString(), credentials);
225
+ const cacheKey = tmpUrl.toString();
226
+ // The cache never contains credentialed results (see the write below), so a credentialed request
227
+ // must not be served a cached public document either; responses customized by the fetch handler
228
+ // must not be shared with or served from differently-customized requests.
229
+ const hasFetchHandler = (IModelApp_1.IModelApp.mapLayerFormatRegistry?.mapLayerFetchHandlers.length ?? 0) > 0;
230
+ if (!ignoreCache && !hasFetchHandler && !credentials) {
231
+ const cached = WmsCapabilities._capabilitiesCache.get(cacheKey);
232
+ if (cached !== undefined)
233
+ return cached;
234
+ }
235
+ const xmlCapabilities = await internal_1.WmsUtilities.fetchXml(tmpUrl.toString(), { credentials, formatId: formatId ?? "WMS", layerUrl: layerUrl ?? url, layerProperties });
229
236
  if (!xmlCapabilities)
230
237
  return undefined;
231
238
  const capabilities = WmsCapabilities.tryParse(xmlCapabilities);
232
239
  if (capabilities === undefined)
233
240
  return undefined;
234
- if (!credentials) {
241
+ if (!credentials && !hasFetchHandler) {
235
242
  // Avoid caching protected data
236
- WmsCapabilities._capabilitiesCache.set(url, capabilities);
243
+ WmsCapabilities._capabilitiesCache.set(cacheKey, capabilities);
237
244
  }
238
245
  return capabilities;
239
246
  }
@@ -1 +1 @@
1
- {"version":3,"file":"WmsCapabilities.js","sourceRoot":"","sources":["../../../../../src/internal/tile/map/WmsCapabilities.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Views\r\n */\r\n\r\nimport { MapSubLayerProps } from \"@itwin/core-common\";\r\nimport { RequestBasicCredentials } from \"../../../request/Request\";\r\nimport WMS from \"wms-capabilities\";\r\nimport { MapCartoRectangle, WmsUtilities } from \"../../../tile/internal\";\r\n\r\nfunction rangeFromJSONArray(json: any): MapCartoRectangle | undefined {\r\n return (Array.isArray(json) && json.length === 4) ? MapCartoRectangle.fromDegrees(json[0], json[1], json[2], json[3]) : undefined;\r\n}\r\n\r\nfunction rangeFromJSON(json: any): MapCartoRectangle | undefined {\r\n if (undefined !== json.LatLonBoundingBox)\r\n return rangeFromJSONArray(json.LatLonBoundingBox);\r\n else if (Array.isArray(json.EX_GeographicBoundingBox)) {\r\n return rangeFromJSONArray(json.EX_GeographicBoundingBox);\r\n } else {\r\n if (Array.isArray(json.BoundingBox))\r\n for (const boundingBox of json.BoundingBox) {\r\n if (boundingBox.crs === \"CRS:84\" || boundingBox.crs === \"EPSG:4326\") {\r\n return rangeFromJSONArray(boundingBox.extent);\r\n }\r\n }\r\n return undefined;\r\n }\r\n}\r\n\r\nfunction initArray<T>(input: any): undefined | T[] {\r\n return Array.isArray(input) ? input.slice() : undefined;\r\n}\r\n\r\n/** Encapsulation of the capabilities for an WMS server\r\n */\r\nexport namespace WmsCapability {\r\n\r\n export class Service {\r\n public readonly name: string;\r\n public readonly title?: string;\r\n public readonly abstract?: string;\r\n public readonly onlineResource?: string;\r\n public readonly contactInformation?: string;\r\n public readonly accessConstraints?: string;\r\n\r\n constructor(json: any) {\r\n this.name = json.Name ? json.Name : \"\";\r\n this.title = json.Title;\r\n this.abstract = json.Abstract;\r\n this.onlineResource = json.OnlineResource;\r\n this.contactInformation = json.ContactInformation;\r\n this.accessConstraints = json.AccessConstraints;\r\n }\r\n }\r\n\r\n export class Layer {\r\n public readonly queryable: boolean;\r\n public readonly title?: string;\r\n public readonly srs?: string[];\r\n public readonly cartoRange?: MapCartoRectangle;\r\n public readonly subLayers = new Array<SubLayer>();\r\n private static readonly PREFIX_SEPARATOR = \":\";\r\n\r\n constructor(json: any, capabilities: WmsCapabilities) {\r\n this.queryable = json.queryable;\r\n this.title = json.title;\r\n this.srs = initArray<string>(capabilities.isVersion13 ? json.CRS : json.SRS);\r\n this.cartoRange = rangeFromJSON(json);\r\n this.subLayers.push(new SubLayer(json, capabilities));\r\n }\r\n public getSubLayers(visible = true): MapSubLayerProps[] {\r\n const subLayers = new Array<MapSubLayerProps>();\r\n let index = 1;\r\n let childrenFound = false;\r\n const pushSubLayer = ((subLayer: SubLayer, parent?: number) => {\r\n let children;\r\n const id = index++;\r\n if (subLayer.children) {\r\n childrenFound = false;\r\n children = new Array<number>();\r\n subLayer.children.forEach((child) => {\r\n children.push(index);\r\n pushSubLayer(child, id);\r\n });\r\n }\r\n subLayers.push({ name: subLayer.name, title: subLayer.title, visible, parent, children, id });\r\n });\r\n this.subLayers.forEach((subLayer) => pushSubLayer(subLayer));\r\n\r\n if (!childrenFound) {\r\n const prefixed = new Map<string, MapSubLayerProps[]>();\r\n subLayers.forEach((subLayer) => {\r\n if (subLayer.name && subLayer.name.indexOf(Layer.PREFIX_SEPARATOR) > 0) {\r\n const prefix = subLayer.name.slice(0, subLayer.name.indexOf(Layer.PREFIX_SEPARATOR));\r\n const found = prefixed.get(prefix);\r\n if (found)\r\n found.push(subLayer);\r\n else\r\n prefixed.set(prefix, [subLayer]);\r\n }\r\n });\r\n if (prefixed.size > 1) {\r\n // Preserve the root node if any.\r\n const rootNode = (this.subLayers.length === 1 && this.subLayers[0].children && this.subLayers[0].children.length > 1) ? subLayers.find((curSubLayer) => this.subLayers[0].name === curSubLayer.name)?.id : undefined;\r\n prefixed.forEach((children, parent) => {\r\n children.forEach((child) => {\r\n child.parent = index;\r\n // Remove the prefix from the title if present.\r\n if (child.title && child.title.indexOf(parent + Layer.PREFIX_SEPARATOR) === 0)\r\n child.title = child.title.slice(parent.length + Layer.PREFIX_SEPARATOR.length);\r\n });\r\n subLayers.push({ name: \"\", title: parent, parent: rootNode, id: index++, children: children.map((child) => child.id as number), visible });\r\n });\r\n }\r\n }\r\n\r\n return subLayers;\r\n }\r\n\r\n public getSubLayersCrs(layerNameFilter: string[]): Map<string, string[]> {\r\n const subLayerCrs = new Map<string, string[]>();\r\n\r\n const processSubLayer = ((subLayer: SubLayer) => {\r\n if (layerNameFilter.includes(subLayer.name)) {\r\n subLayerCrs.set(subLayer.name, subLayer.crs);\r\n }\r\n if (subLayer.children) {\r\n subLayer.children.forEach((child) => {\r\n processSubLayer(child);\r\n });\r\n }\r\n });\r\n\r\n this.subLayers.forEach((subLayer) => processSubLayer(subLayer));\r\n return subLayerCrs;\r\n }\r\n }\r\n\r\n export class SubLayer {\r\n public readonly name: string;\r\n public readonly title: string;\r\n public readonly crs: string[];\r\n public readonly ownCrs: string[]; // CRS specific to this layer (ie. not including inherited CRS)\r\n public readonly cartoRange?: MapCartoRectangle;\r\n public readonly children?: SubLayer[];\r\n public readonly queryable: boolean;\r\n public constructor(_json: any, capabilities: WmsCapabilities, public readonly parent?: SubLayer) {\r\n\r\n const getParentCrs = (parentLayer: SubLayer, crsSet: Set<string>) => {\r\n parentLayer.crs.forEach((parentCrs) => crsSet.add(parentCrs));\r\n if (parentLayer.parent) {\r\n getParentCrs(parentLayer.parent, crsSet);\r\n }\r\n };\r\n\r\n this.name = _json.Name ? _json.Name : \"\";\r\n this.title = _json.Title;\r\n this.queryable = _json.queryable ? true : false;\r\n this.cartoRange = rangeFromJSON(_json);\r\n this.ownCrs = initArray<string>(capabilities.isVersion13 ? _json.CRS : _json.SRS) ?? [];\r\n const crs = new Set<string>(this.ownCrs);\r\n if (parent) {\r\n getParentCrs(parent, crs);\r\n }\r\n this.crs = [...crs];\r\n\r\n if (Array.isArray(_json.Layer)) {\r\n this.children = new Array<SubLayer>();\r\n for (const childLayer of _json.Layer) {\r\n this.children.push(new SubLayer(childLayer, capabilities, this));\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport class WmsCapabilities {\r\n private static _capabilitiesCache = new Map<string, WmsCapabilities | undefined>();\r\n public readonly service: WmsCapability.Service;\r\n public readonly version?: string;\r\n public readonly isVersion13: boolean;\r\n public readonly layer?: WmsCapability.Layer;\r\n public get json() { return this._json; }\r\n public get maxLevel(): number { return this.layer ? this.layer.subLayers.length : - 1; }\r\n public get cartoRange(): MapCartoRectangle | undefined { return this.layer?.cartoRange; }\r\n public get featureInfoSupported() { return undefined !== this._json.Capability?.Request?.GetFeatureInfo; }\r\n public get featureInfoFormats(): string[] | undefined { return Array.isArray(this._json.Capability?.Request?.GetFeatureInfo?.Format) ? this._json.Capability?.Request?.GetFeatureInfo?.Format : undefined; }\r\n constructor(private _json: any) {\r\n if (!_json || typeof _json !== \"object\" || (_json.Service === undefined && _json.Capability === undefined))\r\n throw new Error(\"Invalid WMS GetCapabilities response\");\r\n\r\n this.version = typeof _json.version === \"string\" ? _json.version : undefined;\r\n this.isVersion13 = this.version !== undefined && this.version.startsWith(\"1.3\");\r\n this.service = new WmsCapability.Service(_json.Service ?? {});\r\n if (_json.Capability?.Layer)\r\n this.layer = new WmsCapability.Layer(_json.Capability.Layer, this);\r\n }\r\n\r\n /** Parse a GetCapabilities XML response, returning undefined if it is not a valid WMS capabilities document. */\r\n private static tryParse(xmlCapabilities: string): WmsCapabilities | undefined {\r\n // Validate the document is actually rooted at a WMS capabilities element before parsing:\r\n // wms-capabilities happily parses any root and recognizes direct Service/Capability children.\r\n // WMS 1.3.0 uses WMS_Capabilities; WMS 1.0.0-1.1.1 uses WMT_MS_Capabilities.\r\n const doc = new DOMParser().parseFromString(xmlCapabilities, \"text/xml\");\r\n const rootName = doc.documentElement?.localName;\r\n if (rootName !== \"WMS_Capabilities\" && rootName !== \"WMT_MS_Capabilities\")\r\n return undefined; // Not a WMS GetCapabilities document\r\n if (doc.getElementsByTagName(\"parsererror\").length > 0)\r\n return undefined; // XML parse error (browsers embed a parsererror element)\r\n\r\n try {\r\n return new WmsCapabilities(new WMS(undefined, DOMParser).parse(xmlCapabilities));\r\n } catch {\r\n return undefined; // Degenerate capabilities document\r\n }\r\n }\r\n\r\n public static async create(url: string, credentials?: RequestBasicCredentials, ignoreCache?: boolean, queryParams?: {[key: string]: string}): Promise<WmsCapabilities | undefined> {\r\n if (!ignoreCache) {\r\n const cached = WmsCapabilities._capabilitiesCache.get(url);\r\n if (cached !== undefined)\r\n return cached;\r\n }\r\n\r\n const tmpUrl = new URL(WmsUtilities.getBaseUrl(url));\r\n tmpUrl.searchParams.append(\"request\", \"GetCapabilities\");\r\n tmpUrl.searchParams.append(\"service\", \"WMS\");\r\n if (queryParams) {\r\n Object.keys(queryParams).forEach((paramKey) => {\r\n if (!tmpUrl.searchParams.has(paramKey))\r\n tmpUrl.searchParams.append(paramKey, queryParams[paramKey]);\r\n });\r\n }\r\n const xmlCapabilities = await WmsUtilities.fetchXml(tmpUrl.toString(), credentials);\r\n\r\n if (!xmlCapabilities)\r\n return undefined;\r\n\r\n const capabilities = WmsCapabilities.tryParse(xmlCapabilities);\r\n if (capabilities === undefined)\r\n return undefined;\r\n\r\n if (!credentials) {\r\n // Avoid caching protected data\r\n WmsCapabilities._capabilitiesCache.set(url, capabilities);\r\n }\r\n\r\n return capabilities;\r\n }\r\n public getSubLayers(visible = true): undefined | MapSubLayerProps[] {\r\n return this.layer ? this.layer.getSubLayers(visible) : undefined;\r\n }\r\n\r\n public getSubLayersCrs(subLayerNames: string[]): Map<string, string[]> | undefined {\r\n return this.layer ? this.layer.getSubLayersCrs(subLayerNames) : undefined;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"WmsCapabilities.js","sourceRoot":"","sources":["../../../../../src/internal/tile/map/WmsCapabilities.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Views\r\n */\r\n\r\nimport { MapSubLayerProps } from \"@itwin/core-common\";\r\nimport WMS from \"wms-capabilities\";\r\nimport { IModelApp } from \"../../../IModelApp\";\r\nimport { MapCartoRectangle, WmsCapabilitiesCreateOptions, WmsUtilities } from \"../../../tile/internal\";\r\n\r\nfunction rangeFromJSONArray(json: any): MapCartoRectangle | undefined {\r\n return (Array.isArray(json) && json.length === 4) ? MapCartoRectangle.fromDegrees(json[0], json[1], json[2], json[3]) : undefined;\r\n}\r\n\r\nfunction rangeFromJSON(json: any): MapCartoRectangle | undefined {\r\n if (undefined !== json.LatLonBoundingBox)\r\n return rangeFromJSONArray(json.LatLonBoundingBox);\r\n else if (Array.isArray(json.EX_GeographicBoundingBox)) {\r\n return rangeFromJSONArray(json.EX_GeographicBoundingBox);\r\n } else {\r\n if (Array.isArray(json.BoundingBox))\r\n for (const boundingBox of json.BoundingBox) {\r\n if (boundingBox.crs === \"CRS:84\" || boundingBox.crs === \"EPSG:4326\") {\r\n return rangeFromJSONArray(boundingBox.extent);\r\n }\r\n }\r\n return undefined;\r\n }\r\n}\r\n\r\nfunction initArray<T>(input: any): undefined | T[] {\r\n return Array.isArray(input) ? input.slice() : undefined;\r\n}\r\n\r\n/** Encapsulation of the capabilities for an WMS server\r\n */\r\nexport namespace WmsCapability {\r\n\r\n export class Service {\r\n public readonly name: string;\r\n public readonly title?: string;\r\n public readonly abstract?: string;\r\n public readonly onlineResource?: string;\r\n public readonly contactInformation?: string;\r\n public readonly accessConstraints?: string;\r\n\r\n constructor(json: any) {\r\n this.name = json.Name ? json.Name : \"\";\r\n this.title = json.Title;\r\n this.abstract = json.Abstract;\r\n this.onlineResource = json.OnlineResource;\r\n this.contactInformation = json.ContactInformation;\r\n this.accessConstraints = json.AccessConstraints;\r\n }\r\n }\r\n\r\n export class Layer {\r\n public readonly queryable: boolean;\r\n public readonly title?: string;\r\n public readonly srs?: string[];\r\n public readonly cartoRange?: MapCartoRectangle;\r\n public readonly subLayers = new Array<SubLayer>();\r\n private static readonly PREFIX_SEPARATOR = \":\";\r\n\r\n constructor(json: any, capabilities: WmsCapabilities) {\r\n this.queryable = json.queryable;\r\n this.title = json.title;\r\n this.srs = initArray<string>(capabilities.isVersion13 ? json.CRS : json.SRS);\r\n this.cartoRange = rangeFromJSON(json);\r\n this.subLayers.push(new SubLayer(json, capabilities));\r\n }\r\n public getSubLayers(visible = true): MapSubLayerProps[] {\r\n const subLayers = new Array<MapSubLayerProps>();\r\n let index = 1;\r\n let childrenFound = false;\r\n const pushSubLayer = ((subLayer: SubLayer, parent?: number) => {\r\n let children;\r\n const id = index++;\r\n if (subLayer.children) {\r\n childrenFound = false;\r\n children = new Array<number>();\r\n subLayer.children.forEach((child) => {\r\n children.push(index);\r\n pushSubLayer(child, id);\r\n });\r\n }\r\n subLayers.push({ name: subLayer.name, title: subLayer.title, visible, parent, children, id });\r\n });\r\n this.subLayers.forEach((subLayer) => pushSubLayer(subLayer));\r\n\r\n if (!childrenFound) {\r\n const prefixed = new Map<string, MapSubLayerProps[]>();\r\n subLayers.forEach((subLayer) => {\r\n if (subLayer.name && subLayer.name.indexOf(Layer.PREFIX_SEPARATOR) > 0) {\r\n const prefix = subLayer.name.slice(0, subLayer.name.indexOf(Layer.PREFIX_SEPARATOR));\r\n const found = prefixed.get(prefix);\r\n if (found)\r\n found.push(subLayer);\r\n else\r\n prefixed.set(prefix, [subLayer]);\r\n }\r\n });\r\n if (prefixed.size > 1) {\r\n // Preserve the root node if any.\r\n const rootNode = (this.subLayers.length === 1 && this.subLayers[0].children && this.subLayers[0].children.length > 1) ? subLayers.find((curSubLayer) => this.subLayers[0].name === curSubLayer.name)?.id : undefined;\r\n prefixed.forEach((children, parent) => {\r\n children.forEach((child) => {\r\n child.parent = index;\r\n // Remove the prefix from the title if present.\r\n if (child.title && child.title.indexOf(parent + Layer.PREFIX_SEPARATOR) === 0)\r\n child.title = child.title.slice(parent.length + Layer.PREFIX_SEPARATOR.length);\r\n });\r\n subLayers.push({ name: \"\", title: parent, parent: rootNode, id: index++, children: children.map((child) => child.id as number), visible });\r\n });\r\n }\r\n }\r\n\r\n return subLayers;\r\n }\r\n\r\n public getSubLayersCrs(layerNameFilter: string[]): Map<string, string[]> {\r\n const subLayerCrs = new Map<string, string[]>();\r\n\r\n const processSubLayer = ((subLayer: SubLayer) => {\r\n if (layerNameFilter.includes(subLayer.name)) {\r\n subLayerCrs.set(subLayer.name, subLayer.crs);\r\n }\r\n if (subLayer.children) {\r\n subLayer.children.forEach((child) => {\r\n processSubLayer(child);\r\n });\r\n }\r\n });\r\n\r\n this.subLayers.forEach((subLayer) => processSubLayer(subLayer));\r\n return subLayerCrs;\r\n }\r\n }\r\n\r\n export class SubLayer {\r\n public readonly name: string;\r\n public readonly title: string;\r\n public readonly crs: string[];\r\n public readonly ownCrs: string[]; // CRS specific to this layer (ie. not including inherited CRS)\r\n public readonly cartoRange?: MapCartoRectangle;\r\n public readonly children?: SubLayer[];\r\n public readonly queryable: boolean;\r\n public constructor(_json: any, capabilities: WmsCapabilities, public readonly parent?: SubLayer) {\r\n\r\n const getParentCrs = (parentLayer: SubLayer, crsSet: Set<string>) => {\r\n parentLayer.crs.forEach((parentCrs) => crsSet.add(parentCrs));\r\n if (parentLayer.parent) {\r\n getParentCrs(parentLayer.parent, crsSet);\r\n }\r\n };\r\n\r\n this.name = _json.Name ? _json.Name : \"\";\r\n this.title = _json.Title;\r\n this.queryable = _json.queryable ? true : false;\r\n this.cartoRange = rangeFromJSON(_json);\r\n this.ownCrs = initArray<string>(capabilities.isVersion13 ? _json.CRS : _json.SRS) ?? [];\r\n const crs = new Set<string>(this.ownCrs);\r\n if (parent) {\r\n getParentCrs(parent, crs);\r\n }\r\n this.crs = [...crs];\r\n\r\n if (Array.isArray(_json.Layer)) {\r\n this.children = new Array<SubLayer>();\r\n for (const childLayer of _json.Layer) {\r\n this.children.push(new SubLayer(childLayer, capabilities, this));\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport class WmsCapabilities {\r\n private static _capabilitiesCache = new Map<string, WmsCapabilities | undefined>();\r\n public readonly service: WmsCapability.Service;\r\n public readonly version?: string;\r\n public readonly isVersion13: boolean;\r\n public readonly layer?: WmsCapability.Layer;\r\n public get json() { return this._json; }\r\n public get maxLevel(): number { return this.layer ? this.layer.subLayers.length : - 1; }\r\n public get cartoRange(): MapCartoRectangle | undefined { return this.layer?.cartoRange; }\r\n public get featureInfoSupported() { return undefined !== this._json.Capability?.Request?.GetFeatureInfo; }\r\n public get featureInfoFormats(): string[] | undefined { return Array.isArray(this._json.Capability?.Request?.GetFeatureInfo?.Format) ? this._json.Capability?.Request?.GetFeatureInfo?.Format : undefined; }\r\n constructor(private _json: any) {\r\n if (!_json || typeof _json !== \"object\" || (_json.Service === undefined && _json.Capability === undefined))\r\n throw new Error(\"Invalid WMS GetCapabilities response\");\r\n\r\n this.version = typeof _json.version === \"string\" ? _json.version : undefined;\r\n this.isVersion13 = this.version !== undefined && this.version.startsWith(\"1.3\");\r\n this.service = new WmsCapability.Service(_json.Service ?? {});\r\n if (_json.Capability?.Layer)\r\n this.layer = new WmsCapability.Layer(_json.Capability.Layer, this);\r\n }\r\n\r\n /** Parse a GetCapabilities XML response, returning undefined if it is not a valid WMS capabilities document. */\r\n private static tryParse(xmlCapabilities: string): WmsCapabilities | undefined {\r\n // Validate the document is actually rooted at a WMS capabilities element before parsing:\r\n // wms-capabilities happily parses any root and recognizes direct Service/Capability children.\r\n // WMS 1.3.0 uses WMS_Capabilities; WMS 1.0.0-1.1.1 uses WMT_MS_Capabilities.\r\n const doc = new DOMParser().parseFromString(xmlCapabilities, \"text/xml\");\r\n const rootName = doc.documentElement?.localName;\r\n if (rootName !== \"WMS_Capabilities\" && rootName !== \"WMT_MS_Capabilities\")\r\n return undefined; // Not a WMS GetCapabilities document\r\n if (doc.getElementsByTagName(\"parsererror\").length > 0)\r\n return undefined; // XML parse error (browsers embed a parsererror element)\r\n\r\n try {\r\n return new WmsCapabilities(new WMS(undefined, DOMParser).parse(xmlCapabilities));\r\n } catch {\r\n return undefined; // Degenerate capabilities document\r\n }\r\n }\r\n\r\n public static async create(url: string, options?: WmsCapabilitiesCreateOptions): Promise<WmsCapabilities | undefined> {\r\n const { credentials, ignoreCache, queryParams, formatId, layerUrl, layerProperties } = options ?? {};\r\n const tmpUrl = new URL(WmsUtilities.getBaseUrl(url));\r\n tmpUrl.searchParams.append(\"request\", \"GetCapabilities\");\r\n tmpUrl.searchParams.append(\"service\", \"WMS\");\r\n if (queryParams) {\r\n Object.keys(queryParams).forEach((paramKey) => {\r\n if (!tmpUrl.searchParams.has(paramKey))\r\n tmpUrl.searchParams.append(paramKey, queryParams[paramKey]);\r\n });\r\n }\r\n const cacheKey = tmpUrl.toString();\r\n // The cache never contains credentialed results (see the write below), so a credentialed request\r\n // must not be served a cached public document either; responses customized by the fetch handler\r\n // must not be shared with or served from differently-customized requests.\r\n const hasFetchHandler = (IModelApp.mapLayerFormatRegistry?.mapLayerFetchHandlers.length ?? 0) > 0;\r\n if (!ignoreCache && !hasFetchHandler && !credentials) {\r\n const cached = WmsCapabilities._capabilitiesCache.get(cacheKey);\r\n if (cached !== undefined)\r\n return cached;\r\n }\r\n\r\n const xmlCapabilities = await WmsUtilities.fetchXml(tmpUrl.toString(), { credentials, formatId: formatId ?? \"WMS\", layerUrl: layerUrl ?? url, layerProperties });\r\n\r\n if (!xmlCapabilities)\r\n return undefined;\r\n\r\n const capabilities = WmsCapabilities.tryParse(xmlCapabilities);\r\n if (capabilities === undefined)\r\n return undefined;\r\n\r\n if (!credentials && !hasFetchHandler) {\r\n // Avoid caching protected data\r\n WmsCapabilities._capabilitiesCache.set(cacheKey, capabilities);\r\n }\r\n\r\n return capabilities;\r\n }\r\n public getSubLayers(visible = true): undefined | MapSubLayerProps[] {\r\n return this.layer ? this.layer.getSubLayers(visible) : undefined;\r\n }\r\n\r\n public getSubLayersCrs(subLayerNames: string[]): Map<string, string[]> | undefined {\r\n return this.layer ? this.layer.getSubLayersCrs(subLayerNames) : undefined;\r\n }\r\n}\r\n"]}
@@ -1,7 +1,31 @@
1
1
  import { RequestBasicCredentials } from "../../../request/Request";
2
+ import type { MapLayerProviderProperties } from "@itwin/core-common";
2
3
  /** @packageDocumentation
3
4
  * @module Tiles
4
5
  */
6
+ /** Options for a capabilities/XML request routed through the registered [[MapLayerFetchHandler]]s, if any.
7
+ * @internal
8
+ */
9
+ export interface WmsFetchOptions {
10
+ credentials?: RequestBasicCredentials;
11
+ /** The id of the map-layer format the request is made for, passed to the handler as [[MapLayerRequest.formatId]]. */
12
+ formatId?: string;
13
+ /** The map-layer source URL, passed to the handler as [[MapLayerRequest.layerUrl]]. Defaults to the request URL,
14
+ * which callers should avoid: capabilities request URLs differ from the layer's. */
15
+ layerUrl?: string;
16
+ /** The layer's provider-specific settings properties, passed to the handler as [[MapLayerRequest.layerProperties]]. */
17
+ layerProperties?: MapLayerProviderProperties;
18
+ }
19
+ /** Options for [[WmsCapabilities.create]] and [[WmtsCapabilities.create]].
20
+ * @internal
21
+ */
22
+ export interface WmsCapabilitiesCreateOptions extends WmsFetchOptions {
23
+ ignoreCache?: boolean;
24
+ /** Custom query parameters appended to the GetCapabilities request. */
25
+ queryParams?: {
26
+ [key: string]: string;
27
+ };
28
+ }
5
29
  /** @internal */
6
30
  export declare class WmsUtilities {
7
31
  static getBaseUrl(url: string): string;
@@ -9,6 +33,10 @@ export declare class WmsUtilities {
9
33
  * fetch XML from HTTP request
10
34
  * @param url server URL to address the request
11
35
  */
12
- static fetchXml(url: string, credentials?: RequestBasicCredentials): Promise<string>;
36
+ static fetchXml(url: string, options?: WmsFetchOptions): Promise<string>;
37
+ /** Legacy (no injected credentials) challenge handling: basic-auth/untrusted-origin classification and the SSO retry.
38
+ * `credentialsWithheld` is true when basic credentials exist but were not attached because the origin is untrusted.
39
+ */
40
+ private static handleLegacyChallenges;
13
41
  }
14
42
  //# sourceMappingURL=WmsUtilities.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"WmsUtilities.d.ts","sourceRoot":"","sources":["../../../../../src/internal/tile/map/WmsUtilities.ts"],"names":[],"mappings":"AAMA,OAAO,EAAqB,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AAItF;;GAEG;AAEH,gBAAgB;AAChB,qBAAa,YAAY;WACT,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAK7C;;;KAGC;WACmB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,uBAAuB,GAAG,OAAO,CAAC,MAAM,CAAC;CAuClG"}
1
+ {"version":3,"file":"WmsUtilities.d.ts","sourceRoot":"","sources":["../../../../../src/internal/tile/map/WmsUtilities.ts"],"names":[],"mappings":"AAMA,OAAO,EAAqB,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AAEtF,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AAKrE;;GAEG;AAEH;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,WAAW,CAAC,EAAE,uBAAuB,CAAC;IACtC,qHAAqH;IACrH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;wFACoF;IACpF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uHAAuH;IACvH,eAAe,CAAC,EAAE,0BAA0B,CAAC;CAC9C;AAED;;GAEG;AACH,MAAM,WAAW,4BAA6B,SAAQ,eAAe;IACnE,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,uEAAuE;IACvE,WAAW,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC;CACzC;AAED,gBAAgB;AAChB,qBAAa,YAAY;WACT,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAK7C;;;KAGC;WACmB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC;IAmDrF;;OAEG;mBACkB,sBAAsB;CAuB5C"}
@@ -9,9 +9,6 @@ const IModelApp_1 = require("../../../IModelApp");
9
9
  const Request_1 = require("../../../request/Request");
10
10
  const utils_1 = require("../../../request/utils");
11
11
  const internal_1 = require("../../../tile/internal");
12
- /** @packageDocumentation
13
- * @module Tiles
14
- */
15
12
  /** @internal */
16
13
  class WmsUtilities {
17
14
  static getBaseUrl(url) {
@@ -22,21 +19,58 @@ class WmsUtilities {
22
19
  * fetch XML from HTTP request
23
20
  * @param url server URL to address the request
24
21
  */
25
- static async fetchXml(url, credentials) {
22
+ static async fetchXml(url, options) {
23
+ const { credentials, formatId, layerUrl, layerProperties } = options ?? {};
26
24
  let headers;
27
- if (credentials && credentials.user && credentials.password) {
25
+ const hasCredentials = !!(credentials && credentials.user && credentials.password);
26
+ if (hasCredentials) {
28
27
  // Basic credentials are considered settings-derived credentials for this source. When the registry is
29
28
  // enforcing trusted origins, the source URL itself is the only implicitly trusted origin for basic auth;
30
29
  // opaque/custom-protocol URLs have no network origin and must therefore be treated as untrusted.
31
- const allowBasicAuth = !IModelApp_1.IModelApp.mapLayerFormatRegistry.restrictCredentialsToTrustedOrigins
30
+ // Optional chaining: some callers run before IModelApp startup.
31
+ const allowBasicAuth = !IModelApp_1.IModelApp.mapLayerFormatRegistry?.restrictCredentialsToTrustedOrigins
32
32
  || IModelApp_1.IModelApp.mapLayerFormatRegistry.isCredentialsSharingAllowed(url, url);
33
33
  if (allowBasicAuth) {
34
34
  headers = new Headers();
35
35
  (0, utils_1.setBasicAuthorization)(headers, credentials);
36
36
  }
37
37
  }
38
- let response = await fetch(url, { method: "GET", headers });
39
- if (!headers && credentials && credentials.user && credentials.password && (response.status === 401 || response.status === 403)) {
38
+ const credentialsWithheld = hasCredentials && headers === undefined;
39
+ // Route the request through the registered fetch handler (if any). Handler failures — including
40
+ // MapLayerAuthenticationFailedError — propagate so callers can transition to RequireAuth.
41
+ const { response, managedByHandler } = await (0, internal_1.fetchMapLayerRequest)({
42
+ url,
43
+ formatId: formatId ?? "",
44
+ layerUrl: layerUrl ?? url,
45
+ layerProperties,
46
+ headers,
47
+ send: async (request, credentialed) => {
48
+ const rsp = await fetch(request.url, {
49
+ method: "GET",
50
+ headers: request.headers,
51
+ // Sends the handler modified may carry injected secrets: same redirect policy as credentialed ones.
52
+ redirect: credentialed ? (0, internal_1.credentialedFetchRedirect)() : undefined,
53
+ });
54
+ // A send the handler modified never falls back to the legacy basic-auth / NTLM-SSO handling:
55
+ // the handler is the authentication authority for it.
56
+ return credentialed ? rsp : WmsUtilities.handleLegacyChallenges(rsp, request.url, credentials, credentialsWithheld);
57
+ },
58
+ });
59
+ if (response.status !== 200) {
60
+ // A status in a response managed by the fetch handler is not an authentication failure (it would have
61
+ // thrown MapLayerAuthenticationFailedError): report it without a status so callers do not classify it.
62
+ if (managedByHandler)
63
+ throw new Error(`Map-layer fetch handler returned status ${response.status} for '${url}'`);
64
+ throw new Request_1.HttpResponseError(response.status, await response.text());
65
+ }
66
+ return response.text();
67
+ }
68
+ /** Legacy (no injected credentials) challenge handling: basic-auth/untrusted-origin classification and the SSO retry.
69
+ * `credentialsWithheld` is true when basic credentials exist but were not attached because the origin is untrusted.
70
+ */
71
+ static async handleLegacyChallenges(firstResponse, url, credentials, credentialsWithheld) {
72
+ let response = firstResponse;
73
+ if (credentialsWithheld && (response.status === 401 || response.status === 403)) {
40
74
  throw new internal_1.MapLayerUntrustedOriginError(url);
41
75
  }
42
76
  if (!credentials && response.status === 401 && (0, utils_1.headersIncludeAuthMethod)(response.headers, ["ntlm", "negotiate"])) {
@@ -52,9 +86,7 @@ class WmsUtilities {
52
86
  redirect: IModelApp_1.IModelApp.mapLayerFormatRegistry.restrictCredentialsToTrustedOrigins ? "error" : undefined,
53
87
  });
54
88
  }
55
- if (response.status !== 200)
56
- throw new Request_1.HttpResponseError(response.status, await response.text());
57
- return response.text();
89
+ return response;
58
90
  }
59
91
  }
60
92
  exports.WmsUtilities = WmsUtilities;
@@ -1 +1 @@
1
- {"version":3,"file":"WmsUtilities.js","sourceRoot":"","sources":["../../../../../src/internal/tile/map/WmsUtilities.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;;;AAE/F,kDAA+C;AAC/C,sDAAsF;AACtF,kDAAyF;AACzF,qDAAsE;AAEtE;;GAEG;AAEH,gBAAgB;AAChB,MAAa,YAAY;IAChB,MAAM,CAAC,UAAU,CAAC,GAAW;QAClC,MAAM,SAAS,GAAG,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACvC,OAAO,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IACvD,CAAC;IAED;;;KAGC;IACM,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAW,EAAE,WAAqC;QAE7E,IAAI,OAA0B,CAAC;QAC/B,IAAI,WAAW,IAAI,WAAW,CAAC,IAAI,IAAI,WAAW,CAAC,QAAQ,EAAE,CAAC;YAC5D,sGAAsG;YACtG,yGAAyG;YACzG,iGAAiG;YACjG,MAAM,cAAc,GAAG,CAAC,qBAAS,CAAC,sBAAsB,CAAC,mCAAmC;mBACvF,qBAAS,CAAC,sBAAsB,CAAC,2BAA2B,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YAC5E,IAAI,cAAc,EAAE,CAAC;gBACnB,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;gBACxB,IAAA,6BAAqB,EAAC,OAAO,EAAE,WAAW,CAAC,CAAC;YAC9C,CAAC;QACH,CAAC;QAED,IAAI,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QAC5D,IAAI,CAAC,OAAO,IAAI,WAAW,IAAI,WAAW,CAAC,IAAI,IAAI,WAAW,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,CAAC,EAAE,CAAC;YAChI,MAAM,IAAI,uCAA4B,CAAC,GAAG,CAAC,CAAC;QAC9C,CAAC;QACD,IAAI,CAAC,WAAW,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,IAAA,gCAAwB,EAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC;YACjH,kGAAkG;YAClG,MAAM,aAAa,GAAG,QAAQ,CAAC,GAAG,IAAI,GAAG,CAAC;YAC1C,IAAI,CAAC,qBAAS,CAAC,sBAAsB,CAAC,YAAY,CAAC,aAAa,CAAC;gBAC/D,MAAM,IAAI,uCAA4B,CAAC,aAAa,CAAC,CAAC;YAExD,qBAAS,CAAC,sBAAsB,CAAC,qBAAqB,CAAC,aAAa,CAAC,CAAC;YAEtE,2EAA2E;YAC3E,QAAQ,GAAG,MAAM,KAAK,CAAC,aAAa,EAAE;gBACpC,MAAM,EAAE,KAAK;gBACb,WAAW,EAAE,SAAS;gBACtB,QAAQ,EAAE,qBAAS,CAAC,sBAAsB,CAAC,mCAAmC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;aACrG,CAAC,CAAC;QACL,CAAC;QAED,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG;YACzB,MAAM,IAAI,2BAAiB,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;QACtE,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;IACzB,CAAC;CACF;AAjDD,oCAiDC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport { IModelApp } from \"../../../IModelApp\";\r\nimport { HttpResponseError, RequestBasicCredentials } from \"../../../request/Request\";\r\nimport { headersIncludeAuthMethod, setBasicAuthorization } from \"../../../request/utils\";\r\nimport { MapLayerUntrustedOriginError } from \"../../../tile/internal\";\r\n\r\n/** @packageDocumentation\r\n * @module Tiles\r\n */\r\n\r\n/** @internal */\r\nexport class WmsUtilities {\r\n public static getBaseUrl(url: string): string {\r\n const lastIndex = url.lastIndexOf(\"?\");\r\n return lastIndex > 0 ? url.slice(0, lastIndex) : url;\r\n }\r\n\r\n /**\r\n * fetch XML from HTTP request\r\n * @param url server URL to address the request\r\n */\r\n public static async fetchXml(url: string, credentials?: RequestBasicCredentials): Promise<string> {\r\n\r\n let headers: Headers|undefined;\r\n if (credentials && credentials.user && credentials.password) {\r\n // Basic credentials are considered settings-derived credentials for this source. When the registry is\r\n // enforcing trusted origins, the source URL itself is the only implicitly trusted origin for basic auth;\r\n // opaque/custom-protocol URLs have no network origin and must therefore be treated as untrusted.\r\n const allowBasicAuth = !IModelApp.mapLayerFormatRegistry.restrictCredentialsToTrustedOrigins\r\n || IModelApp.mapLayerFormatRegistry.isCredentialsSharingAllowed(url, url);\r\n if (allowBasicAuth) {\r\n headers = new Headers();\r\n setBasicAuthorization(headers, credentials);\r\n }\r\n }\r\n\r\n let response = await fetch(url, { method: \"GET\", headers });\r\n if (!headers && credentials && credentials.user && credentials.password && (response.status === 401 || response.status === 403)) {\r\n throw new MapLayerUntrustedOriginError(url);\r\n }\r\n if (!credentials && response.status === 401 && headersIncludeAuthMethod(response.headers, [\"ntlm\", \"negotiate\"])) {\r\n // fetch follows redirects transparently, so trust decisions target the final (post-redirect) URL.\r\n const challengedUrl = response.url || url;\r\n if (!IModelApp.mapLayerFormatRegistry.isSsoAllowed(challengedUrl))\r\n throw new MapLayerUntrustedOriginError(challengedUrl);\r\n\r\n IModelApp.mapLayerFormatRegistry.logUntrustedOriginUse(challengedUrl);\r\n\r\n // We got a http 401 challenge, lets try SSO (i.e. Windows Authentication).\r\n response = await fetch(challengedUrl, {\r\n method: \"GET\",\r\n credentials: \"include\",\r\n redirect: IModelApp.mapLayerFormatRegistry.restrictCredentialsToTrustedOrigins ? \"error\" : undefined,\r\n });\r\n }\r\n\r\n if (response.status !== 200)\r\n throw new HttpResponseError(response.status, await response.text());\r\n return response.text();\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"WmsUtilities.js","sourceRoot":"","sources":["../../../../../src/internal/tile/map/WmsUtilities.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport { IModelApp } from \"../../../IModelApp\";\r\nimport { HttpResponseError, RequestBasicCredentials } from \"../../../request/Request\";\r\nimport { headersIncludeAuthMethod, setBasicAuthorization } from \"../../../request/utils\";\r\nimport type { MapLayerProviderProperties } from \"@itwin/core-common\";\r\nimport {\r\n credentialedFetchRedirect, fetchMapLayerRequest, MapLayerUntrustedOriginError,\r\n} from \"../../../tile/internal\";\r\n\r\n/** @packageDocumentation\r\n * @module Tiles\r\n */\r\n\r\n/** Options for a capabilities/XML request routed through the registered [[MapLayerFetchHandler]]s, if any.\r\n * @internal\r\n */\r\nexport interface WmsFetchOptions {\r\n credentials?: RequestBasicCredentials;\r\n /** The id of the map-layer format the request is made for, passed to the handler as [[MapLayerRequest.formatId]]. */\r\n formatId?: string;\r\n /** The map-layer source URL, passed to the handler as [[MapLayerRequest.layerUrl]]. Defaults to the request URL,\r\n * which callers should avoid: capabilities request URLs differ from the layer's. */\r\n layerUrl?: string;\r\n /** The layer's provider-specific settings properties, passed to the handler as [[MapLayerRequest.layerProperties]]. */\r\n layerProperties?: MapLayerProviderProperties;\r\n}\r\n\r\n/** Options for [[WmsCapabilities.create]] and [[WmtsCapabilities.create]].\r\n * @internal\r\n */\r\nexport interface WmsCapabilitiesCreateOptions extends WmsFetchOptions {\r\n ignoreCache?: boolean;\r\n /** Custom query parameters appended to the GetCapabilities request. */\r\n queryParams?: { [key: string]: string };\r\n}\r\n\r\n/** @internal */\r\nexport class WmsUtilities {\r\n public static getBaseUrl(url: string): string {\r\n const lastIndex = url.lastIndexOf(\"?\");\r\n return lastIndex > 0 ? url.slice(0, lastIndex) : url;\r\n }\r\n\r\n /**\r\n * fetch XML from HTTP request\r\n * @param url server URL to address the request\r\n */\r\n public static async fetchXml(url: string, options?: WmsFetchOptions): Promise<string> {\r\n const { credentials, formatId, layerUrl, layerProperties } = options ?? {};\r\n\r\n let headers: Headers|undefined;\r\n const hasCredentials = !!(credentials && credentials.user && credentials.password);\r\n if (hasCredentials) {\r\n // Basic credentials are considered settings-derived credentials for this source. When the registry is\r\n // enforcing trusted origins, the source URL itself is the only implicitly trusted origin for basic auth;\r\n // opaque/custom-protocol URLs have no network origin and must therefore be treated as untrusted.\r\n // Optional chaining: some callers run before IModelApp startup.\r\n const allowBasicAuth = !IModelApp.mapLayerFormatRegistry?.restrictCredentialsToTrustedOrigins\r\n || IModelApp.mapLayerFormatRegistry.isCredentialsSharingAllowed(url, url);\r\n if (allowBasicAuth) {\r\n headers = new Headers();\r\n setBasicAuthorization(headers, credentials);\r\n }\r\n }\r\n const credentialsWithheld = hasCredentials && headers === undefined;\r\n\r\n // Route the request through the registered fetch handler (if any). Handler failures — including\r\n // MapLayerAuthenticationFailedError — propagate so callers can transition to RequireAuth.\r\n const { response, managedByHandler } = await fetchMapLayerRequest({\r\n url,\r\n formatId: formatId ?? \"\",\r\n layerUrl: layerUrl ?? url,\r\n layerProperties,\r\n headers,\r\n send: async (request, credentialed) => {\r\n const rsp = await fetch(request.url, {\r\n method: \"GET\",\r\n headers: request.headers,\r\n // Sends the handler modified may carry injected secrets: same redirect policy as credentialed ones.\r\n redirect: credentialed ? credentialedFetchRedirect() : undefined,\r\n });\r\n\r\n // A send the handler modified never falls back to the legacy basic-auth / NTLM-SSO handling:\r\n // the handler is the authentication authority for it.\r\n return credentialed ? rsp : WmsUtilities.handleLegacyChallenges(rsp, request.url, credentials, credentialsWithheld);\r\n },\r\n });\r\n\r\n if (response.status !== 200) {\r\n // A status in a response managed by the fetch handler is not an authentication failure (it would have\r\n // thrown MapLayerAuthenticationFailedError): report it without a status so callers do not classify it.\r\n if (managedByHandler)\r\n throw new Error(`Map-layer fetch handler returned status ${response.status} for '${url}'`);\r\n throw new HttpResponseError(response.status, await response.text());\r\n }\r\n return response.text();\r\n }\r\n\r\n /** Legacy (no injected credentials) challenge handling: basic-auth/untrusted-origin classification and the SSO retry.\r\n * `credentialsWithheld` is true when basic credentials exist but were not attached because the origin is untrusted.\r\n */\r\n private static async handleLegacyChallenges(firstResponse: Response, url: string, credentials: RequestBasicCredentials | undefined, credentialsWithheld: boolean): Promise<Response> {\r\n let response = firstResponse;\r\n if (credentialsWithheld && (response.status === 401 || response.status === 403)) {\r\n throw new MapLayerUntrustedOriginError(url);\r\n }\r\n if (!credentials && response.status === 401 && headersIncludeAuthMethod(response.headers, [\"ntlm\", \"negotiate\"])) {\r\n // fetch follows redirects transparently, so trust decisions target the final (post-redirect) URL.\r\n const challengedUrl = response.url || url;\r\n if (!IModelApp.mapLayerFormatRegistry.isSsoAllowed(challengedUrl))\r\n throw new MapLayerUntrustedOriginError(challengedUrl);\r\n\r\n IModelApp.mapLayerFormatRegistry.logUntrustedOriginUse(challengedUrl);\r\n\r\n // We got a http 401 challenge, lets try SSO (i.e. Windows Authentication).\r\n response = await fetch(challengedUrl, {\r\n method: \"GET\",\r\n credentials: \"include\",\r\n redirect: IModelApp.mapLayerFormatRegistry.restrictCredentialsToTrustedOrigins ? \"error\" : undefined,\r\n });\r\n }\r\n\r\n return response;\r\n }\r\n}\r\n"]}
@@ -2,8 +2,7 @@
2
2
  * @module Views
3
3
  */
4
4
  import { Point2d, Range2d } from "@itwin/core-geometry";
5
- import { RequestBasicCredentials } from "../../../request/Request";
6
- import { MapCartoRectangle } from "../../../tile/internal";
5
+ import { MapCartoRectangle, WmsCapabilitiesCreateOptions } from "../../../tile/internal";
7
6
  export declare enum WmtsConstants {
8
7
  GOOGLEMAPS_LEVEL0_SCALE_DENOM = 559082264.0287178,
9
8
  GOOGLEMAPS_COMPATIBLE_WELLKNOWNNAME = "googlemapscompatible"
@@ -121,8 +120,6 @@ export declare class WmtsCapabilities {
121
120
  readonly operationsMetadata?: WmtsCapability.OperationMetadata;
122
121
  constructor(xmlDoc: Document);
123
122
  static createFromXml(xmlCapabilities: string): WmtsCapabilities | undefined;
124
- static create(url: string, credentials?: RequestBasicCredentials, ignoreCache?: boolean, queryParams?: {
125
- [key: string]: string;
126
- }): Promise<WmtsCapabilities | undefined>;
123
+ static create(url: string, options?: WmsCapabilitiesCreateOptions): Promise<WmtsCapabilities | undefined>;
127
124
  }
128
125
  //# sourceMappingURL=WmtsCapabilities.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"WmtsCapabilities.d.ts","sourceRoot":"","sources":["../../../../../src/internal/tile/map/WmtsCapabilities.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"WmtsCapabilities.d.ts","sourceRoot":"","sources":["../../../../../src/internal/tile/map/WmtsCapabilities.ts"],"names":[],"mappings":"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"}
@@ -10,6 +10,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
10
10
  exports.WmtsCapabilities = exports.WmtsCapability = exports.WmtsConstants = void 0;
11
11
  const core_bentley_1 = require("@itwin/core-bentley");
12
12
  const core_geometry_1 = require("@itwin/core-geometry");
13
+ const IModelApp_1 = require("../../../IModelApp");
13
14
  const internal_1 = require("../../../tile/internal");
14
15
  var OwsConstants;
15
16
  (function (OwsConstants) {
@@ -476,12 +477,8 @@ class WmtsCapabilities {
476
477
  const xmlDoc = parser.parseFromString(xmlCapabilities, "text/xml");
477
478
  return new WmtsCapabilities(xmlDoc);
478
479
  }
479
- static async create(url, credentials, ignoreCache, queryParams) {
480
- if (!ignoreCache) {
481
- const cached = WmtsCapabilities._capabilitiesCache.get(url);
482
- if (cached !== undefined)
483
- return cached;
484
- }
480
+ static async create(url, options) {
481
+ const { credentials, ignoreCache, queryParams, formatId, layerUrl, layerProperties } = options ?? {};
485
482
  const tmpUrl = new URL(internal_1.WmsUtilities.getBaseUrl(url));
486
483
  tmpUrl.searchParams.append("request", "GetCapabilities");
487
484
  tmpUrl.searchParams.append("service", "WMTS");
@@ -491,12 +488,22 @@ class WmtsCapabilities {
491
488
  tmpUrl.searchParams.append(paramKey, queryParams[paramKey]);
492
489
  });
493
490
  }
494
- const xmlCapabilities = await internal_1.WmsUtilities.fetchXml(tmpUrl.toString(), credentials);
491
+ const cacheKey = tmpUrl.toString();
492
+ // The cache never contains credentialed results (see the write below), so a credentialed request
493
+ // must not be served a cached public document either; responses customized by the fetch handler
494
+ // must not be shared with or served from differently-customized requests.
495
+ const hasFetchHandler = (IModelApp_1.IModelApp.mapLayerFormatRegistry?.mapLayerFetchHandlers.length ?? 0) > 0;
496
+ if (!ignoreCache && !hasFetchHandler && !credentials) {
497
+ const cached = WmtsCapabilities._capabilitiesCache.get(cacheKey);
498
+ if (cached !== undefined)
499
+ return cached;
500
+ }
501
+ const xmlCapabilities = await internal_1.WmsUtilities.fetchXml(tmpUrl.toString(), { credentials, formatId: formatId ?? "WMTS", layerUrl: layerUrl ?? url, layerProperties });
495
502
  if (!xmlCapabilities)
496
503
  return undefined;
497
504
  const capabilities = WmtsCapabilities.createFromXml(xmlCapabilities);
498
- if (capabilities)
499
- WmtsCapabilities._capabilitiesCache.set(url, capabilities);
505
+ if (capabilities && !credentials && !hasFetchHandler)
506
+ WmtsCapabilities._capabilitiesCache.set(cacheKey, capabilities);
500
507
  return capabilities;
501
508
  }
502
509
  }