@itwin/core-frontend 5.16.0-dev.4 → 5.16.0-dev.5
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.
- package/lib/cjs/core-frontend.d.ts +1 -1
- package/lib/cjs/core-frontend.d.ts.map +1 -1
- package/lib/cjs/core-frontend.js +3 -2
- package/lib/cjs/core-frontend.js.map +1 -1
- package/lib/cjs/internal/cross-package.d.ts +1 -1
- package/lib/cjs/internal/cross-package.d.ts.map +1 -1
- package/lib/cjs/internal/cross-package.js +4 -1
- package/lib/cjs/internal/cross-package.js.map +1 -1
- package/lib/cjs/internal/tile/map/ArcGisUtilities.d.ts +15 -2
- package/lib/cjs/internal/tile/map/ArcGisUtilities.d.ts.map +1 -1
- package/lib/cjs/internal/tile/map/ArcGisUtilities.js +54 -29
- package/lib/cjs/internal/tile/map/ArcGisUtilities.js.map +1 -1
- package/lib/cjs/internal/tile/map/ImageryProviders/ArcGISImageryProvider.d.ts +14 -0
- package/lib/cjs/internal/tile/map/ImageryProviders/ArcGISImageryProvider.d.ts.map +1 -1
- package/lib/cjs/internal/tile/map/ImageryProviders/ArcGISImageryProvider.js +91 -45
- package/lib/cjs/internal/tile/map/ImageryProviders/ArcGISImageryProvider.js.map +1 -1
- package/lib/cjs/internal/tile/map/ImageryProviders/ArcGISMapLayerImageryProvider.d.ts.map +1 -1
- package/lib/cjs/internal/tile/map/ImageryProviders/ArcGISMapLayerImageryProvider.js +5 -4
- package/lib/cjs/internal/tile/map/ImageryProviders/ArcGISMapLayerImageryProvider.js.map +1 -1
- package/lib/cjs/internal/tile/map/ImageryProviders/WmsMapLayerImageryProvider.d.ts.map +1 -1
- package/lib/cjs/internal/tile/map/ImageryProviders/WmsMapLayerImageryProvider.js +8 -2
- package/lib/cjs/internal/tile/map/ImageryProviders/WmsMapLayerImageryProvider.js.map +1 -1
- package/lib/cjs/internal/tile/map/ImageryProviders/WmtsMapLayerImageryProvider.d.ts.map +1 -1
- package/lib/cjs/internal/tile/map/ImageryProviders/WmtsMapLayerImageryProvider.js +8 -2
- package/lib/cjs/internal/tile/map/ImageryProviders/WmtsMapLayerImageryProvider.js.map +1 -1
- package/lib/cjs/internal/tile/map/MapLayerFetch.d.ts +57 -0
- package/lib/cjs/internal/tile/map/MapLayerFetch.d.ts.map +1 -0
- package/lib/cjs/internal/tile/map/MapLayerFetch.js +95 -0
- package/lib/cjs/internal/tile/map/MapLayerFetch.js.map +1 -0
- package/lib/cjs/internal/tile/map/UrlUtils.js +1 -1
- package/lib/cjs/internal/tile/map/UrlUtils.js.map +1 -1
- package/lib/cjs/internal/tile/map/WmsCapabilities.d.ts +2 -5
- package/lib/cjs/internal/tile/map/WmsCapabilities.d.ts.map +1 -1
- package/lib/cjs/internal/tile/map/WmsCapabilities.js +16 -9
- package/lib/cjs/internal/tile/map/WmsCapabilities.js.map +1 -1
- package/lib/cjs/internal/tile/map/WmsUtilities.d.ts +29 -1
- package/lib/cjs/internal/tile/map/WmsUtilities.d.ts.map +1 -1
- package/lib/cjs/internal/tile/map/WmsUtilities.js +43 -11
- package/lib/cjs/internal/tile/map/WmsUtilities.js.map +1 -1
- package/lib/cjs/internal/tile/map/WmtsCapabilities.d.ts +2 -5
- package/lib/cjs/internal/tile/map/WmtsCapabilities.d.ts.map +1 -1
- package/lib/cjs/internal/tile/map/WmtsCapabilities.js +16 -9
- package/lib/cjs/internal/tile/map/WmtsCapabilities.js.map +1 -1
- package/lib/cjs/tile/internal.d.ts +2 -0
- package/lib/cjs/tile/internal.d.ts.map +1 -1
- package/lib/cjs/tile/internal.js +2 -0
- package/lib/cjs/tile/internal.js.map +1 -1
- package/lib/cjs/tile/map/MapLayerFetchHandler.d.ts +94 -0
- package/lib/cjs/tile/map/MapLayerFetchHandler.d.ts.map +1 -0
- package/lib/cjs/tile/map/MapLayerFetchHandler.js +10 -0
- package/lib/cjs/tile/map/MapLayerFetchHandler.js.map +1 -0
- package/lib/cjs/tile/map/MapLayerFormatRegistry.d.ts +27 -1
- package/lib/cjs/tile/map/MapLayerFormatRegistry.d.ts.map +1 -1
- package/lib/cjs/tile/map/MapLayerFormatRegistry.js +42 -1
- package/lib/cjs/tile/map/MapLayerFormatRegistry.js.map +1 -1
- package/lib/cjs/tile/map/MapLayerImageryFormats.d.ts.map +1 -1
- package/lib/cjs/tile/map/MapLayerImageryFormats.js +20 -4
- package/lib/cjs/tile/map/MapLayerImageryFormats.js.map +1 -1
- package/lib/cjs/tile/map/MapLayerImageryProvider.d.ts +28 -16
- package/lib/cjs/tile/map/MapLayerImageryProvider.d.ts.map +1 -1
- package/lib/cjs/tile/map/MapLayerImageryProvider.js +134 -66
- package/lib/cjs/tile/map/MapLayerImageryProvider.js.map +1 -1
- package/lib/cjs/tile/map/MapLayerSources.d.ts +19 -4
- package/lib/cjs/tile/map/MapLayerSources.d.ts.map +1 -1
- package/lib/cjs/tile/map/MapLayerSources.js +28 -11
- package/lib/cjs/tile/map/MapLayerSources.js.map +1 -1
- package/lib/esm/core-frontend.d.ts +1 -1
- package/lib/esm/core-frontend.d.ts.map +1 -1
- package/lib/esm/core-frontend.js +1 -1
- package/lib/esm/core-frontend.js.map +1 -1
- package/lib/esm/internal/cross-package.d.ts +1 -1
- package/lib/esm/internal/cross-package.d.ts.map +1 -1
- package/lib/esm/internal/cross-package.js +1 -1
- package/lib/esm/internal/cross-package.js.map +1 -1
- package/lib/esm/internal/tile/map/ArcGisUtilities.d.ts +15 -2
- package/lib/esm/internal/tile/map/ArcGisUtilities.d.ts.map +1 -1
- package/lib/esm/internal/tile/map/ArcGisUtilities.js +55 -30
- package/lib/esm/internal/tile/map/ArcGisUtilities.js.map +1 -1
- package/lib/esm/internal/tile/map/ImageryProviders/ArcGISImageryProvider.d.ts +14 -0
- package/lib/esm/internal/tile/map/ImageryProviders/ArcGISImageryProvider.d.ts.map +1 -1
- package/lib/esm/internal/tile/map/ImageryProviders/ArcGISImageryProvider.js +92 -46
- package/lib/esm/internal/tile/map/ImageryProviders/ArcGISImageryProvider.js.map +1 -1
- package/lib/esm/internal/tile/map/ImageryProviders/ArcGISMapLayerImageryProvider.d.ts.map +1 -1
- package/lib/esm/internal/tile/map/ImageryProviders/ArcGISMapLayerImageryProvider.js +5 -4
- package/lib/esm/internal/tile/map/ImageryProviders/ArcGISMapLayerImageryProvider.js.map +1 -1
- package/lib/esm/internal/tile/map/ImageryProviders/WmsMapLayerImageryProvider.d.ts.map +1 -1
- package/lib/esm/internal/tile/map/ImageryProviders/WmsMapLayerImageryProvider.js +9 -3
- package/lib/esm/internal/tile/map/ImageryProviders/WmsMapLayerImageryProvider.js.map +1 -1
- package/lib/esm/internal/tile/map/ImageryProviders/WmtsMapLayerImageryProvider.d.ts.map +1 -1
- package/lib/esm/internal/tile/map/ImageryProviders/WmtsMapLayerImageryProvider.js +9 -3
- package/lib/esm/internal/tile/map/ImageryProviders/WmtsMapLayerImageryProvider.js.map +1 -1
- package/lib/esm/internal/tile/map/MapLayerFetch.d.ts +57 -0
- package/lib/esm/internal/tile/map/MapLayerFetch.d.ts.map +1 -0
- package/lib/esm/internal/tile/map/MapLayerFetch.js +91 -0
- package/lib/esm/internal/tile/map/MapLayerFetch.js.map +1 -0
- package/lib/esm/internal/tile/map/UrlUtils.js +1 -1
- package/lib/esm/internal/tile/map/UrlUtils.js.map +1 -1
- package/lib/esm/internal/tile/map/WmsCapabilities.d.ts +2 -5
- package/lib/esm/internal/tile/map/WmsCapabilities.d.ts.map +1 -1
- package/lib/esm/internal/tile/map/WmsCapabilities.js +16 -9
- package/lib/esm/internal/tile/map/WmsCapabilities.js.map +1 -1
- package/lib/esm/internal/tile/map/WmsUtilities.d.ts +29 -1
- package/lib/esm/internal/tile/map/WmsUtilities.d.ts.map +1 -1
- package/lib/esm/internal/tile/map/WmsUtilities.js +44 -12
- package/lib/esm/internal/tile/map/WmsUtilities.js.map +1 -1
- package/lib/esm/internal/tile/map/WmtsCapabilities.d.ts +2 -5
- package/lib/esm/internal/tile/map/WmtsCapabilities.d.ts.map +1 -1
- package/lib/esm/internal/tile/map/WmtsCapabilities.js +16 -9
- package/lib/esm/internal/tile/map/WmtsCapabilities.js.map +1 -1
- package/lib/esm/tile/internal.d.ts +2 -0
- package/lib/esm/tile/internal.d.ts.map +1 -1
- package/lib/esm/tile/internal.js +2 -0
- package/lib/esm/tile/internal.js.map +1 -1
- package/lib/esm/tile/map/MapLayerFetchHandler.d.ts +94 -0
- package/lib/esm/tile/map/MapLayerFetchHandler.d.ts.map +1 -0
- package/lib/esm/tile/map/MapLayerFetchHandler.js +9 -0
- package/lib/esm/tile/map/MapLayerFetchHandler.js.map +1 -0
- package/lib/esm/tile/map/MapLayerFormatRegistry.d.ts +27 -1
- package/lib/esm/tile/map/MapLayerFormatRegistry.d.ts.map +1 -1
- package/lib/esm/tile/map/MapLayerFormatRegistry.js +40 -0
- package/lib/esm/tile/map/MapLayerFormatRegistry.js.map +1 -1
- package/lib/esm/tile/map/MapLayerImageryFormats.d.ts.map +1 -1
- package/lib/esm/tile/map/MapLayerImageryFormats.js +21 -5
- package/lib/esm/tile/map/MapLayerImageryFormats.js.map +1 -1
- package/lib/esm/tile/map/MapLayerImageryProvider.d.ts +28 -16
- package/lib/esm/tile/map/MapLayerImageryProvider.d.ts.map +1 -1
- package/lib/esm/tile/map/MapLayerImageryProvider.js +136 -68
- package/lib/esm/tile/map/MapLayerImageryProvider.js.map +1 -1
- package/lib/esm/tile/map/MapLayerSources.d.ts +19 -4
- package/lib/esm/tile/map/MapLayerSources.d.ts.map +1 -1
- package/lib/esm/tile/map/MapLayerSources.js +28 -11
- package/lib/esm/tile/map/MapLayerSources.js.map +1 -1
- package/package.json +20 -20
|
@@ -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"]}
|
|
@@ -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;
|
|
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 {
|
|
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,
|
|
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":"AAIA;;GAEG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;
|
|
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,
|
|
208
|
-
|
|
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
|
|
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(
|
|
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":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Views\r\n */\r\n\r\nimport { MapSubLayerProps } from \"@itwin/core-common\";\r\nimport WMS from \"wms-capabilities\";\r\nimport { IModelApp } from \"../../../IModelApp\";\r\nimport { MapCartoRectangle, WmsCapabilitiesCreateOptions, WmsUtilities } from \"../../../tile/internal\";\r\n\r\nfunction rangeFromJSONArray(json: any): MapCartoRectangle | undefined {\r\n return (Array.isArray(json) && json.length === 4) ? MapCartoRectangle.fromDegrees(json[0], json[1], json[2], json[3]) : undefined;\r\n}\r\n\r\nfunction rangeFromJSON(json: any): MapCartoRectangle | undefined {\r\n if (undefined !== json.LatLonBoundingBox)\r\n return rangeFromJSONArray(json.LatLonBoundingBox);\r\n else if (Array.isArray(json.EX_GeographicBoundingBox)) {\r\n return rangeFromJSONArray(json.EX_GeographicBoundingBox);\r\n } else {\r\n if (Array.isArray(json.BoundingBox))\r\n for (const boundingBox of json.BoundingBox) {\r\n if (boundingBox.crs === \"CRS:84\" || boundingBox.crs === \"EPSG:4326\") {\r\n return rangeFromJSONArray(boundingBox.extent);\r\n }\r\n }\r\n return undefined;\r\n }\r\n}\r\n\r\nfunction initArray<T>(input: any): undefined | T[] {\r\n return Array.isArray(input) ? input.slice() : undefined;\r\n}\r\n\r\n/** Encapsulation of the capabilities for an WMS server\r\n */\r\nexport namespace WmsCapability {\r\n\r\n export class Service {\r\n public readonly name: string;\r\n public readonly title?: string;\r\n public readonly abstract?: string;\r\n public readonly onlineResource?: string;\r\n public readonly contactInformation?: string;\r\n public readonly accessConstraints?: string;\r\n\r\n constructor(json: any) {\r\n this.name = json.Name ? json.Name : \"\";\r\n this.title = json.Title;\r\n this.abstract = json.Abstract;\r\n this.onlineResource = json.OnlineResource;\r\n this.contactInformation = json.ContactInformation;\r\n this.accessConstraints = json.AccessConstraints;\r\n }\r\n }\r\n\r\n export class Layer {\r\n public readonly queryable: boolean;\r\n public readonly title?: string;\r\n public readonly srs?: string[];\r\n public readonly cartoRange?: MapCartoRectangle;\r\n public readonly subLayers = new Array<SubLayer>();\r\n private static readonly PREFIX_SEPARATOR = \":\";\r\n\r\n constructor(json: any, capabilities: WmsCapabilities) {\r\n this.queryable = json.queryable;\r\n this.title = json.title;\r\n this.srs = initArray<string>(capabilities.isVersion13 ? json.CRS : json.SRS);\r\n this.cartoRange = rangeFromJSON(json);\r\n this.subLayers.push(new SubLayer(json, capabilities));\r\n }\r\n public getSubLayers(visible = true): MapSubLayerProps[] {\r\n const subLayers = new Array<MapSubLayerProps>();\r\n let index = 1;\r\n let childrenFound = false;\r\n const pushSubLayer = ((subLayer: SubLayer, parent?: number) => {\r\n let children;\r\n const id = index++;\r\n if (subLayer.children) {\r\n childrenFound = false;\r\n children = new Array<number>();\r\n subLayer.children.forEach((child) => {\r\n children.push(index);\r\n pushSubLayer(child, id);\r\n });\r\n }\r\n subLayers.push({ name: subLayer.name, title: subLayer.title, visible, parent, children, id });\r\n });\r\n this.subLayers.forEach((subLayer) => pushSubLayer(subLayer));\r\n\r\n if (!childrenFound) {\r\n const prefixed = new Map<string, MapSubLayerProps[]>();\r\n subLayers.forEach((subLayer) => {\r\n if (subLayer.name && subLayer.name.indexOf(Layer.PREFIX_SEPARATOR) > 0) {\r\n const prefix = subLayer.name.slice(0, subLayer.name.indexOf(Layer.PREFIX_SEPARATOR));\r\n const found = prefixed.get(prefix);\r\n if (found)\r\n found.push(subLayer);\r\n else\r\n prefixed.set(prefix, [subLayer]);\r\n }\r\n });\r\n if (prefixed.size > 1) {\r\n // Preserve the root node if any.\r\n const rootNode = (this.subLayers.length === 1 && this.subLayers[0].children && this.subLayers[0].children.length > 1) ? subLayers.find((curSubLayer) => this.subLayers[0].name === curSubLayer.name)?.id : undefined;\r\n prefixed.forEach((children, parent) => {\r\n children.forEach((child) => {\r\n child.parent = index;\r\n // Remove the prefix from the title if present.\r\n if (child.title && child.title.indexOf(parent + Layer.PREFIX_SEPARATOR) === 0)\r\n child.title = child.title.slice(parent.length + Layer.PREFIX_SEPARATOR.length);\r\n });\r\n subLayers.push({ name: \"\", title: parent, parent: rootNode, id: index++, children: children.map((child) => child.id as number), visible });\r\n });\r\n }\r\n }\r\n\r\n return subLayers;\r\n }\r\n\r\n public getSubLayersCrs(layerNameFilter: string[]): Map<string, string[]> {\r\n const subLayerCrs = new Map<string, string[]>();\r\n\r\n const processSubLayer = ((subLayer: SubLayer) => {\r\n if (layerNameFilter.includes(subLayer.name)) {\r\n subLayerCrs.set(subLayer.name, subLayer.crs);\r\n }\r\n if (subLayer.children) {\r\n subLayer.children.forEach((child) => {\r\n processSubLayer(child);\r\n });\r\n }\r\n });\r\n\r\n this.subLayers.forEach((subLayer) => processSubLayer(subLayer));\r\n return subLayerCrs;\r\n }\r\n }\r\n\r\n export class SubLayer {\r\n public readonly name: string;\r\n public readonly title: string;\r\n public readonly crs: string[];\r\n public readonly ownCrs: string[]; // CRS specific to this layer (ie. not including inherited CRS)\r\n public readonly cartoRange?: MapCartoRectangle;\r\n public readonly children?: SubLayer[];\r\n public readonly queryable: boolean;\r\n public constructor(_json: any, capabilities: WmsCapabilities, public readonly parent?: SubLayer) {\r\n\r\n const getParentCrs = (parentLayer: SubLayer, crsSet: Set<string>) => {\r\n parentLayer.crs.forEach((parentCrs) => crsSet.add(parentCrs));\r\n if (parentLayer.parent) {\r\n getParentCrs(parentLayer.parent, crsSet);\r\n }\r\n };\r\n\r\n this.name = _json.Name ? _json.Name : \"\";\r\n this.title = _json.Title;\r\n this.queryable = _json.queryable ? true : false;\r\n this.cartoRange = rangeFromJSON(_json);\r\n this.ownCrs = initArray<string>(capabilities.isVersion13 ? _json.CRS : _json.SRS) ?? [];\r\n const crs = new Set<string>(this.ownCrs);\r\n if (parent) {\r\n getParentCrs(parent, crs);\r\n }\r\n this.crs = [...crs];\r\n\r\n if (Array.isArray(_json.Layer)) {\r\n this.children = new Array<SubLayer>();\r\n for (const childLayer of _json.Layer) {\r\n this.children.push(new SubLayer(childLayer, capabilities, this));\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport class WmsCapabilities {\r\n private static _capabilitiesCache = new Map<string, WmsCapabilities | undefined>();\r\n public readonly service: WmsCapability.Service;\r\n public readonly version?: string;\r\n public readonly isVersion13: boolean;\r\n public readonly layer?: WmsCapability.Layer;\r\n public get json() { return this._json; }\r\n public get maxLevel(): number { return this.layer ? this.layer.subLayers.length : - 1; }\r\n public get cartoRange(): MapCartoRectangle | undefined { return this.layer?.cartoRange; }\r\n public get featureInfoSupported() { return undefined !== this._json.Capability?.Request?.GetFeatureInfo; }\r\n public get featureInfoFormats(): string[] | undefined { return Array.isArray(this._json.Capability?.Request?.GetFeatureInfo?.Format) ? this._json.Capability?.Request?.GetFeatureInfo?.Format : undefined; }\r\n constructor(private _json: any) {\r\n if (!_json || typeof _json !== \"object\" || (_json.Service === undefined && _json.Capability === undefined))\r\n throw new Error(\"Invalid WMS GetCapabilities response\");\r\n\r\n this.version = typeof _json.version === \"string\" ? _json.version : undefined;\r\n this.isVersion13 = this.version !== undefined && this.version.startsWith(\"1.3\");\r\n this.service = new WmsCapability.Service(_json.Service ?? {});\r\n if (_json.Capability?.Layer)\r\n this.layer = new WmsCapability.Layer(_json.Capability.Layer, this);\r\n }\r\n\r\n /** Parse a GetCapabilities XML response, returning undefined if it is not a valid WMS capabilities document. */\r\n private static tryParse(xmlCapabilities: string): WmsCapabilities | undefined {\r\n // Validate the document is actually rooted at a WMS capabilities element before parsing:\r\n // wms-capabilities happily parses any root and recognizes direct Service/Capability children.\r\n // WMS 1.3.0 uses WMS_Capabilities; WMS 1.0.0-1.1.1 uses WMT_MS_Capabilities.\r\n const doc = new DOMParser().parseFromString(xmlCapabilities, \"text/xml\");\r\n const rootName = doc.documentElement?.localName;\r\n if (rootName !== \"WMS_Capabilities\" && rootName !== \"WMT_MS_Capabilities\")\r\n return undefined; // Not a WMS GetCapabilities document\r\n if (doc.getElementsByTagName(\"parsererror\").length > 0)\r\n return undefined; // XML parse error (browsers embed a parsererror element)\r\n\r\n try {\r\n return new WmsCapabilities(new WMS(undefined, DOMParser).parse(xmlCapabilities));\r\n } catch {\r\n return undefined; // Degenerate capabilities document\r\n }\r\n }\r\n\r\n public static async create(url: string, options?: WmsCapabilitiesCreateOptions): Promise<WmsCapabilities | undefined> {\r\n const { credentials, ignoreCache, queryParams, formatId, layerUrl, layerProperties } = options ?? {};\r\n const tmpUrl = new URL(WmsUtilities.getBaseUrl(url));\r\n tmpUrl.searchParams.append(\"request\", \"GetCapabilities\");\r\n tmpUrl.searchParams.append(\"service\", \"WMS\");\r\n if (queryParams) {\r\n Object.keys(queryParams).forEach((paramKey) => {\r\n if (!tmpUrl.searchParams.has(paramKey))\r\n tmpUrl.searchParams.append(paramKey, queryParams[paramKey]);\r\n });\r\n }\r\n const cacheKey = tmpUrl.toString();\r\n // The cache never contains credentialed results (see the write below), so a credentialed request\r\n // must not be served a cached public document either; responses customized by the fetch handler\r\n // must not be shared with or served from differently-customized requests.\r\n const hasFetchHandler = (IModelApp.mapLayerFormatRegistry?.mapLayerFetchHandlers.length ?? 0) > 0;\r\n if (!ignoreCache && !hasFetchHandler && !credentials) {\r\n const cached = WmsCapabilities._capabilitiesCache.get(cacheKey);\r\n if (cached !== undefined)\r\n return cached;\r\n }\r\n\r\n const xmlCapabilities = await WmsUtilities.fetchXml(tmpUrl.toString(), { credentials, formatId: formatId ?? \"WMS\", layerUrl: layerUrl ?? url, layerProperties });\r\n\r\n if (!xmlCapabilities)\r\n return undefined;\r\n\r\n const capabilities = WmsCapabilities.tryParse(xmlCapabilities);\r\n if (capabilities === undefined)\r\n return undefined;\r\n\r\n if (!credentials && !hasFetchHandler) {\r\n // Avoid caching protected data\r\n WmsCapabilities._capabilitiesCache.set(cacheKey, capabilities);\r\n }\r\n\r\n return capabilities;\r\n }\r\n public getSubLayers(visible = true): undefined | MapSubLayerProps[] {\r\n return this.layer ? this.layer.getSubLayers(visible) : undefined;\r\n }\r\n\r\n public getSubLayersCrs(subLayerNames: string[]): Map<string, string[]> | undefined {\r\n return this.layer ? this.layer.getSubLayersCrs(subLayerNames) : undefined;\r\n }\r\n}\r\n"]}
|
|
@@ -1,7 +1,31 @@
|
|
|
1
1
|
import { RequestBasicCredentials } from "../../../request/Request";
|
|
2
|
+
import type { MapLayerProviderProperties } from "@itwin/core-common";
|
|
2
3
|
/** @packageDocumentation
|
|
3
4
|
* @module Tiles
|
|
4
5
|
*/
|
|
6
|
+
/** Options for a capabilities/XML request routed through the registered [[MapLayerFetchHandler]]s, if any.
|
|
7
|
+
* @internal
|
|
8
|
+
*/
|
|
9
|
+
export interface WmsFetchOptions {
|
|
10
|
+
credentials?: RequestBasicCredentials;
|
|
11
|
+
/** The id of the map-layer format the request is made for, passed to the handler as [[MapLayerRequest.formatId]]. */
|
|
12
|
+
formatId?: string;
|
|
13
|
+
/** The map-layer source URL, passed to the handler as [[MapLayerRequest.layerUrl]]. Defaults to the request URL,
|
|
14
|
+
* which callers should avoid: capabilities request URLs differ from the layer's. */
|
|
15
|
+
layerUrl?: string;
|
|
16
|
+
/** The layer's provider-specific settings properties, passed to the handler as [[MapLayerRequest.layerProperties]]. */
|
|
17
|
+
layerProperties?: MapLayerProviderProperties;
|
|
18
|
+
}
|
|
19
|
+
/** Options for [[WmsCapabilities.create]] and [[WmtsCapabilities.create]].
|
|
20
|
+
* @internal
|
|
21
|
+
*/
|
|
22
|
+
export interface WmsCapabilitiesCreateOptions extends WmsFetchOptions {
|
|
23
|
+
ignoreCache?: boolean;
|
|
24
|
+
/** Custom query parameters appended to the GetCapabilities request. */
|
|
25
|
+
queryParams?: {
|
|
26
|
+
[key: string]: string;
|
|
27
|
+
};
|
|
28
|
+
}
|
|
5
29
|
/** @internal */
|
|
6
30
|
export declare class WmsUtilities {
|
|
7
31
|
static getBaseUrl(url: string): string;
|
|
@@ -9,6 +33,10 @@ export declare class WmsUtilities {
|
|
|
9
33
|
* fetch XML from HTTP request
|
|
10
34
|
* @param url server URL to address the request
|
|
11
35
|
*/
|
|
12
|
-
static fetchXml(url: string,
|
|
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;
|
|
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,
|
|
19
|
+
static async fetchXml(url, options) {
|
|
20
|
+
const { credentials, formatId, layerUrl, layerProperties } = options ?? {};
|
|
23
21
|
let headers;
|
|
24
|
-
|
|
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
|
-
|
|
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
|
-
|
|
36
|
-
|
|
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
|
-
|
|
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;
|
|
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 {
|
|
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,
|
|
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
|