@plurnk/plurnk-schemes-http 1.3.12 → 1.5.0
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/.env.defaults +18 -46
- package/README.md +74 -23
- package/SPEC.md +487 -124
- package/dist/Config.d.ts +3 -0
- package/dist/Config.d.ts.map +1 -0
- package/dist/Config.js +18 -0
- package/dist/Config.js.map +1 -0
- package/dist/ContentType.d.ts +2 -0
- package/dist/ContentType.d.ts.map +1 -0
- package/dist/ContentType.js +15 -0
- package/dist/ContentType.js.map +1 -0
- package/dist/ErrorDetail.d.ts +6 -0
- package/dist/ErrorDetail.d.ts.map +1 -0
- package/dist/ErrorDetail.js +19 -0
- package/dist/ErrorDetail.js.map +1 -0
- package/dist/Guard.d.ts +1 -1
- package/dist/Guard.d.ts.map +1 -1
- package/dist/Guard.js +95 -55
- package/dist/Guard.js.map +1 -1
- package/dist/Http.d.ts +3 -16
- package/dist/Http.d.ts.map +1 -1
- package/dist/Http.js +817 -331
- package/dist/Http.js.map +1 -1
- package/dist/TavilyExtract.d.ts +35 -0
- package/dist/TavilyExtract.d.ts.map +1 -0
- package/dist/TavilyExtract.js +204 -0
- package/dist/TavilyExtract.js.map +1 -0
- package/dist/WebFetcher.d.ts +88 -18
- package/dist/WebFetcher.d.ts.map +1 -1
- package/dist/WebFetcher.js +588 -70
- package/dist/WebFetcher.js.map +1 -1
- package/dist/Ws.d.ts +7 -3
- package/dist/Ws.d.ts.map +1 -1
- package/dist/Ws.js +432 -96
- package/dist/Ws.js.map +1 -1
- package/dist/index.d.ts +2 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -10
- package/dist/index.js.map +1 -1
- package/docs/http.md +108 -53
- package/docs/wss.md +39 -43
- package/package.json +14 -13
- package/dist/Browser.d.ts +0 -84
- package/dist/Browser.d.ts.map +0 -1
- package/dist/Browser.js +0 -273
- package/dist/Browser.js.map +0 -1
- package/scripts/install-browser.mjs +0 -19
package/dist/Config.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Config.d.ts","sourceRoot":"","sources":["../src/Config.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,4BAA4B,QAAS,MAAM,KAAG,MAU1D,CAAC;AAEF,eAAO,MAAM,yBAAyB,QAAS,MAAM,KAAG,MAIvD,CAAC"}
|
package/dist/Config.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export const requireNonNegativeIntegerEnv = (key) => {
|
|
2
|
+
const raw = process.env[key];
|
|
3
|
+
if (raw === undefined || raw.trim().length === 0) {
|
|
4
|
+
throw new Error(`${key} is unset.`);
|
|
5
|
+
}
|
|
6
|
+
const value = Number(raw);
|
|
7
|
+
if (!Number.isSafeInteger(value) || value < 0) {
|
|
8
|
+
throw new Error(`${key} must be a non-negative integer.`);
|
|
9
|
+
}
|
|
10
|
+
return value;
|
|
11
|
+
};
|
|
12
|
+
export const requirePositiveIntegerEnv = (key) => {
|
|
13
|
+
const value = requireNonNegativeIntegerEnv(key);
|
|
14
|
+
if (value === 0)
|
|
15
|
+
throw new Error(`${key} must be a positive integer.`);
|
|
16
|
+
return value;
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=Config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Config.js","sourceRoot":"","sources":["../src/Config.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,GAAW,EAAU,EAAE;IAChE,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/C,MAAM,IAAI,KAAK,CAAC,GAAG,GAAG,YAAY,CAAC,CAAC;IACxC,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1B,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QAC5C,MAAM,IAAI,KAAK,CAAC,GAAG,GAAG,kCAAkC,CAAC,CAAC;IAC9D,CAAC;IACD,OAAO,KAAK,CAAC;AACjB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,GAAW,EAAU,EAAE;IAC7D,MAAM,KAAK,GAAG,4BAA4B,CAAC,GAAG,CAAC,CAAC;IAChD,IAAI,KAAK,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,GAAG,8BAA8B,CAAC,CAAC;IACvE,OAAO,KAAK,CAAC;AACjB,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ContentType.d.ts","sourceRoot":"","sources":["../src/ContentType.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,gBAAgB,gBAAiB,MAAM,GAAG,IAAI,KAAG,MAO7D,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
// HTTP response media-type normalization {§http-text-decoding}. Classification
|
|
2
|
+
// consumes the WHATWG MIME essence; invalid or absent metadata is not text proof.
|
|
3
|
+
import { MIMEType } from "node:util";
|
|
4
|
+
const UNKNOWN_RESPONSE_MIMETYPE = "application/octet-stream";
|
|
5
|
+
export const responseMimetype = (contentType) => {
|
|
6
|
+
if (contentType === null)
|
|
7
|
+
return UNKNOWN_RESPONSE_MIMETYPE;
|
|
8
|
+
try {
|
|
9
|
+
return new MIMEType(contentType).essence;
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
return UNKNOWN_RESPONSE_MIMETYPE;
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=ContentType.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ContentType.js","sourceRoot":"","sources":["../src/ContentType.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,kFAAkF;AAElF,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAErC,MAAM,yBAAyB,GAAG,0BAA0B,CAAC;AAE7D,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,WAA0B,EAAU,EAAE;IACnE,IAAI,WAAW,KAAK,IAAI;QAAE,OAAO,yBAAyB,CAAC;IAC3D,IAAI,CAAC;QACD,OAAO,IAAI,QAAQ,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,yBAAyB,CAAC;IACrC,CAAC;AACL,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ErrorDetail.d.ts","sourceRoot":"","sources":["../src/ErrorDetail.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB,2CAA2C,CAAC;AAE3E,MAAM,CAAC,OAAO,OAAO,WAAW;IAC5B,MAAM,CAAC,eAAe,IAAI,MAAM,CAU/B;IAED,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAGpD;CACJ"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export const ERROR_DETAIL_LIMIT = "PLURNK_SCHEMES_HTTP_ERROR_DETAIL_LIMIT";
|
|
2
|
+
export default class ErrorDetail {
|
|
3
|
+
static configuredLimit() {
|
|
4
|
+
const raw = process.env[ERROR_DETAIL_LIMIT];
|
|
5
|
+
if (raw === undefined || raw === "") {
|
|
6
|
+
throw new Error(`${ERROR_DETAIL_LIMIT} must be set.`);
|
|
7
|
+
}
|
|
8
|
+
const limit = Number(raw);
|
|
9
|
+
if (!Number.isSafeInteger(limit) || limit < 0) {
|
|
10
|
+
throw new Error(`${ERROR_DETAIL_LIMIT} must be a non-negative integer.`);
|
|
11
|
+
}
|
|
12
|
+
return limit;
|
|
13
|
+
}
|
|
14
|
+
static preview(value, limit) {
|
|
15
|
+
const text = value instanceof Error ? value.message : String(value);
|
|
16
|
+
return text.length > limit ? `${text.slice(0, limit)}...` : text;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=ErrorDetail.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ErrorDetail.js","sourceRoot":"","sources":["../src/ErrorDetail.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,kBAAkB,GAAG,wCAAwC,CAAC;AAE3E,MAAM,CAAC,OAAO,OAAO,WAAW;IAC5B,MAAM,CAAC,eAAe;QAClB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;QAC5C,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,EAAE,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,GAAG,kBAAkB,eAAe,CAAC,CAAC;QAC1D,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAC1B,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YAC5C,MAAM,IAAI,KAAK,CAAC,GAAG,kBAAkB,kCAAkC,CAAC,CAAC;QAC7E,CAAC;QACD,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,MAAM,CAAC,OAAO,CAAC,KAAc,EAAE,KAAa;QACxC,MAAM,IAAI,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACpE,OAAO,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;IACrE,CAAC;CACJ"}
|
package/dist/Guard.d.ts
CHANGED
|
@@ -8,7 +8,7 @@ export default class Guard {
|
|
|
8
8
|
static fetch(raw: string, init: {
|
|
9
9
|
method: string;
|
|
10
10
|
body: string | undefined;
|
|
11
|
-
headers:
|
|
11
|
+
headers: ReadonlyArray<readonly [string, string]>;
|
|
12
12
|
}, signal: AbortSignal): Promise<Response>;
|
|
13
13
|
}
|
|
14
14
|
//# sourceMappingURL=Guard.d.ts.map
|
package/dist/Guard.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Guard.d.ts","sourceRoot":"","sources":["../src/Guard.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Guard.d.ts","sourceRoot":"","sources":["../src/Guard.ts"],"names":[],"mappings":"AA8DA,qBAAa,iBAAkB,SAAQ,KAAK;IACxC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,YAAY,GAAG,EAAE,MAAM,EAKtB;CACJ;AAED,MAAM,CAAC,OAAO,OAAO,KAAK;IAGtB,MAAM,CAAC,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAM1C;IAID,OAAa,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CActD;IAOD,OAAa,KAAK,CACd,GAAG,EAAE,MAAM,EACX,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;QAAC,OAAO,EAAE,aAAa,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;KAAE,EACrG,MAAM,EAAE,WAAW,GACpB,OAAO,CAAC,QAAQ,CAAC,CA4BnB;CACJ"}
|
package/dist/Guard.js
CHANGED
|
@@ -1,59 +1,82 @@
|
|
|
1
|
-
//
|
|
2
|
-
//
|
|
3
|
-
//
|
|
4
|
-
//
|
|
5
|
-
// are followed MANUALLY and re-guarded per hop. The residual DNS-rebinding
|
|
6
|
-
// sliver (the runtime re-resolves after our check) is accepted day-one, same as
|
|
7
|
-
// the reference. Byte path only day-one; the chromium render navigation is a
|
|
8
|
-
// separate surface tracked on #456.
|
|
1
|
+
// {§automatic-fetch-check} — WebFetcher's initial byte target and every
|
|
2
|
+
// redirect hop must resolve only to ordinary globally reachable unicast
|
|
3
|
+
// addresses. Redirects are followed manually so checking and Fetch-standard
|
|
4
|
+
// request transitions share one automatic-acquisition seam.
|
|
9
5
|
import dns from "node:dns/promises";
|
|
10
6
|
import net from "node:net";
|
|
11
|
-
import {
|
|
12
|
-
|
|
13
|
-
|
|
7
|
+
import { requireNonNegativeIntegerEnv } from "./Config.js";
|
|
8
|
+
const BLOCKED = new net.BlockList();
|
|
9
|
+
for (const [network, prefix] of [
|
|
10
|
+
["0.0.0.0", 8],
|
|
11
|
+
["10.0.0.0", 8],
|
|
12
|
+
["100.64.0.0", 10],
|
|
13
|
+
["127.0.0.0", 8],
|
|
14
|
+
["169.254.0.0", 16],
|
|
15
|
+
["172.16.0.0", 12],
|
|
16
|
+
["192.0.0.0", 24],
|
|
17
|
+
["192.0.2.0", 24],
|
|
18
|
+
["192.88.99.0", 24],
|
|
19
|
+
["192.168.0.0", 16],
|
|
20
|
+
["198.18.0.0", 15],
|
|
21
|
+
["198.51.100.0", 24],
|
|
22
|
+
["203.0.113.0", 24],
|
|
23
|
+
["224.0.0.0", 4],
|
|
24
|
+
["240.0.0.0", 4],
|
|
25
|
+
])
|
|
26
|
+
BLOCKED.addSubnet(network, prefix, "ipv4");
|
|
27
|
+
for (const [network, prefix] of [
|
|
28
|
+
["2001::", 23],
|
|
29
|
+
["2001:db8::", 32],
|
|
30
|
+
["2002::", 16],
|
|
31
|
+
["3fff::", 20],
|
|
32
|
+
])
|
|
33
|
+
BLOCKED.addSubnet(network, prefix, "ipv6");
|
|
34
|
+
const IPV4_MAPPED = new net.BlockList();
|
|
35
|
+
IPV4_MAPPED.addSubnet("0.0.0.0", 0, "ipv4");
|
|
36
|
+
const GLOBAL_IPV6 = new net.BlockList();
|
|
37
|
+
GLOBAL_IPV6.addSubnet("2000::", 3, "ipv6");
|
|
38
|
+
const REDIRECT_STATUSES = new Set([301, 302, 303, 307, 308]);
|
|
39
|
+
const BODY_HEADERS = new Set(["content-encoding", "content-language", "content-location", "content-type"]);
|
|
40
|
+
const AUTHORIZATION_HEADERS = new Set(["authorization"]);
|
|
41
|
+
const withoutHeaders = (headers, names) => headers
|
|
42
|
+
.filter(([name]) => !names.has(name.toLowerCase()))
|
|
43
|
+
.map(([name, value]) => [name, value]);
|
|
44
|
+
const safeUrl = (raw) => {
|
|
45
|
+
try {
|
|
46
|
+
const url = new URL(raw);
|
|
47
|
+
url.username = "";
|
|
48
|
+
url.password = "";
|
|
49
|
+
return url.href;
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return raw;
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
// A target (or redirect hop) that automatic acquisition cannot follow.
|
|
14
56
|
export class GuardBlockedError extends Error {
|
|
15
57
|
url;
|
|
16
58
|
constructor(url) {
|
|
17
|
-
|
|
59
|
+
const sanitized = safeUrl(url);
|
|
60
|
+
super(`Automatic fetch check: ${sanitized} is not a public http(s) target`);
|
|
18
61
|
this.name = "GuardBlockedError";
|
|
19
|
-
this.url =
|
|
62
|
+
this.url = sanitized;
|
|
20
63
|
}
|
|
21
64
|
}
|
|
22
65
|
export default class Guard {
|
|
23
|
-
//
|
|
24
|
-
//
|
|
25
|
-
// 0.0.0.0/8; v6 ULA + link-local + v4-mapped re-checked as v4.
|
|
66
|
+
// Static protocol ranges, not operator policy. IPv4-mapped IPv6 is checked
|
|
67
|
+
// against the same v4 block list after WHATWG URL canonicalization.
|
|
26
68
|
static isPublicAddress(ip) {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
if (a === 0 || a === 10 || a === 127)
|
|
30
|
-
return false;
|
|
31
|
-
if (a === 169 && b === 254)
|
|
32
|
-
return false;
|
|
33
|
-
if (a === 172 && b >= 16 && b <= 31)
|
|
34
|
-
return false;
|
|
35
|
-
if (a === 192 && b === 168)
|
|
36
|
-
return false;
|
|
37
|
-
if (a === 100 && b >= 64 && b <= 127)
|
|
38
|
-
return false;
|
|
39
|
-
return true;
|
|
40
|
-
}
|
|
41
|
-
const v6 = ip.toLowerCase();
|
|
42
|
-
if (v6 === "::" || v6 === "::1")
|
|
43
|
-
return false;
|
|
44
|
-
if (v6.startsWith("fc") || v6.startsWith("fd"))
|
|
45
|
-
return false;
|
|
46
|
-
if (/^fe[89ab]/.test(v6))
|
|
69
|
+
const family = net.isIP(ip);
|
|
70
|
+
if (family === 0)
|
|
47
71
|
return false;
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
72
|
+
if (family === 4)
|
|
73
|
+
return !BLOCKED.check(ip, "ipv4");
|
|
74
|
+
if (IPV4_MAPPED.check(ip, "ipv6"))
|
|
75
|
+
return !BLOCKED.check(ip, "ipv6");
|
|
76
|
+
return GLOBAL_IPV6.check(ip, "ipv6") && !BLOCKED.check(ip, "ipv6");
|
|
52
77
|
}
|
|
53
|
-
// http(s)
|
|
78
|
+
// http(s) only, no localhost, and EVERY resolved address public. An IP
|
|
54
79
|
// literal skips DNS; a hostname resolves and every A/AAAA must be public.
|
|
55
|
-
// ws:/wss: ride the same range check — a WebSocket into private space is the
|
|
56
|
-
// same SSRF as a fetch (the Ws scheme guards its target through here).
|
|
57
80
|
static async isPublicUrl(raw) {
|
|
58
81
|
let url;
|
|
59
82
|
try {
|
|
@@ -62,7 +85,9 @@ export default class Guard {
|
|
|
62
85
|
catch {
|
|
63
86
|
return false;
|
|
64
87
|
}
|
|
65
|
-
if (!["http:", "https:"
|
|
88
|
+
if (!["http:", "https:"].includes(url.protocol))
|
|
89
|
+
return false;
|
|
90
|
+
if (url.username !== "" || url.password !== "")
|
|
66
91
|
return false;
|
|
67
92
|
const host = url.hostname.toLowerCase().replace(/^\[|\]$/g, "");
|
|
68
93
|
if (host === "localhost" || host.endsWith(".localhost"))
|
|
@@ -77,31 +102,46 @@ export default class Guard {
|
|
|
77
102
|
return false; // unresolvable is dead anyway
|
|
78
103
|
}
|
|
79
104
|
}
|
|
80
|
-
//
|
|
81
|
-
// manually (floor-set knob — unset crashes). Method
|
|
82
|
-
//
|
|
83
|
-
//
|
|
84
|
-
//
|
|
105
|
+
// Automatic fetch: re-check every hop, follow up to PLURNK_SCHEMES_HTTP_REDIRECTS
|
|
106
|
+
// manually (floor-set knob — unset crashes). Method, body, body headers, and
|
|
107
|
+
// cross-origin Authorization follow WHATWG HTTP-redirect fetch. Throws
|
|
108
|
+
// GuardBlockedError on a non-public hop; hands back the final response
|
|
109
|
+
// (including a terminal redirect when hops run out) otherwise.
|
|
85
110
|
static async fetch(raw, init, signal) {
|
|
86
111
|
let target = raw;
|
|
87
112
|
let method = init.method;
|
|
88
113
|
let body = init.body;
|
|
89
|
-
let
|
|
114
|
+
let headers = init.headers.map(([name, value]) => [name, value]);
|
|
115
|
+
let hops = requireNonNegativeIntegerEnv("PLURNK_SCHEMES_HTTP_REDIRECTS");
|
|
90
116
|
while (true) {
|
|
91
|
-
|
|
117
|
+
let current;
|
|
118
|
+
try {
|
|
119
|
+
current = new URL(target);
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
92
122
|
throw new GuardBlockedError(target);
|
|
93
|
-
|
|
94
|
-
if (
|
|
123
|
+
}
|
|
124
|
+
if (!["http:", "https:"].includes(current.protocol) || !(await Guard.isPublicUrl(current.href))) {
|
|
125
|
+
throw new GuardBlockedError(current.href);
|
|
126
|
+
}
|
|
127
|
+
const response = await fetch(current.href, { method, body, headers, signal, redirect: "manual" });
|
|
128
|
+
if (!REDIRECT_STATUSES.has(response.status))
|
|
95
129
|
return response;
|
|
96
130
|
const location = response.headers.get("location");
|
|
97
131
|
if (location === null || hops <= 0)
|
|
98
132
|
return response;
|
|
133
|
+
await response.body?.cancel();
|
|
99
134
|
hops -= 1;
|
|
100
|
-
|
|
101
|
-
if (
|
|
135
|
+
const next = new URL(location, current);
|
|
136
|
+
if (((response.status === 301 || response.status === 302) && method === "POST")
|
|
137
|
+
|| (response.status === 303 && method !== "GET" && method !== "HEAD")) {
|
|
102
138
|
method = "GET";
|
|
103
139
|
body = undefined;
|
|
140
|
+
headers = withoutHeaders(headers, BODY_HEADERS);
|
|
104
141
|
}
|
|
142
|
+
if (current.origin !== next.origin)
|
|
143
|
+
headers = withoutHeaders(headers, AUTHORIZATION_HEADERS);
|
|
144
|
+
target = next.href;
|
|
105
145
|
}
|
|
106
146
|
}
|
|
107
147
|
}
|
package/dist/Guard.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Guard.js","sourceRoot":"","sources":["../src/Guard.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"Guard.js","sourceRoot":"","sources":["../src/Guard.ts"],"names":[],"mappings":"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"}
|
package/dist/Http.d.ts
CHANGED
|
@@ -1,26 +1,13 @@
|
|
|
1
|
-
import type { SchemeCtx, PassthroughResult, SchemeManifest, SchemeHandler,
|
|
2
|
-
import { type RenderResult } from "./Browser.ts";
|
|
3
|
-
interface Renderer {
|
|
4
|
-
ready?(): Promise<string>;
|
|
5
|
-
render(url: string, opts: {
|
|
6
|
-
workerId: number;
|
|
7
|
-
signal?: AbortSignal;
|
|
8
|
-
headers?: ReadonlyArray<readonly [string, string]>;
|
|
9
|
-
}): Promise<RenderResult>;
|
|
10
|
-
close?(): Promise<void>;
|
|
11
|
-
}
|
|
1
|
+
import type { SchemeCtx, PassthroughResult, SchemeManifest, SchemeHandler, RepresentationPreparationRequest, RepresentationPreparationResult, SendStatement, EditStatement, KillStatement } from "@plurnk/plurnk-schemes";
|
|
12
2
|
export default class Http implements SchemeHandler {
|
|
13
3
|
#private;
|
|
14
4
|
static manifest: SchemeManifest;
|
|
15
|
-
constructor(
|
|
5
|
+
constructor();
|
|
16
6
|
ready(): Promise<void>;
|
|
17
|
-
|
|
18
|
-
prepareFind(statement: FindStatement, ctx: SchemeCtx): Promise<PassthroughResult>;
|
|
19
|
-
read(statement: ReadStatement, ctx: SchemeCtx): Promise<PassthroughResult>;
|
|
7
|
+
prepareRepresentation(request: RepresentationPreparationRequest, ctx: SchemeCtx): Promise<RepresentationPreparationResult>;
|
|
20
8
|
editBatch(statements: readonly EditStatement[], ctx: SchemeCtx): Promise<PassthroughResult>;
|
|
21
9
|
edit(statement: EditStatement, ctx: SchemeCtx): Promise<PassthroughResult>;
|
|
22
10
|
kill(statement: KillStatement, ctx: SchemeCtx): Promise<PassthroughResult>;
|
|
23
11
|
send(statement: SendStatement, ctx: SchemeCtx): Promise<PassthroughResult>;
|
|
24
12
|
}
|
|
25
|
-
export {};
|
|
26
13
|
//# sourceMappingURL=Http.d.ts.map
|
package/dist/Http.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Http.d.ts","sourceRoot":"","sources":["../src/Http.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Http.d.ts","sourceRoot":"","sources":["../src/Http.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACR,SAAS,EAGT,iBAAiB,EACjB,cAAc,EACd,aAAa,EACb,gCAAgC,EAChC,+BAA+B,EAC/B,aAAa,EACb,aAAa,EACb,aAAa,EAOhB,MAAM,wBAAwB,CAAC;AAuMhC,MAAM,CAAC,OAAO,OAAO,IAAK,YAAW,aAAa;;IAC9C,MAAM,CAAC,QAAQ,EAAE,cAAc,CAmB7B;IAIF,cAGC;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAE3B;IAKK,qBAAqB,CACvB,OAAO,EAAE,gCAAgC,EACzC,GAAG,EAAE,SAAS,GACf,OAAO,CAAC,+BAA+B,CAAC,CAS1C;IAoNK,SAAS,CAAC,UAAU,EAAE,SAAS,aAAa,EAAE,EAAE,GAAG,EAAE,SAAS,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAqChG;IAEK,IAAI,CAAC,SAAS,EAAE,aAAa,EAAE,GAAG,EAAE,SAAS,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAE/E;IAIK,IAAI,CAAC,SAAS,EAAE,aAAa,EAAE,GAAG,EAAE,SAAS,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAS/E;IAQK,IAAI,CAAC,SAAS,EAAE,aAAa,EAAE,GAAG,EAAE,SAAS,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAoC/E;CAypBJ"}
|