doc-detective 4.0.2-dev.6 → 4.0.2-dev.8

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.
@@ -2,6 +2,111 @@ import { validate } from "../../common/src/validate.js";
2
2
  import { isRelativeUrl } from "../utils.js";
3
3
  import axios from "axios";
4
4
  export { checkLink };
5
+ const DEFAULT_HEADERS = {
6
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
7
+ Accept: "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8",
8
+ "Accept-Language": "en-US,en;q=0.9",
9
+ "Accept-Encoding": "gzip, deflate, br",
10
+ "Upgrade-Insecure-Requests": "1",
11
+ "Sec-Fetch-Site": "none",
12
+ "Sec-Fetch-Mode": "navigate",
13
+ "Sec-Fetch-Dest": "document",
14
+ "Sec-Fetch-User": "?1",
15
+ "Sec-Ch-Ua": '"Not_A Brand";v="8", "Chromium";v="120", "Google Chrome";v="120"',
16
+ "Sec-Ch-Ua-Mobile": "?0",
17
+ "Sec-Ch-Ua-Platform": '"Windows"',
18
+ };
19
+ // Initial request plus up to 3 retries, producing sleeps of 1s, 2s, 4s.
20
+ const MAX_ATTEMPTS = 4;
21
+ const BASE_BACKOFF_MS = 1000;
22
+ const MAX_RETRY_AFTER_MS = 10000;
23
+ function parseHeaderString(raw) {
24
+ const out = {};
25
+ for (const line of raw.split(/\r?\n/)) {
26
+ const idx = line.indexOf(":");
27
+ if (idx === -1)
28
+ continue;
29
+ const key = line.slice(0, idx).trim();
30
+ const value = line.slice(idx + 1).trim();
31
+ // Match httpRequest's behavior: require a non-empty key AND a non-empty
32
+ // value. Silently dropping a header with no value avoids sending
33
+ // "X-Example:" lines that are almost always formatting mistakes.
34
+ if (key && value)
35
+ out[key] = value;
36
+ }
37
+ return out;
38
+ }
39
+ function mergeHeaders(userHeaders) {
40
+ const merged = { ...DEFAULT_HEADERS };
41
+ if (!userHeaders)
42
+ return merged;
43
+ const parsed = typeof userHeaders === "string"
44
+ ? parseHeaderString(userHeaders)
45
+ : userHeaders;
46
+ // Case-insensitive override: strip any default with the same name (any casing)
47
+ for (const userKey of Object.keys(parsed)) {
48
+ const raw = parsed[userKey];
49
+ if (raw === null || raw === undefined)
50
+ continue;
51
+ const value = typeof raw === "string" ? raw : String(raw);
52
+ const lower = userKey.toLowerCase();
53
+ for (const existingKey of Object.keys(merged)) {
54
+ if (existingKey.toLowerCase() === lower)
55
+ delete merged[existingKey];
56
+ }
57
+ merged[userKey] = value;
58
+ }
59
+ return merged;
60
+ }
61
+ function parseRetryAfter(value) {
62
+ const candidate = Array.isArray(value) ? value[0] : value;
63
+ if (typeof candidate !== "string" && typeof candidate !== "number")
64
+ return null;
65
+ const str = String(candidate).trim();
66
+ if (!str)
67
+ return null;
68
+ const seconds = Number(str);
69
+ if (Number.isFinite(seconds)) {
70
+ return Math.max(0, Math.min(seconds * 1000, MAX_RETRY_AFTER_MS));
71
+ }
72
+ const date = Date.parse(str);
73
+ if (!Number.isNaN(date)) {
74
+ return Math.max(0, Math.min(date - Date.now(), MAX_RETRY_AFTER_MS));
75
+ }
76
+ return null;
77
+ }
78
+ function sleep(ms) {
79
+ return new Promise((resolve) => setTimeout(resolve, ms));
80
+ }
81
+ function shouldRetry(statusCode) {
82
+ if (statusCode === null)
83
+ return false;
84
+ return statusCode === 429 || statusCode >= 500;
85
+ }
86
+ async function attemptRequest(method, url, headers) {
87
+ try {
88
+ const res = await axios.request({
89
+ method,
90
+ url,
91
+ headers,
92
+ timeout: 10000,
93
+ maxRedirects: 5,
94
+ validateStatus: () => true,
95
+ });
96
+ const retryAfter = parseRetryAfter(res.headers?.["retry-after"] ?? res.headers?.["Retry-After"]);
97
+ return { statusCode: res.status, retryAfter };
98
+ }
99
+ catch (error) {
100
+ if (error?.response?.status) {
101
+ return {
102
+ statusCode: error.response.status,
103
+ retryAfter: parseRetryAfter(error.response.headers?.["retry-after"] ??
104
+ error.response.headers?.["Retry-After"]),
105
+ };
106
+ }
107
+ return { statusCode: null, retryAfter: null };
108
+ }
109
+ }
5
110
  async function checkLink({ config, step }) {
6
111
  let result = { status: "PASS", description: "Checked link." };
7
112
  // Resolve to object
@@ -43,44 +148,46 @@ async function checkLink({ config, step }) {
43
148
  else if (typeof step.checkLink.statusCodes === "number") {
44
149
  step.checkLink.statusCodes = [step.checkLink.statusCodes];
45
150
  }
46
- // Perform request with appropriate headers
47
- const requestConfig = {
48
- headers: {
49
- 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
50
- 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
51
- 'Accept-Language': 'en-US,en;q=0.9'
52
- },
53
- timeout: 10000, // 10 second timeout
54
- maxRedirects: 5
55
- };
56
- let req = await axios
57
- .get(step.checkLink.url, requestConfig)
58
- .then((res) => {
59
- return { statusCode: res.status };
60
- })
61
- .catch((error) => {
62
- return { error };
63
- });
64
- // If request returned an error
65
- if (req.error) {
66
- // If we have a response with a status code, check against accepted codes
67
- if (req.error.response && req.error.response.status) {
68
- req = { statusCode: req.error.response.status };
151
+ const headers = mergeHeaders(step.checkLink.headers);
152
+ const url = step.checkLink.url;
153
+ const acceptedCodes = step.checkLink.statusCodes;
154
+ const isAccepted = (code) => code !== null && acceptedCodes.indexOf(code) >= 0;
155
+ // Attempt GET with bounded retry on 429/5xx, honoring Retry-After.
156
+ // Short-circuit retries if the response is already an accepted status code.
157
+ let last = { statusCode: null, retryAfter: null };
158
+ for (let attempt = 0; attempt < MAX_ATTEMPTS; attempt++) {
159
+ last = await attemptRequest("get", url, headers);
160
+ if (isAccepted(last.statusCode))
161
+ break;
162
+ if (!shouldRetry(last.statusCode))
163
+ break;
164
+ if (attempt < MAX_ATTEMPTS - 1) {
165
+ const backoff = last.retryAfter ?? BASE_BACKOFF_MS * Math.pow(2, attempt);
166
+ await sleep(backoff);
69
167
  }
70
- else {
71
- result.status = "FAIL";
72
- result.description = `Invalid or unresolvable URL: ${step.checkLink.url}`;
73
- return result;
168
+ }
169
+ // HEAD fallback on final 429/403 when the result is not already accepted.
170
+ // Some WAFs rate-limit HTML GETs but allow HEADs.
171
+ if (!isAccepted(last.statusCode) &&
172
+ (last.statusCode === 429 || last.statusCode === 403)) {
173
+ const headResult = await attemptRequest("head", url, headers);
174
+ if (isAccepted(headResult.statusCode)) {
175
+ last = headResult;
74
176
  }
75
177
  }
178
+ if (last.statusCode === null) {
179
+ result.status = "FAIL";
180
+ result.description = `Invalid or unresolvable URL: ${url}`;
181
+ return result;
182
+ }
76
183
  // Compare status codes
77
- if (step.checkLink.statusCodes.indexOf(req.statusCode) >= 0) {
184
+ if (step.checkLink.statusCodes.indexOf(last.statusCode) >= 0) {
78
185
  result.status = "PASS";
79
- result.description = `Returned ${req.statusCode}`;
186
+ result.description = `Returned ${last.statusCode}`;
80
187
  }
81
188
  else {
82
189
  result.status = "FAIL";
83
- result.description = `Returned ${req.statusCode}. Expected one of ${JSON.stringify(step.checkLink.statusCodes)}`;
190
+ result.description = `Returned ${last.statusCode}. Expected one of ${JSON.stringify(step.checkLink.statusCodes)}`;
84
191
  }
85
192
  return result;
86
193
  }
@@ -1 +1 @@
1
- {"version":3,"file":"checkLink.js","sourceRoot":"","sources":["../../../src/core/tests/checkLink.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"checkLink.js","sourceRoot":"","sources":["../../../src/core/tests/checkLink.ts"],"names":[],"mappings":"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"}