@fedify/vocab-runtime 2.1.27 → 2.1.29
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/deno.json +1 -1
- package/dist/mod.cjs +4 -2
- package/dist/mod.js +4 -2
- package/dist/tests/{body-tMF7v1Wt.cjs → body-BI7IK9DK.cjs} +1 -1
- package/dist/tests/{body-pQw7TnzP.mjs → body-C-p-RXaQ.mjs} +1 -1
- package/dist/tests/body.test.cjs +1 -1
- package/dist/tests/body.test.mjs +1 -1
- package/dist/tests/decimal.test.cjs +1 -1
- package/dist/tests/decimal.test.mjs +1 -1
- package/dist/tests/{docloader-B7owxMYS.mjs → docloader-DVamy9FW.mjs} +5 -3
- package/dist/tests/{docloader-DOROiNle.cjs → docloader-Okt4FgM8.cjs} +5 -3
- package/dist/tests/docloader.test.cjs +50 -2
- package/dist/tests/docloader.test.mjs +50 -2
- package/dist/tests/{request-BBg4llPR.mjs → request-B9R4Y9qS.mjs} +1 -1
- package/dist/tests/{request-D0CNu0d0.cjs → request-C_PrlGe_.cjs} +1 -1
- package/dist/tests/request.test.cjs +1 -1
- package/dist/tests/request.test.mjs +1 -1
- package/package.json +1 -1
- package/src/docloader.test.ts +90 -0
- package/src/docloader.ts +5 -1
package/deno.json
CHANGED
package/dist/mod.cjs
CHANGED
|
@@ -4593,7 +4593,7 @@ const preloadedContexts = {
|
|
|
4593
4593
|
//#endregion
|
|
4594
4594
|
//#region deno.json
|
|
4595
4595
|
var name = "@fedify/vocab-runtime";
|
|
4596
|
-
var version = "2.1.
|
|
4596
|
+
var version = "2.1.29";
|
|
4597
4597
|
//#endregion
|
|
4598
4598
|
//#region src/request.ts
|
|
4599
4599
|
/**
|
|
@@ -5253,7 +5253,9 @@ function getDocumentLoader({ allowPrivateAddress, skipPreloadedContexts, userAge
|
|
|
5253
5253
|
const tracer = _opentelemetry_api.trace.getTracerProvider().getTracer(name, version);
|
|
5254
5254
|
async function load(url, options, redirected = 0, visited = /* @__PURE__ */ new Set()) {
|
|
5255
5255
|
options?.signal?.throwIfAborted();
|
|
5256
|
-
const
|
|
5256
|
+
const parsedUrl = new URL(url);
|
|
5257
|
+
if (parsedUrl.protocol !== "http:" && parsedUrl.protocol !== "https:") throw new UrlError(`Unsupported protocol: ${parsedUrl.protocol}`);
|
|
5258
|
+
const currentUrl = parsedUrl.href;
|
|
5257
5259
|
if (!skipPreloadedContexts && currentUrl in preloadedContexts) {
|
|
5258
5260
|
logger.debug("Using preloaded context: {url}.", { url: currentUrl });
|
|
5259
5261
|
return {
|
package/dist/mod.js
CHANGED
|
@@ -4588,7 +4588,7 @@ const preloadedContexts = {
|
|
|
4588
4588
|
//#endregion
|
|
4589
4589
|
//#region deno.json
|
|
4590
4590
|
var name = "@fedify/vocab-runtime";
|
|
4591
|
-
var version = "2.1.
|
|
4591
|
+
var version = "2.1.29";
|
|
4592
4592
|
//#endregion
|
|
4593
4593
|
//#region src/request.ts
|
|
4594
4594
|
/**
|
|
@@ -5248,7 +5248,9 @@ function getDocumentLoader({ allowPrivateAddress, skipPreloadedContexts, userAge
|
|
|
5248
5248
|
const tracer = trace.getTracerProvider().getTracer(name, version);
|
|
5249
5249
|
async function load(url, options, redirected = 0, visited = /* @__PURE__ */ new Set()) {
|
|
5250
5250
|
options?.signal?.throwIfAborted();
|
|
5251
|
-
const
|
|
5251
|
+
const parsedUrl = new URL(url);
|
|
5252
|
+
if (parsedUrl.protocol !== "http:" && parsedUrl.protocol !== "https:") throw new UrlError(`Unsupported protocol: ${parsedUrl.protocol}`);
|
|
5253
|
+
const currentUrl = parsedUrl.href;
|
|
5252
5254
|
if (!skipPreloadedContexts && currentUrl in preloadedContexts) {
|
|
5253
5255
|
logger.debug("Using preloaded context: {url}.", { url: currentUrl });
|
|
5254
5256
|
return {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
require("./chunk-Do9eywBl.cjs");
|
|
2
|
-
const require_request = require("./request-
|
|
2
|
+
const require_request = require("./request-C_PrlGe_.cjs");
|
|
3
3
|
let _logtape_logtape = require("@logtape/logtape");
|
|
4
4
|
//#region src/body.ts
|
|
5
5
|
/** Decoded JSON body limit: 16 MiB. @internal */
|
package/dist/tests/body.test.cjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
require("./chunk-Do9eywBl.cjs");
|
|
2
|
-
const require_body = require("./body-
|
|
2
|
+
const require_body = require("./body-BI7IK9DK.cjs");
|
|
3
3
|
let node_assert_strict = require("node:assert/strict");
|
|
4
4
|
let node_test = require("node:test");
|
|
5
5
|
let node_zlib = require("node:zlib");
|
package/dist/tests/body.test.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { r as readBoundedText, t as BodyTooLargeError } from "./body-
|
|
1
|
+
import { r as readBoundedText, t as BodyTooLargeError } from "./body-C-p-RXaQ.mjs";
|
|
2
2
|
import { deepStrictEqual, ok, rejects } from "node:assert/strict";
|
|
3
3
|
import { test } from "node:test";
|
|
4
4
|
import { gunzipSync, gzipSync } from "node:zlib";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { a as name, i as logRequest, n as createActivityPubRequest, o as version, t as FetchError } from "./request-
|
|
2
|
-
import { n as MAX_BODY_SIZE, r as readBoundedText } from "./body-
|
|
1
|
+
import { a as name, i as logRequest, n as createActivityPubRequest, o as version, t as FetchError } from "./request-B9R4Y9qS.mjs";
|
|
2
|
+
import { n as MAX_BODY_SIZE, r as readBoundedText } from "./body-C-p-RXaQ.mjs";
|
|
3
3
|
import { t as HttpHeaderLink } from "./link-CYszIegt.mjs";
|
|
4
4
|
import { o as validatePublicUrl, t as UrlError } from "./url-3fyJuqC0.mjs";
|
|
5
5
|
import { getLogger } from "@logtape/logtape";
|
|
@@ -4703,7 +4703,9 @@ function getDocumentLoader({ allowPrivateAddress, skipPreloadedContexts, userAge
|
|
|
4703
4703
|
const tracer = trace.getTracerProvider().getTracer(name, version);
|
|
4704
4704
|
async function load(url, options, redirected = 0, visited = /* @__PURE__ */ new Set()) {
|
|
4705
4705
|
options?.signal?.throwIfAborted();
|
|
4706
|
-
const
|
|
4706
|
+
const parsedUrl = new URL(url);
|
|
4707
|
+
if (parsedUrl.protocol !== "http:" && parsedUrl.protocol !== "https:") throw new UrlError(`Unsupported protocol: ${parsedUrl.protocol}`);
|
|
4708
|
+
const currentUrl = parsedUrl.href;
|
|
4707
4709
|
if (!skipPreloadedContexts && currentUrl in preloadedContexts) {
|
|
4708
4710
|
logger.debug("Using preloaded context: {url}.", { url: currentUrl });
|
|
4709
4711
|
return {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
require("./chunk-Do9eywBl.cjs");
|
|
2
|
-
const require_request = require("./request-
|
|
3
|
-
const require_body = require("./body-
|
|
2
|
+
const require_request = require("./request-C_PrlGe_.cjs");
|
|
3
|
+
const require_body = require("./body-BI7IK9DK.cjs");
|
|
4
4
|
const require_link = require("./link-qDTmjPw_.cjs");
|
|
5
5
|
const require_url = require("./url-vZTgkIZg.cjs");
|
|
6
6
|
let _logtape_logtape = require("@logtape/logtape");
|
|
@@ -4704,7 +4704,9 @@ function getDocumentLoader({ allowPrivateAddress, skipPreloadedContexts, userAge
|
|
|
4704
4704
|
const tracer = _opentelemetry_api.trace.getTracerProvider().getTracer(require_request.name, require_request.version);
|
|
4705
4705
|
async function load(url, options, redirected = 0, visited = /* @__PURE__ */ new Set()) {
|
|
4706
4706
|
options?.signal?.throwIfAborted();
|
|
4707
|
-
const
|
|
4707
|
+
const parsedUrl = new URL(url);
|
|
4708
|
+
if (parsedUrl.protocol !== "http:" && parsedUrl.protocol !== "https:") throw new require_url.UrlError(`Unsupported protocol: ${parsedUrl.protocol}`);
|
|
4709
|
+
const currentUrl = parsedUrl.href;
|
|
4708
4710
|
if (!skipPreloadedContexts && currentUrl in preloadedContexts) {
|
|
4709
4711
|
logger.debug("Using preloaded context: {url}.", { url: currentUrl });
|
|
4710
4712
|
return {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
const require_chunk = require("./chunk-Do9eywBl.cjs");
|
|
2
|
-
const require_request = require("./request-
|
|
3
|
-
const require_docloader = require("./docloader-
|
|
2
|
+
const require_request = require("./request-C_PrlGe_.cjs");
|
|
3
|
+
const require_docloader = require("./docloader-Okt4FgM8.cjs");
|
|
4
4
|
const require_url = require("./url-vZTgkIZg.cjs");
|
|
5
5
|
let node_zlib = require("node:zlib");
|
|
6
6
|
let _logtape_logtape = require("@logtape/logtape");
|
|
@@ -2003,4 +2003,52 @@ var jsonld_default = jsonld_dist_jsonld_esm_js.default;
|
|
|
2003
2003
|
esm_default.hardReset();
|
|
2004
2004
|
}
|
|
2005
2005
|
});
|
|
2006
|
+
const unsupportedUrls = [
|
|
2007
|
+
"ftp://example.com/collection",
|
|
2008
|
+
"file:///collection",
|
|
2009
|
+
`data:application/ld+json,${encodeURIComponent(JSON.stringify({ id: "https://example.com/data" }))}`
|
|
2010
|
+
];
|
|
2011
|
+
function isUnsupportedProtocolError(error, url) {
|
|
2012
|
+
return error instanceof require_url.UrlError && error.message === `Unsupported protocol: ${new URL(url).protocol}` && error.reason === "disallowed";
|
|
2013
|
+
}
|
|
2014
|
+
async function withFetchStub(respond, callback) {
|
|
2015
|
+
const fetched = [];
|
|
2016
|
+
const originalFetch = globalThis.fetch;
|
|
2017
|
+
globalThis.fetch = (input) => {
|
|
2018
|
+
const url = input instanceof Request ? input.url : String(input);
|
|
2019
|
+
fetched.push(url);
|
|
2020
|
+
return Promise.resolve(respond(url));
|
|
2021
|
+
};
|
|
2022
|
+
try {
|
|
2023
|
+
await callback(fetched);
|
|
2024
|
+
} finally {
|
|
2025
|
+
globalThis.fetch = originalFetch;
|
|
2026
|
+
}
|
|
2027
|
+
}
|
|
2028
|
+
for (const url of unsupportedUrls) {
|
|
2029
|
+
const scheme = new URL(url).protocol;
|
|
2030
|
+
(0, _fedify_fixture.test)(`getDocumentLoader() rejects ${scheme} URLs with private addresses allowed before fetching`, async () => {
|
|
2031
|
+
await withFetchStub(() => Response.json({}), async (fetched) => {
|
|
2032
|
+
await (0, node_assert.rejects)(require_docloader.getDocumentLoader({ allowPrivateAddress: true })(url), (e) => isUnsupportedProtocolError(e, url));
|
|
2033
|
+
(0, node_assert.deepStrictEqual)(fetched, []);
|
|
2034
|
+
});
|
|
2035
|
+
});
|
|
2036
|
+
(0, _fedify_fixture.test)(`getDocumentLoader() rejects redirects to ${scheme} URLs with private addresses allowed`, async () => {
|
|
2037
|
+
const start = "https://example.com/redirect-to-unsupported";
|
|
2038
|
+
await withFetchStub(() => Response.redirect(url, 302), async (fetched) => {
|
|
2039
|
+
await (0, node_assert.rejects)(require_docloader.getDocumentLoader({ allowPrivateAddress: true })(start), (e) => isUnsupportedProtocolError(e, url));
|
|
2040
|
+
(0, node_assert.deepStrictEqual)(fetched, [start]);
|
|
2041
|
+
});
|
|
2042
|
+
});
|
|
2043
|
+
for (const html of [false, true]) (0, _fedify_fixture.test)(`getDocumentLoader() rejects ${html ? "HTML" : "Link header"} alternates to ${scheme} URLs with private addresses allowed`, async () => {
|
|
2044
|
+
const start = "https://example.com/alternate-to-unsupported";
|
|
2045
|
+
await withFetchStub(() => html ? new Response(`<link rel="alternate" type="application/activity+json" href="${url}">`, { headers: { "Content-Type": "text/html" } }) : new Response("", { headers: {
|
|
2046
|
+
"Content-Type": "text/plain",
|
|
2047
|
+
Link: `<${url}>; rel="alternate"; type="application/activity+json"`
|
|
2048
|
+
} }), async (fetched) => {
|
|
2049
|
+
await (0, node_assert.rejects)(require_docloader.getDocumentLoader({ allowPrivateAddress: true })(start), (e) => isUnsupportedProtocolError(e, url));
|
|
2050
|
+
(0, node_assert.deepStrictEqual)(fetched, [start]);
|
|
2051
|
+
});
|
|
2052
|
+
});
|
|
2053
|
+
}
|
|
2006
2054
|
//#endregion
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { t as FetchError } from "./request-
|
|
2
|
-
import { i as cid_v1_default, n as getRemoteDocument, r as preloadedContexts, t as getDocumentLoader } from "./docloader-
|
|
1
|
+
import { t as FetchError } from "./request-B9R4Y9qS.mjs";
|
|
2
|
+
import { i as cid_v1_default, n as getRemoteDocument, r as preloadedContexts, t as getDocumentLoader } from "./docloader-DVamy9FW.mjs";
|
|
3
3
|
import { t as UrlError } from "./url-3fyJuqC0.mjs";
|
|
4
4
|
import { gzipSync } from "node:zlib";
|
|
5
5
|
import { configure, reset } from "@logtape/logtape";
|
|
@@ -2020,5 +2020,53 @@ test("getDocumentLoader() rejects cancellation before fetching", async () => {
|
|
|
2020
2020
|
esm_default.hardReset();
|
|
2021
2021
|
}
|
|
2022
2022
|
});
|
|
2023
|
+
const unsupportedUrls = [
|
|
2024
|
+
"ftp://example.com/collection",
|
|
2025
|
+
"file:///collection",
|
|
2026
|
+
`data:application/ld+json,${encodeURIComponent(JSON.stringify({ id: "https://example.com/data" }))}`
|
|
2027
|
+
];
|
|
2028
|
+
function isUnsupportedProtocolError(error, url) {
|
|
2029
|
+
return error instanceof UrlError && error.message === `Unsupported protocol: ${new URL(url).protocol}` && error.reason === "disallowed";
|
|
2030
|
+
}
|
|
2031
|
+
async function withFetchStub(respond, callback) {
|
|
2032
|
+
const fetched = [];
|
|
2033
|
+
const originalFetch = globalThis.fetch;
|
|
2034
|
+
globalThis.fetch = (input) => {
|
|
2035
|
+
const url = input instanceof Request ? input.url : String(input);
|
|
2036
|
+
fetched.push(url);
|
|
2037
|
+
return Promise.resolve(respond(url));
|
|
2038
|
+
};
|
|
2039
|
+
try {
|
|
2040
|
+
await callback(fetched);
|
|
2041
|
+
} finally {
|
|
2042
|
+
globalThis.fetch = originalFetch;
|
|
2043
|
+
}
|
|
2044
|
+
}
|
|
2045
|
+
for (const url of unsupportedUrls) {
|
|
2046
|
+
const scheme = new URL(url).protocol;
|
|
2047
|
+
test(`getDocumentLoader() rejects ${scheme} URLs with private addresses allowed before fetching`, async () => {
|
|
2048
|
+
await withFetchStub(() => Response.json({}), async (fetched) => {
|
|
2049
|
+
await rejects(getDocumentLoader({ allowPrivateAddress: true })(url), (e) => isUnsupportedProtocolError(e, url));
|
|
2050
|
+
deepStrictEqual(fetched, []);
|
|
2051
|
+
});
|
|
2052
|
+
});
|
|
2053
|
+
test(`getDocumentLoader() rejects redirects to ${scheme} URLs with private addresses allowed`, async () => {
|
|
2054
|
+
const start = "https://example.com/redirect-to-unsupported";
|
|
2055
|
+
await withFetchStub(() => Response.redirect(url, 302), async (fetched) => {
|
|
2056
|
+
await rejects(getDocumentLoader({ allowPrivateAddress: true })(start), (e) => isUnsupportedProtocolError(e, url));
|
|
2057
|
+
deepStrictEqual(fetched, [start]);
|
|
2058
|
+
});
|
|
2059
|
+
});
|
|
2060
|
+
for (const html of [false, true]) test(`getDocumentLoader() rejects ${html ? "HTML" : "Link header"} alternates to ${scheme} URLs with private addresses allowed`, async () => {
|
|
2061
|
+
const start = "https://example.com/alternate-to-unsupported";
|
|
2062
|
+
await withFetchStub(() => html ? new Response(`<link rel="alternate" type="application/activity+json" href="${url}">`, { headers: { "Content-Type": "text/html" } }) : new Response("", { headers: {
|
|
2063
|
+
"Content-Type": "text/plain",
|
|
2064
|
+
Link: `<${url}>; rel="alternate"; type="application/activity+json"`
|
|
2065
|
+
} }), async (fetched) => {
|
|
2066
|
+
await rejects(getDocumentLoader({ allowPrivateAddress: true })(start), (e) => isUnsupportedProtocolError(e, url));
|
|
2067
|
+
deepStrictEqual(fetched, [start]);
|
|
2068
|
+
});
|
|
2069
|
+
});
|
|
2070
|
+
}
|
|
2023
2071
|
//#endregion
|
|
2024
2072
|
export {};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
const require_chunk = require("./chunk-Do9eywBl.cjs");
|
|
2
|
-
const require_request = require("./request-
|
|
2
|
+
const require_request = require("./request-C_PrlGe_.cjs");
|
|
3
3
|
let node_test = require("node:test");
|
|
4
4
|
let node_process = require("node:process");
|
|
5
5
|
node_process = require_chunk.__toESM(node_process);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { o as version, r as getUserAgent } from "./request-
|
|
1
|
+
import { o as version, r as getUserAgent } from "./request-B9R4Y9qS.mjs";
|
|
2
2
|
import { test } from "node:test";
|
|
3
3
|
import process from "node:process";
|
|
4
4
|
import { deepStrictEqual } from "node:assert";
|
package/package.json
CHANGED
package/src/docloader.test.ts
CHANGED
|
@@ -1092,3 +1092,93 @@ test("getDocumentLoader() rejects cancellation before fetching", async () => {
|
|
|
1092
1092
|
fetchMock.hardReset();
|
|
1093
1093
|
}
|
|
1094
1094
|
});
|
|
1095
|
+
|
|
1096
|
+
const unsupportedUrls = [
|
|
1097
|
+
"ftp://example.com/collection",
|
|
1098
|
+
"file:///collection",
|
|
1099
|
+
`data:application/ld+json,${
|
|
1100
|
+
encodeURIComponent(JSON.stringify({ id: "https://example.com/data" }))
|
|
1101
|
+
}`,
|
|
1102
|
+
];
|
|
1103
|
+
|
|
1104
|
+
function isUnsupportedProtocolError(error: unknown, url: string): boolean {
|
|
1105
|
+
return error instanceof UrlError &&
|
|
1106
|
+
error.message === `Unsupported protocol: ${new URL(url).protocol}` &&
|
|
1107
|
+
error.reason === "disallowed";
|
|
1108
|
+
}
|
|
1109
|
+
|
|
1110
|
+
async function withFetchStub(
|
|
1111
|
+
respond: (url: string) => Response,
|
|
1112
|
+
callback: (fetched: string[]) => Promise<void>,
|
|
1113
|
+
): Promise<void> {
|
|
1114
|
+
const fetched: string[] = [];
|
|
1115
|
+
const originalFetch = globalThis.fetch;
|
|
1116
|
+
globalThis.fetch = (input: RequestInfo | URL) => {
|
|
1117
|
+
const url = input instanceof Request ? input.url : String(input);
|
|
1118
|
+
fetched.push(url);
|
|
1119
|
+
return Promise.resolve(respond(url));
|
|
1120
|
+
};
|
|
1121
|
+
try {
|
|
1122
|
+
await callback(fetched);
|
|
1123
|
+
} finally {
|
|
1124
|
+
globalThis.fetch = originalFetch;
|
|
1125
|
+
}
|
|
1126
|
+
}
|
|
1127
|
+
|
|
1128
|
+
for (const url of unsupportedUrls) {
|
|
1129
|
+
const scheme = new URL(url).protocol;
|
|
1130
|
+
|
|
1131
|
+
test(`getDocumentLoader() rejects ${scheme} URLs with private addresses allowed before fetching`, async () => {
|
|
1132
|
+
await withFetchStub(() => Response.json({}), async (fetched) => {
|
|
1133
|
+
await rejects(
|
|
1134
|
+
getDocumentLoader({ allowPrivateAddress: true })(url),
|
|
1135
|
+
(e) => isUnsupportedProtocolError(e, url),
|
|
1136
|
+
);
|
|
1137
|
+
deepStrictEqual(fetched, []);
|
|
1138
|
+
});
|
|
1139
|
+
});
|
|
1140
|
+
|
|
1141
|
+
test(`getDocumentLoader() rejects redirects to ${scheme} URLs with private addresses allowed`, async () => {
|
|
1142
|
+
const start = "https://example.com/redirect-to-unsupported";
|
|
1143
|
+
await withFetchStub(() => Response.redirect(url, 302), async (fetched) => {
|
|
1144
|
+
await rejects(
|
|
1145
|
+
getDocumentLoader({ allowPrivateAddress: true })(start),
|
|
1146
|
+
(e) => isUnsupportedProtocolError(e, url),
|
|
1147
|
+
);
|
|
1148
|
+
deepStrictEqual(fetched, [start]);
|
|
1149
|
+
});
|
|
1150
|
+
});
|
|
1151
|
+
|
|
1152
|
+
for (const html of [false, true]) {
|
|
1153
|
+
test(
|
|
1154
|
+
`getDocumentLoader() rejects ${
|
|
1155
|
+
html ? "HTML" : "Link header"
|
|
1156
|
+
} alternates to ${scheme} URLs with private addresses allowed`,
|
|
1157
|
+
async () => {
|
|
1158
|
+
const start = "https://example.com/alternate-to-unsupported";
|
|
1159
|
+
await withFetchStub(
|
|
1160
|
+
() =>
|
|
1161
|
+
html
|
|
1162
|
+
? new Response(
|
|
1163
|
+
`<link rel="alternate" type="application/activity+json" href="${url}">`,
|
|
1164
|
+
{ headers: { "Content-Type": "text/html" } },
|
|
1165
|
+
)
|
|
1166
|
+
: new Response("", {
|
|
1167
|
+
headers: {
|
|
1168
|
+
"Content-Type": "text/plain",
|
|
1169
|
+
Link:
|
|
1170
|
+
`<${url}>; rel="alternate"; type="application/activity+json"`,
|
|
1171
|
+
},
|
|
1172
|
+
}),
|
|
1173
|
+
async (fetched) => {
|
|
1174
|
+
await rejects(
|
|
1175
|
+
getDocumentLoader({ allowPrivateAddress: true })(start),
|
|
1176
|
+
(e) => isUnsupportedProtocolError(e, url),
|
|
1177
|
+
);
|
|
1178
|
+
deepStrictEqual(fetched, [start]);
|
|
1179
|
+
},
|
|
1180
|
+
);
|
|
1181
|
+
},
|
|
1182
|
+
);
|
|
1183
|
+
}
|
|
1184
|
+
}
|
package/src/docloader.ts
CHANGED
|
@@ -303,7 +303,11 @@ export function getDocumentLoader(
|
|
|
303
303
|
visited = new Set<string>(),
|
|
304
304
|
): Promise<RemoteDocument> {
|
|
305
305
|
options?.signal?.throwIfAborted();
|
|
306
|
-
const
|
|
306
|
+
const parsedUrl = new URL(url);
|
|
307
|
+
if (parsedUrl.protocol !== "http:" && parsedUrl.protocol !== "https:") {
|
|
308
|
+
throw new UrlError(`Unsupported protocol: ${parsedUrl.protocol}`);
|
|
309
|
+
}
|
|
310
|
+
const currentUrl = parsedUrl.href;
|
|
307
311
|
if (!skipPreloadedContexts && currentUrl in preloadedContexts) {
|
|
308
312
|
logger.debug("Using preloaded context: {url}.", { url: currentUrl });
|
|
309
313
|
return {
|