@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,57 @@
1
+ /** @packageDocumentation
2
+ * @module Tiles
3
+ */
4
+ import { MapLayerRequest } from "../../../tile/internal";
5
+ import type { MapLayerProviderProperties } from "@itwin/core-common";
6
+ /** The outcome of [[fetchMapLayerRequest]].
7
+ * @internal
8
+ */
9
+ export interface MapLayerFetchResult {
10
+ response: Response;
11
+ /** True when a [[MapLayerFetchHandler]] returned this response as its own — from a credentialed send or
12
+ * by short-circuiting. The framework then applies none of its default response handling (status-code or
13
+ * protocol-error classification into `RequireAuth`, `UntrustedOrigin`, etc.): the handler reports failures
14
+ * by throwing [[MapLayerAuthenticationFailedError]]. False when no handler managed the request — none is
15
+ * registered, or every one declined — and we issued our own original request, which is exactly what we would
16
+ * have sent without handlers and gets the default handling.
17
+ */
18
+ managedByHandler: boolean;
19
+ }
20
+ /** Routes an outgoing map-layer request through the pipeline of [[MapLayerFetchHandler]]s registered via
21
+ * [[MapLayerFormatRegistry.addMapLayerFetchHandler]]; issues the default send directly when there is none or
22
+ * every handler declines. A handler may decline, pass a copy of the request with other query parameters or
23
+ * headers to `fetchRequest` (which offers it to the remaining handlers, then sends it credentialed), call it
24
+ * any number of times, short-circuit with its own response, or throw [[MapLayerAuthenticationFailedError]].
25
+ * @internal
26
+ */
27
+ export declare function fetchMapLayerRequest(args: {
28
+ url: string;
29
+ formatId: string;
30
+ layerUrl: string;
31
+ /** The layer's provider-specific settings properties, exposed as [[MapLayerRequest.layerProperties]]. */
32
+ layerProperties?: MapLayerProviderProperties;
33
+ /** Pre-populated headers (e.g. settings-derived basic auth), if any. */
34
+ headers?: Headers;
35
+ /** The call site's default send. `credentialed` is true when the send may carry handler-injected credentials
36
+ * (every send requested by a handler), false when the request is our own original one (no handler, or all
37
+ * declined).
38
+ */
39
+ send: (request: MapLayerRequest, credentialed: boolean) => Promise<Response>;
40
+ }): Promise<MapLayerFetchResult>;
41
+ /** The redirect policy for a request that carries credentials: browser credentials (see
42
+ * [[MapLayerImageryProvider.includeUserCredentials]]), settings-derived basic auth, or values a fetch handler
43
+ * injected (see [[MapLayerFetchRequest]]).
44
+ *
45
+ * When [[MapLayerFormatRegistry.restrictCredentialsToTrustedOrigins]] is enabled, redirects are refused
46
+ * outright (`"error"`). `fetch` cannot be asked to follow only same-origin redirects, and by the time a
47
+ * followed redirect can be inspected the credentials have already been delivered to the destination — so
48
+ * refusing is the only way to honour the guarantee that credentials reach none but the origins listed in
49
+ * [[MapLayerFormatRegistry.trustedCredentialsOrigins]]. Legitimate same-origin redirects fail as a result;
50
+ * that is the cost of the opt-in restriction.
51
+ *
52
+ * When the restriction is disabled (the default), redirects are followed as before and
53
+ * [[MapLayerImageryProvider.checkCredentialedRedirect]] reports the destination after the fact.
54
+ * @internal
55
+ */
56
+ export declare function credentialedFetchRedirect(): RequestRedirect | undefined;
57
+ //# sourceMappingURL=MapLayerFetch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MapLayerFetch.d.ts","sourceRoot":"","sources":["../../../../../src/internal/tile/map/MapLayerFetch.ts"],"names":[],"mappings":"AAIA;;GAEG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AAErE;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,QAAQ,CAAC;IACnB;;;;;;OAMG;IACH,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAED;;;;;;GAMG;AACH,wBAAsB,oBAAoB,CAAC,IAAI,EAAE;IAC/C,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,yGAAyG;IACzG,eAAe,CAAC,EAAE,0BAA0B,CAAC;IAC7C,wEAAwE;IACxE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;OAGG;IACH,IAAI,EAAE,CAAC,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;CAC9E,GAAG,OAAO,CAAC,mBAAmB,CAAC,CA4D/B;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,yBAAyB,IAAI,eAAe,GAAG,SAAS,CAEvE"}
@@ -0,0 +1,91 @@
1
+ /*---------------------------------------------------------------------------------------------
2
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
3
+ * See LICENSE.md in the project root for license terms and full copyright notice.
4
+ *--------------------------------------------------------------------------------------------*/
5
+ /** @packageDocumentation
6
+ * @module Tiles
7
+ */
8
+ import { IModelApp } from "../../../IModelApp";
9
+ /** Routes an outgoing map-layer request through the pipeline of [[MapLayerFetchHandler]]s registered via
10
+ * [[MapLayerFormatRegistry.addMapLayerFetchHandler]]; issues the default send directly when there is none or
11
+ * every handler declines. A handler may decline, pass a copy of the request with other query parameters or
12
+ * headers to `fetchRequest` (which offers it to the remaining handlers, then sends it credentialed), call it
13
+ * any number of times, short-circuit with its own response, or throw [[MapLayerAuthenticationFailedError]].
14
+ * @internal
15
+ */
16
+ export async function fetchMapLayerRequest(args) {
17
+ const headers = args.headers ?? new Headers();
18
+ const { layerUrl, layerProperties, formatId } = args;
19
+ // Snapshot: registrations changing while a handler awaits must not shift the pipeline of a request in flight.
20
+ const handlers = [...(IModelApp.mapLayerFormatRegistry?.mapLayerFetchHandlers ?? [])];
21
+ let parsed;
22
+ if (handlers.length > 0) {
23
+ try {
24
+ // Relative URLs are valid targets (fetch resolves them against the document); resolve them the same way so
25
+ // they are not opted out of the pipeline. Parsing only: the URL sent stays the caller's unless its query changes.
26
+ parsed = new URL(args.url, typeof document !== "undefined" ? document.baseURI : undefined);
27
+ }
28
+ catch {
29
+ // Not a parseable URL; issue the original request unhandled.
30
+ }
31
+ }
32
+ if (!parsed) {
33
+ const unhandled = await args.send({ url: args.url, layerUrl, layerProperties, formatId, searchParams: new URLSearchParams(), headers }, false);
34
+ return { response: unhandled, managedByHandler: false };
35
+ }
36
+ const original = parsed;
37
+ const originalSearch = original.searchParams.toString();
38
+ const request = { url: args.url, layerUrl, layerProperties, formatId, searchParams: original.searchParams, headers };
39
+ // Copies the mutable fields (including provider properties and their arrays; `readonly` is shallow), so a handler that
40
+ // mutates its request in place and then declines cannot leak the mutation to the next handler or to the default
41
+ // send. The URL string stays ours verbatim (URL serialization would normalize it) unless the query parameters
42
+ // changed, in which case it is recomputed from them; the target never changes.
43
+ const snapshot = (source) => {
44
+ const searchParams = new URLSearchParams(source.searchParams);
45
+ let url = args.url;
46
+ if (searchParams.toString() !== originalSearch) {
47
+ const changed = new URL(original);
48
+ changed.search = searchParams.toString();
49
+ url = changed.toString();
50
+ }
51
+ // Properties are informational layer context, not handler-editable request data. Always clone the
52
+ // original settings, not source.layerProperties, so forwarding a modified copy cannot change that context.
53
+ return { url, layerUrl, layerProperties: layerProperties === undefined ? undefined : structuredClone(layerProperties), formatId, searchParams, headers: new Headers(source.headers) };
54
+ };
55
+ // Offers the request to handlers[index..]: a declined request goes unchanged to the next handler; a request a
56
+ // handler sends is offered to the remaining ones, then issued credentialed.
57
+ const dispatch = async (index, toOffer) => {
58
+ for (let i = index; i < handlers.length; ++i) {
59
+ const handled = await handlers[i](snapshot(toOffer), async (toSend) => {
60
+ const next = snapshot(toSend);
61
+ return (await dispatch(i + 1, next)) ?? args.send(next, true);
62
+ });
63
+ if (handled)
64
+ return handled;
65
+ }
66
+ return undefined;
67
+ };
68
+ const response = await dispatch(0, request);
69
+ if (response)
70
+ return { response, managedByHandler: true };
71
+ return { response: await args.send(request, false), managedByHandler: false };
72
+ }
73
+ /** The redirect policy for a request that carries credentials: browser credentials (see
74
+ * [[MapLayerImageryProvider.includeUserCredentials]]), settings-derived basic auth, or values a fetch handler
75
+ * injected (see [[MapLayerFetchRequest]]).
76
+ *
77
+ * When [[MapLayerFormatRegistry.restrictCredentialsToTrustedOrigins]] is enabled, redirects are refused
78
+ * outright (`"error"`). `fetch` cannot be asked to follow only same-origin redirects, and by the time a
79
+ * followed redirect can be inspected the credentials have already been delivered to the destination — so
80
+ * refusing is the only way to honour the guarantee that credentials reach none but the origins listed in
81
+ * [[MapLayerFormatRegistry.trustedCredentialsOrigins]]. Legitimate same-origin redirects fail as a result;
82
+ * that is the cost of the opt-in restriction.
83
+ *
84
+ * When the restriction is disabled (the default), redirects are followed as before and
85
+ * [[MapLayerImageryProvider.checkCredentialedRedirect]] reports the destination after the fact.
86
+ * @internal
87
+ */
88
+ export function credentialedFetchRedirect() {
89
+ return IModelApp.mapLayerFormatRegistry.restrictCredentialsToTrustedOrigins ? "error" : undefined;
90
+ }
91
+ //# sourceMappingURL=MapLayerFetch.js.map
@@ -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"]}
@@ -7,7 +7,7 @@
7
7
  * @internal
8
8
  */
9
9
  export function appendQueryParams(url, queryParams) {
10
- if (!queryParams)
10
+ if (!queryParams || Object.keys(queryParams).length === 0)
11
11
  return url;
12
12
  // create a lower-case array of keys
13
13
  const currentParams = [];
@@ -1 +1 @@
1
- {"version":3,"file":"UrlUtils.js","sourceRoot":"","sources":["../../../../../src/internal/tile/map/UrlUtils.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAE/F;;;KAGK;AACL,MAAM,UAAU,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;AAE/F;;;KAGK;AACL,MAAM,UAAU,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"}
@@ -6,6 +6,7 @@
6
6
  * @module Views
7
7
  */
8
8
  import WMS from "wms-capabilities";
9
+ import { IModelApp } from "../../../IModelApp";
9
10
  import { MapCartoRectangle, WmsUtilities } from "../../../tile/internal";
10
11
  function rangeFromJSONArray(json) {
11
12
  return (Array.isArray(json) && json.length === 4) ? MapCartoRectangle.fromDegrees(json[0], json[1], json[2], json[3]) : undefined;
@@ -204,12 +205,8 @@ export class WmsCapabilities {
204
205
  return undefined; // Degenerate capabilities document
205
206
  }
206
207
  }
207
- static async create(url, credentials, ignoreCache, queryParams) {
208
- if (!ignoreCache) {
209
- const cached = WmsCapabilities._capabilitiesCache.get(url);
210
- if (cached !== undefined)
211
- return cached;
212
- }
208
+ static async create(url, options) {
209
+ const { credentials, ignoreCache, queryParams, formatId, layerUrl, layerProperties } = options ?? {};
213
210
  const tmpUrl = new URL(WmsUtilities.getBaseUrl(url));
214
211
  tmpUrl.searchParams.append("request", "GetCapabilities");
215
212
  tmpUrl.searchParams.append("service", "WMS");
@@ -219,15 +216,25 @@ export class WmsCapabilities {
219
216
  tmpUrl.searchParams.append(paramKey, queryParams[paramKey]);
220
217
  });
221
218
  }
222
- const xmlCapabilities = await WmsUtilities.fetchXml(tmpUrl.toString(), credentials);
219
+ const cacheKey = tmpUrl.toString();
220
+ // The cache never contains credentialed results (see the write below), so a credentialed request
221
+ // must not be served a cached public document either; responses customized by the fetch handler
222
+ // must not be shared with or served from differently-customized requests.
223
+ const hasFetchHandler = (IModelApp.mapLayerFormatRegistry?.mapLayerFetchHandlers.length ?? 0) > 0;
224
+ if (!ignoreCache && !hasFetchHandler && !credentials) {
225
+ const cached = WmsCapabilities._capabilitiesCache.get(cacheKey);
226
+ if (cached !== undefined)
227
+ return cached;
228
+ }
229
+ const xmlCapabilities = await WmsUtilities.fetchXml(tmpUrl.toString(), { credentials, formatId: formatId ?? "WMS", layerUrl: layerUrl ?? url, layerProperties });
223
230
  if (!xmlCapabilities)
224
231
  return undefined;
225
232
  const capabilities = WmsCapabilities.tryParse(xmlCapabilities);
226
233
  if (capabilities === undefined)
227
234
  return undefined;
228
- if (!credentials) {
235
+ if (!credentials && !hasFetchHandler) {
229
236
  // Avoid caching protected data
230
- WmsCapabilities._capabilitiesCache.set(url, capabilities);
237
+ WmsCapabilities._capabilitiesCache.set(cacheKey, capabilities);
231
238
  }
232
239
  return capabilities;
233
240
  }
@@ -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":"AAAA;;;+FAG+F;AAC/F;;GAEG;AAGH,OAAO,GAAG,MAAM,kBAAkB,CAAC;AACnC,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAgC,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAEvG,SAAS,kBAAkB,CAAC,IAAS;IACnC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACpI,CAAC;AAED,SAAS,aAAa,CAAC,IAAS;IAC9B,IAAI,SAAS,KAAK,IAAI,CAAC,iBAAiB;QACtC,OAAO,kBAAkB,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;SAC/C,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,wBAAwB,CAAC,EAAE,CAAC;QACtD,OAAO,kBAAkB,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;IAC3D,CAAC;SAAM,CAAC;QACN,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC;YACjC,KAAK,MAAM,WAAW,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;gBAC3C,IAAI,WAAW,CAAC,GAAG,KAAK,QAAQ,IAAI,WAAW,CAAC,GAAG,KAAK,WAAW,EAAE,CAAC;oBACpE,OAAO,kBAAkB,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;gBAChD,CAAC;YACH,CAAC;QACH,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAI,KAAU;IAC9B,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AAC1D,CAAC;AAED;GACG;AACH,MAAM,KAAW,aAAa,CA2I7B;AA3ID,WAAiB,aAAa;IAE5B,MAAa,OAAO;QACF,IAAI,CAAS;QACb,KAAK,CAAU;QACf,QAAQ,CAAU;QAClB,cAAc,CAAU;QACxB,kBAAkB,CAAU;QAC5B,iBAAiB,CAAU;QAE3C,YAAY,IAAS;YACnB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YACvC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;YACxB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;YAC9B,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC;YAC1C,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,CAAC;YAClD,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,CAAC;QAClD,CAAC;KACF;IAhBY,qBAAO,UAgBnB,CAAA;IAED,MAAa,KAAK;QACA,SAAS,CAAU;QACnB,KAAK,CAAU;QACf,GAAG,CAAY;QACf,UAAU,CAAqB;QAC/B,SAAS,GAAG,IAAI,KAAK,EAAY,CAAC;QAC1C,MAAM,CAAU,gBAAgB,GAAG,GAAG,CAAC;QAE/C,YAAY,IAAS,EAAE,YAA6B;YAClD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;YAChC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;YACxB,IAAI,CAAC,GAAG,GAAG,SAAS,CAAS,YAAY,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC7E,IAAI,CAAC,UAAU,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;YACtC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC;QACxD,CAAC;QACM,YAAY,CAAC,OAAO,GAAG,IAAI;YAChC,MAAM,SAAS,GAAG,IAAI,KAAK,EAAoB,CAAC;YAChD,IAAI,KAAK,GAAG,CAAC,CAAC;YACd,IAAI,aAAa,GAAG,KAAK,CAAC;YAC1B,MAAM,YAAY,GAAG,CAAC,CAAC,QAAkB,EAAE,MAAe,EAAE,EAAE;gBAC5D,IAAI,QAAQ,CAAC;gBACb,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;gBACnB,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;oBACtB,aAAa,GAAG,KAAK,CAAC;oBACtB,QAAQ,GAAG,IAAI,KAAK,EAAU,CAAC;oBAC/B,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;wBAClC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;wBACrB,YAAY,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;oBAC1B,CAAC,CAAC,CAAC;gBACL,CAAC;gBACD,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;YAChG,CAAC,CAAC,CAAC;YACH,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC;YAE7D,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnB,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA8B,CAAC;gBACvD,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;oBAC7B,IAAI,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;wBACvE,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC;wBACrF,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;wBACnC,IAAI,KAAK;4BACP,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;;4BAErB,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;oBACrC,CAAC;gBACH,CAAC,CAAC,CAAC;gBACH,IAAI,QAAQ,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;oBACtB,iCAAiC;oBACjC,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;oBACrN,QAAQ,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE;wBACpC,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;4BACzB,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC;4BACrB,+CAA+C;4BAC/C,IAAI,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC,gBAAgB,CAAC,KAAK,CAAC;gCAC3E,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;wBACnF,CAAC,CAAC,CAAC;wBACH,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAY,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;oBAC7I,CAAC,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAED,OAAO,SAAS,CAAC;QACnB,CAAC;QAEM,eAAe,CAAC,eAAyB;YAC9C,MAAM,WAAW,GAAG,IAAI,GAAG,EAAoB,CAAC;YAEhD,MAAM,eAAe,GAAG,CAAC,CAAC,QAAkB,EAAE,EAAE;gBAC9C,IAAI,eAAe,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC5C,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC;gBAC/C,CAAC;gBACD,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;oBACtB,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;wBAClC,eAAe,CAAC,KAAK,CAAC,CAAC;oBACzB,CAAC,CAAC,CAAC;gBACL,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC;YAChE,OAAO,WAAW,CAAC;QACrB,CAAC;;IAhFU,mBAAK,QAiFjB,CAAA;IAED,MAAa,QAAQ;QAQ2D;QAP9D,IAAI,CAAS;QACb,KAAK,CAAS;QACd,GAAG,CAAW;QACd,MAAM,CAAW,CAAG,+DAA+D;QACnF,UAAU,CAAqB;QAC/B,QAAQ,CAAc;QACtB,SAAS,CAAU;QACnC,YAAmB,KAAU,EAAE,YAA6B,EAAkB,MAAiB;YAAjB,WAAM,GAAN,MAAM,CAAW;YAE7F,MAAM,YAAY,GAAG,CAAC,WAAqB,EAAE,MAAmB,EAAE,EAAE;gBAClE,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;gBAC9D,IAAI,WAAW,CAAC,MAAM,EAAE,CAAC;oBACvB,YAAY,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;gBAC3C,CAAC;YACH,CAAC,CAAC;YAEF,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YACzC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;YACzB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;YAChD,IAAI,CAAC,UAAU,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;YACvC,IAAI,CAAC,MAAM,GAAG,SAAS,CAAS,YAAY,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YACxF,MAAM,GAAG,GAAG,IAAI,GAAG,CAAS,IAAI,CAAC,MAAM,CAAC,CAAC;YACzC,IAAI,MAAM,EAAE,CAAC;gBACX,YAAY,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YAC5B,CAAC;YACD,IAAI,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC;YAEpB,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC/B,IAAI,CAAC,QAAQ,GAAG,IAAI,KAAK,EAAY,CAAC;gBACtC,KAAK,MAAM,UAAU,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;oBACrC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,UAAU,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC,CAAC;gBACnE,CAAC;YACH,CAAC;QACH,CAAC;KACF;IAnCY,sBAAQ,WAmCpB,CAAA;AACH,CAAC,EA3IgB,aAAa,KAAb,aAAa,QA2I7B;AAED,MAAM,OAAO,eAAe;IAWN;IAVZ,MAAM,CAAC,kBAAkB,GAAG,IAAI,GAAG,EAAuC,CAAC;IACnE,OAAO,CAAwB;IAC/B,OAAO,CAAU;IACjB,WAAW,CAAU;IACrB,KAAK,CAAuB;IAC5C,IAAW,IAAI,KAAK,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACxC,IAAW,QAAQ,KAAa,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC;IACxF,IAAW,UAAU,KAAoC,OAAO,IAAI,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC;IACzF,IAAW,oBAAoB,KAAK,OAAO,SAAS,KAAK,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC;IAC1G,IAAW,kBAAkB,KAA2B,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;IAC5M,YAAoB,KAAU;QAAV,UAAK,GAAL,KAAK,CAAK;QAC5B,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,KAAK,SAAS,IAAI,KAAK,CAAC,UAAU,KAAK,SAAS,CAAC;YACxG,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAE1D,IAAI,CAAC,OAAO,GAAG,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;QAC7E,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,OAAO,KAAK,SAAS,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAChF,IAAI,CAAC,OAAO,GAAG,IAAI,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;QAC9D,IAAI,KAAK,CAAC,UAAU,EAAE,KAAK;YACzB,IAAI,CAAC,KAAK,GAAG,IAAI,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACvE,CAAC;IAED,gHAAgH;IACxG,MAAM,CAAC,QAAQ,CAAC,eAAuB;QAC7C,yFAAyF;QACzF,8FAA8F;QAC9F,6EAA6E;QAC7E,MAAM,GAAG,GAAG,IAAI,SAAS,EAAE,CAAC,eAAe,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;QACzE,MAAM,QAAQ,GAAG,GAAG,CAAC,eAAe,EAAE,SAAS,CAAC;QAChD,IAAI,QAAQ,KAAK,kBAAkB,IAAI,QAAQ,KAAK,qBAAqB;YACvE,OAAO,SAAS,CAAC,CAAC,qCAAqC;QACzD,IAAI,GAAG,CAAC,oBAAoB,CAAC,aAAa,CAAC,CAAC,MAAM,GAAG,CAAC;YACpD,OAAO,SAAS,CAAC,CAAC,yDAAyD;QAE7E,IAAI,CAAC;YACH,OAAO,IAAI,eAAe,CAAC,IAAI,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC;QACnF,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,SAAS,CAAC,CAAC,mCAAmC;QACvD,CAAC;IACH,CAAC;IAEM,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAW,EAAE,OAAsC;QAC5E,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,eAAe,EAAE,GAAG,OAAO,IAAI,EAAE,CAAC;QACrG,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;QACrD,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;QACzD,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAC7C,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;gBAC5C,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC;oBACpC,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC;YAChE,CAAC,CAAC,CAAC;QACL,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;QACnC,iGAAiG;QACjG,gGAAgG;QAChG,0EAA0E;QAC1E,MAAM,eAAe,GAAG,CAAC,SAAS,CAAC,sBAAsB,EAAE,qBAAqB,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QAClG,IAAI,CAAC,WAAW,IAAI,CAAC,eAAe,IAAI,CAAC,WAAW,EAAE,CAAC;YACrD,MAAM,MAAM,GAAG,eAAe,CAAC,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAChE,IAAI,MAAM,KAAK,SAAS;gBACtB,OAAO,MAAM,CAAC;QAClB,CAAC;QAED,MAAM,eAAe,GAAG,MAAM,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,IAAI,KAAK,EAAE,QAAQ,EAAE,QAAQ,IAAI,GAAG,EAAE,eAAe,EAAE,CAAC,CAAC;QAEjK,IAAI,CAAC,eAAe;YAClB,OAAO,SAAS,CAAC;QAEnB,MAAM,YAAY,GAAG,eAAe,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;QAC/D,IAAI,YAAY,KAAK,SAAS;YAC5B,OAAO,SAAS,CAAC;QAEnB,IAAI,CAAC,WAAW,IAAI,CAAC,eAAe,EAAE,CAAC;YACrC,+BAA+B;YAC/B,eAAe,CAAC,kBAAkB,CAAC,GAAG,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QACjE,CAAC;QAED,OAAO,YAAY,CAAC;IACtB,CAAC;IACM,YAAY,CAAC,OAAO,GAAG,IAAI;QAChC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACnE,CAAC;IAEM,eAAe,CAAC,aAAuB;QAC5C,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC5E,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/** @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"}
@@ -5,10 +5,7 @@
5
5
  import { IModelApp } from "../../../IModelApp";
6
6
  import { HttpResponseError } from "../../../request/Request";
7
7
  import { headersIncludeAuthMethod, setBasicAuthorization } from "../../../request/utils";
8
- import { MapLayerUntrustedOriginError } from "../../../tile/internal";
9
- /** @packageDocumentation
10
- * @module Tiles
11
- */
8
+ import { credentialedFetchRedirect, fetchMapLayerRequest, MapLayerUntrustedOriginError, } from "../../../tile/internal";
12
9
  /** @internal */
13
10
  export class WmsUtilities {
14
11
  static getBaseUrl(url) {
@@ -19,21 +16,58 @@ export class WmsUtilities {
19
16
  * fetch XML from HTTP request
20
17
  * @param url server URL to address the request
21
18
  */
22
- static async fetchXml(url, credentials) {
19
+ static async fetchXml(url, options) {
20
+ const { credentials, formatId, layerUrl, layerProperties } = options ?? {};
23
21
  let headers;
24
- if (credentials && credentials.user && credentials.password) {
22
+ const hasCredentials = !!(credentials && credentials.user && credentials.password);
23
+ if (hasCredentials) {
25
24
  // Basic credentials are considered settings-derived credentials for this source. When the registry is
26
25
  // enforcing trusted origins, the source URL itself is the only implicitly trusted origin for basic auth;
27
26
  // opaque/custom-protocol URLs have no network origin and must therefore be treated as untrusted.
28
- const allowBasicAuth = !IModelApp.mapLayerFormatRegistry.restrictCredentialsToTrustedOrigins
27
+ // Optional chaining: some callers run before IModelApp startup.
28
+ const allowBasicAuth = !IModelApp.mapLayerFormatRegistry?.restrictCredentialsToTrustedOrigins
29
29
  || IModelApp.mapLayerFormatRegistry.isCredentialsSharingAllowed(url, url);
30
30
  if (allowBasicAuth) {
31
31
  headers = new Headers();
32
32
  setBasicAuthorization(headers, credentials);
33
33
  }
34
34
  }
35
- let response = await fetch(url, { method: "GET", headers });
36
- if (!headers && credentials && credentials.user && credentials.password && (response.status === 401 || response.status === 403)) {
35
+ const credentialsWithheld = hasCredentials && headers === undefined;
36
+ // Route the request through the registered fetch handler (if any). Handler failures — including
37
+ // MapLayerAuthenticationFailedError — propagate so callers can transition to RequireAuth.
38
+ const { response, managedByHandler } = await fetchMapLayerRequest({
39
+ url,
40
+ formatId: formatId ?? "",
41
+ layerUrl: layerUrl ?? url,
42
+ layerProperties,
43
+ headers,
44
+ send: async (request, credentialed) => {
45
+ const rsp = await fetch(request.url, {
46
+ method: "GET",
47
+ headers: request.headers,
48
+ // Sends the handler modified may carry injected secrets: same redirect policy as credentialed ones.
49
+ redirect: credentialed ? credentialedFetchRedirect() : undefined,
50
+ });
51
+ // A send the handler modified never falls back to the legacy basic-auth / NTLM-SSO handling:
52
+ // the handler is the authentication authority for it.
53
+ return credentialed ? rsp : WmsUtilities.handleLegacyChallenges(rsp, request.url, credentials, credentialsWithheld);
54
+ },
55
+ });
56
+ if (response.status !== 200) {
57
+ // A status in a response managed by the fetch handler is not an authentication failure (it would have
58
+ // thrown MapLayerAuthenticationFailedError): report it without a status so callers do not classify it.
59
+ if (managedByHandler)
60
+ throw new Error(`Map-layer fetch handler returned status ${response.status} for '${url}'`);
61
+ throw new HttpResponseError(response.status, await response.text());
62
+ }
63
+ return response.text();
64
+ }
65
+ /** Legacy (no injected credentials) challenge handling: basic-auth/untrusted-origin classification and the SSO retry.
66
+ * `credentialsWithheld` is true when basic credentials exist but were not attached because the origin is untrusted.
67
+ */
68
+ static async handleLegacyChallenges(firstResponse, url, credentials, credentialsWithheld) {
69
+ let response = firstResponse;
70
+ if (credentialsWithheld && (response.status === 401 || response.status === 403)) {
37
71
  throw new MapLayerUntrustedOriginError(url);
38
72
  }
39
73
  if (!credentials && response.status === 401 && headersIncludeAuthMethod(response.headers, ["ntlm", "negotiate"])) {
@@ -49,9 +83,7 @@ export class WmsUtilities {
49
83
  redirect: IModelApp.mapLayerFormatRegistry.restrictCredentialsToTrustedOrigins ? "error" : undefined,
50
84
  });
51
85
  }
52
- if (response.status !== 200)
53
- throw new HttpResponseError(response.status, await response.text());
54
- return response.text();
86
+ return response;
55
87
  }
56
88
  }
57
89
  //# sourceMappingURL=WmsUtilities.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"WmsUtilities.js","sourceRoot":"","sources":["../../../../../src/internal/tile/map/WmsUtilities.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAE/F,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAA2B,MAAM,0BAA0B,CAAC;AACtF,OAAO,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AACzF,OAAO,EAAE,4BAA4B,EAAE,MAAM,wBAAwB,CAAC;AAEtE;;GAEG;AAEH,gBAAgB;AAChB,MAAM,OAAO,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,SAAS,CAAC,sBAAsB,CAAC,mCAAmC;mBACvF,SAAS,CAAC,sBAAsB,CAAC,2BAA2B,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YAC5E,IAAI,cAAc,EAAE,CAAC;gBACnB,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;gBACxB,qBAAqB,CAAC,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,4BAA4B,CAAC,GAAG,CAAC,CAAC;QAC9C,CAAC;QACD,IAAI,CAAC,WAAW,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,wBAAwB,CAAC,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,SAAS,CAAC,sBAAsB,CAAC,YAAY,CAAC,aAAa,CAAC;gBAC/D,MAAM,IAAI,4BAA4B,CAAC,aAAa,CAAC,CAAC;YAExD,SAAS,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,SAAS,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,iBAAiB,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;QACtE,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;IACzB,CAAC;CACF","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