@tak-ps/node-tak 12.24.0 → 12.25.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/CHANGELOG.md +5 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/api.js +5 -1
- package/dist/lib/api.js.map +1 -1
- package/dist/lib/utils/html-error.d.ts +32 -0
- package/dist/lib/utils/html-error.js +172 -0
- package/dist/lib/utils/html-error.js.map +1 -0
- package/dist/test/html-error.test.d.ts +1 -0
- package/dist/test/html-error.test.js +115 -0
- package/dist/test/html-error.test.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/index.ts +1 -0
- package/lib/api.ts +5 -1
- package/lib/utils/html-error.ts +208 -0
- package/package.json +1 -1
- package/test/html-error.test.ts +139 -0
package/CHANGELOG.md
CHANGED
|
@@ -12,6 +12,11 @@
|
|
|
12
12
|
|
|
13
13
|
### Pending
|
|
14
14
|
|
|
15
|
+
### v12.25.0 - 2026-08-24
|
|
16
|
+
|
|
17
|
+
- :tada: TAK Server HTML error pages (Tomcat/Spring "Exception Report" documents) returned by the API are now parsed into a `TAKServerError` instead of the raw HTML being used as the error message - `message`/`safe` contain the human readable `Message` (falling back to `Description`, the Exception's message, the page `<title>` or the visible text) while `details` contains a plain-text breakdown (status line, labelled fields & exception trace) suitable for an "Advanced" UI section and `html` retains the unmodified page. Pages are parsed with the existing `@tak-ps/xml-js` dependency (Tomcat emits well-formed XHTML) with a visible-text fallback for malformed documents. `TAKServerError`, `parseHTMLError()`, `isHTML()`, `summarizeHTMLError()` & `formatHTMLError()` are exported
|
|
18
|
+
- :bug: Errors thrown within `TAKAPI.fetch` are now rethrown when they are any `Err` subclass (previously matched on `name === 'PublicError'` only)
|
|
19
|
+
|
|
15
20
|
### v12.24.0 - 2026-08-11
|
|
16
21
|
|
|
17
22
|
- :tada: `Mission.latestFeats()` & `MissionLayer.latestFeats()` now parse each CoT in the TAK Server response individually via `CoTParser.from_xml_document()` and return `{ features, invalid }` - unparseable CoTs are collected in `invalid` as `{ error, feature }` (the raw unmutated xml-js event) so a single poisoned CoT no longer prevents the valid Data Sync features from being returned (previously the entire call would throw)
|
package/dist/index.d.ts
CHANGED
|
@@ -7,6 +7,7 @@ import TAKAPI from './lib/api.js';
|
|
|
7
7
|
import { TAKAuth } from './lib/auth.js';
|
|
8
8
|
import { Queue } from './lib/utils/queue.js';
|
|
9
9
|
export * from './lib/auth.js';
|
|
10
|
+
export * from './lib/utils/html-error.js';
|
|
10
11
|
export declare const REGEX_CONTROL: RegExp;
|
|
11
12
|
export declare const REGEX_EVENT: RegExp;
|
|
12
13
|
export interface PartialCoT {
|
package/dist/index.js
CHANGED
|
@@ -4,6 +4,7 @@ import tls from 'node:tls';
|
|
|
4
4
|
import TAKAPI from './lib/api.js';
|
|
5
5
|
import { Queue } from './lib/utils/queue.js';
|
|
6
6
|
export * from './lib/auth.js';
|
|
7
|
+
export * from './lib/utils/html-error.js';
|
|
7
8
|
/* eslint-disable no-control-regex */
|
|
8
9
|
export const REGEX_CONTROL = /[\u000B-\u001F\u007F-\u009F]/g;
|
|
9
10
|
// Match <event .../> or <event> but not <events>
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/api.js
CHANGED
|
@@ -21,6 +21,7 @@ import Subscription from './api/subscriptions.js';
|
|
|
21
21
|
import Video from './api/video.js';
|
|
22
22
|
import Export from './api/export.js';
|
|
23
23
|
import Err from '@openaddresses/batch-error';
|
|
24
|
+
import { TAKServerError, isHTML } from './utils/html-error.js';
|
|
24
25
|
function formatFetchError(err) {
|
|
25
26
|
if (!(err instanceof Error))
|
|
26
27
|
return String(err);
|
|
@@ -184,6 +185,9 @@ export default class TAKAPI {
|
|
|
184
185
|
console.error(err);
|
|
185
186
|
bdy = null;
|
|
186
187
|
}
|
|
188
|
+
// TAK Server returns HTML error pages
|
|
189
|
+
if (isHTML(bdy))
|
|
190
|
+
throw new TAKServerError(res.status, bdy);
|
|
187
191
|
throw new Err(res.status, null, bdy || `Status Code: ${res.status}`);
|
|
188
192
|
}
|
|
189
193
|
if (res.headers.get('content-type') === 'application/json') {
|
|
@@ -194,7 +198,7 @@ export default class TAKAPI {
|
|
|
194
198
|
}
|
|
195
199
|
}
|
|
196
200
|
catch (err) {
|
|
197
|
-
if (err instanceof
|
|
201
|
+
if (err instanceof Err)
|
|
198
202
|
throw err;
|
|
199
203
|
throw new Err(400, null, formatFetchError(err));
|
|
200
204
|
}
|
package/dist/lib/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../lib/api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,gBAAgB,CAAC;AACnC,OAAO,OAAO,MAAM,kBAAkB,CAAC;AACvC,OAAO,WAAW,MAAM,sBAAsB,CAAC;AAC/C,OAAO,KAAK,MAAM,gBAAgB,CAAC;AACnC,OAAO,MAAM,MAAM,iBAAiB,CAAC;AACrC,OAAO,OAAO,EAAE,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAClE,OAAO,aAAa,EAAE,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC3E,OAAO,UAAU,MAAM,sBAAsB,CAAC;AAC9C,OAAO,YAAY,EAAE,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AACxE,OAAO,WAAW,MAAM,sBAAsB,CAAC;AAC/C,OAAO,QAAQ,MAAM,mBAAmB,CAAC;AACzC,OAAO,QAAQ,MAAM,mBAAmB,CAAC;AACzC,OAAO,MAAM,MAAM,iBAAiB,CAAC;AACrC,OAAO,OAAO,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,MAAM,gBAAgB,CAAC;AACnC,OAAO,QAAQ,MAAM,mBAAmB,CAAC;AACzC,OAAO,SAAS,MAAM,oBAAoB,CAAC;AAC3C,OAAO,QAAQ,MAAM,mBAAmB,CAAC;AACzC,OAAO,KAAK,MAAM,iBAAiB,CAAC;AACpC,OAAO,YAAY,MAAM,wBAAwB,CAAC;AAClD,OAAO,KAAK,MAAM,gBAAgB,CAAC;AACnC,OAAO,MAAM,MAAM,iBAAiB,CAAC;AACrC,OAAO,GAAG,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../lib/api.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import Err from '@openaddresses/batch-error';
|
|
2
|
+
/**
|
|
3
|
+
* TAK Server (Tomcat) returns HTML "Exception Report" pages on failure.
|
|
4
|
+
* Parse them into a human readable message + plain-text details
|
|
5
|
+
* so clients don't render raw HTML.
|
|
6
|
+
*/
|
|
7
|
+
export interface HTMLErrorDetails {
|
|
8
|
+
/** <title> or <h1> */
|
|
9
|
+
title?: string;
|
|
10
|
+
/** <p><b>Label</b> value</p> pairs - ie: Type, Message, Description */
|
|
11
|
+
fields: Record<string, string>;
|
|
12
|
+
/** <pre> stack traces */
|
|
13
|
+
exception?: string;
|
|
14
|
+
/** Visible text fallback */
|
|
15
|
+
text: string;
|
|
16
|
+
}
|
|
17
|
+
export declare function isHTML(body: unknown): body is string;
|
|
18
|
+
/** Returns null if body is not HTML */
|
|
19
|
+
export declare function parseHTMLError(body: unknown): HTMLErrorDetails | null;
|
|
20
|
+
/** Most useful human readable line from the page */
|
|
21
|
+
export declare function summarizeHTMLError(details: HTMLErrorDetails, status?: number): string;
|
|
22
|
+
/** Plain-text breakdown for an "Advanced" details pane */
|
|
23
|
+
export declare function formatHTMLError(details: HTMLErrorDetails): string;
|
|
24
|
+
/**
|
|
25
|
+
* TAK Server HTML error page - `safe` is the summary, `details` the full breakdown
|
|
26
|
+
*/
|
|
27
|
+
export declare class TAKServerError extends Err {
|
|
28
|
+
details: string;
|
|
29
|
+
html: string;
|
|
30
|
+
parsed: HTMLErrorDetails;
|
|
31
|
+
constructor(status: number, html: string, parsed?: HTMLErrorDetails);
|
|
32
|
+
}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import Err from '@openaddresses/batch-error';
|
|
2
|
+
import xmljs from '@tak-ps/xml-js';
|
|
3
|
+
const HIDDEN = new Set(['style', 'script', 'head']);
|
|
4
|
+
function collapse(input) {
|
|
5
|
+
return input.replace(/\s+/g, ' ').trim();
|
|
6
|
+
}
|
|
7
|
+
/** Linear-time tag stripper for malformed HTML - drops the contents of HIDDEN elements */
|
|
8
|
+
function stripTags(html) {
|
|
9
|
+
const lower = html.toLowerCase();
|
|
10
|
+
let out = '';
|
|
11
|
+
let i = 0;
|
|
12
|
+
while (i < html.length) {
|
|
13
|
+
const open = html.indexOf('<', i);
|
|
14
|
+
if (open === -1) {
|
|
15
|
+
out += html.slice(i);
|
|
16
|
+
break;
|
|
17
|
+
}
|
|
18
|
+
out += html.slice(i, open) + ' ';
|
|
19
|
+
const close = html.indexOf('>', open);
|
|
20
|
+
if (close === -1)
|
|
21
|
+
break;
|
|
22
|
+
const tag = lower.slice(open + 1, close).trim().split(/\s/, 1)[0];
|
|
23
|
+
i = close + 1;
|
|
24
|
+
if (HIDDEN.has(tag)) {
|
|
25
|
+
const end = lower.indexOf(`</${tag}`, i);
|
|
26
|
+
if (end === -1)
|
|
27
|
+
break;
|
|
28
|
+
i = html.indexOf('>', end);
|
|
29
|
+
if (i === -1)
|
|
30
|
+
break;
|
|
31
|
+
i += 1;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return collapse(out);
|
|
35
|
+
}
|
|
36
|
+
function textOf(el, opts = {}) {
|
|
37
|
+
if (el.type === 'text')
|
|
38
|
+
return String(el.text ?? '');
|
|
39
|
+
if (el.type !== 'element' || !el.elements)
|
|
40
|
+
return '';
|
|
41
|
+
if (opts.skipPre && el.name === 'pre')
|
|
42
|
+
return '';
|
|
43
|
+
return el.elements.map((child) => textOf(child, opts)).join('');
|
|
44
|
+
}
|
|
45
|
+
function* walk(el, skipHidden = true) {
|
|
46
|
+
if (el.type === 'element' && el.name && skipHidden && HIDDEN.has(el.name.toLowerCase()))
|
|
47
|
+
return;
|
|
48
|
+
if (el.type === 'element')
|
|
49
|
+
yield el;
|
|
50
|
+
for (const child of el.elements || [])
|
|
51
|
+
yield* walk(child, skipHidden);
|
|
52
|
+
}
|
|
53
|
+
function find(root, name) {
|
|
54
|
+
for (const el of walk(root, false)) {
|
|
55
|
+
if (el.name?.toLowerCase() === name)
|
|
56
|
+
return el;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
export function isHTML(body) {
|
|
60
|
+
if (typeof body !== 'string')
|
|
61
|
+
return false;
|
|
62
|
+
const head = body.slice(0, 512).trimStart().toLowerCase();
|
|
63
|
+
return head.startsWith('<!doctype html')
|
|
64
|
+
|| head.startsWith('<html')
|
|
65
|
+
|| /^<(head|body|title|h1)[\s>]/.test(head);
|
|
66
|
+
}
|
|
67
|
+
/** Returns null if body is not HTML */
|
|
68
|
+
export function parseHTMLError(body) {
|
|
69
|
+
if (!isHTML(body))
|
|
70
|
+
return null;
|
|
71
|
+
const details = {
|
|
72
|
+
fields: {},
|
|
73
|
+
text: '',
|
|
74
|
+
};
|
|
75
|
+
let root;
|
|
76
|
+
try {
|
|
77
|
+
root = xmljs.xml2js(body, { compact: false });
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
// Not well-formed XHTML - fall back to visible text
|
|
81
|
+
details.text = stripTags(body);
|
|
82
|
+
return details;
|
|
83
|
+
}
|
|
84
|
+
const title = find(root, 'title') || find(root, 'h1');
|
|
85
|
+
if (title && collapse(textOf(title)))
|
|
86
|
+
details.title = collapse(textOf(title));
|
|
87
|
+
const pres = [];
|
|
88
|
+
let text = '';
|
|
89
|
+
for (const el of walk(root)) {
|
|
90
|
+
const name = el.name?.toLowerCase();
|
|
91
|
+
if (name === 'p' && el.elements?.[0]?.name?.toLowerCase() === 'b') {
|
|
92
|
+
const label = collapse(textOf(el.elements[0]));
|
|
93
|
+
const value = collapse(el.elements.slice(1).map((child) => textOf(child)).join(''));
|
|
94
|
+
if (label && value)
|
|
95
|
+
details.fields[label] = value;
|
|
96
|
+
}
|
|
97
|
+
else if (name === 'pre') {
|
|
98
|
+
const value = textOf(el)
|
|
99
|
+
.split('\n')
|
|
100
|
+
.map((line) => line.trimEnd())
|
|
101
|
+
.join('\n')
|
|
102
|
+
.trim();
|
|
103
|
+
if (value)
|
|
104
|
+
pres.push(value);
|
|
105
|
+
}
|
|
106
|
+
else if (name === 'body') {
|
|
107
|
+
text = collapse(textOf(el, { skipPre: true }));
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
if (pres.length)
|
|
111
|
+
details.exception = pres.join('\n\n');
|
|
112
|
+
details.text = text || collapse(textOf(root, { skipPre: true }));
|
|
113
|
+
return details;
|
|
114
|
+
}
|
|
115
|
+
/** Most useful human readable line from the page */
|
|
116
|
+
export function summarizeHTMLError(details, status) {
|
|
117
|
+
const message = details.fields.Message
|
|
118
|
+
|| details.fields.message
|
|
119
|
+
|| details.fields.Description
|
|
120
|
+
|| details.fields.description;
|
|
121
|
+
if (message)
|
|
122
|
+
return message;
|
|
123
|
+
if (details.exception) {
|
|
124
|
+
// "<ExceptionClass>: <message>"
|
|
125
|
+
const first = details.exception.split('\n')[0].trim();
|
|
126
|
+
const colon = first.indexOf(': ');
|
|
127
|
+
if (colon !== -1 && colon < first.length - 2)
|
|
128
|
+
return first.slice(colon + 2).trim();
|
|
129
|
+
}
|
|
130
|
+
if (details.title)
|
|
131
|
+
return details.title;
|
|
132
|
+
if (details.text)
|
|
133
|
+
return details.text.length > 200 ? details.text.slice(0, 197) + '...' : details.text;
|
|
134
|
+
return status ? `Status Code: ${status}` : 'Unknown TAK Server Error';
|
|
135
|
+
}
|
|
136
|
+
/** Plain-text breakdown for an "Advanced" details pane */
|
|
137
|
+
export function formatHTMLError(details) {
|
|
138
|
+
const lines = [];
|
|
139
|
+
if (details.title)
|
|
140
|
+
lines.push(details.title);
|
|
141
|
+
for (const [label, value] of Object.entries(details.fields)) {
|
|
142
|
+
if (value)
|
|
143
|
+
lines.push(`${label}: ${value}`);
|
|
144
|
+
}
|
|
145
|
+
if (details.exception) {
|
|
146
|
+
if (lines.length)
|
|
147
|
+
lines.push('');
|
|
148
|
+
lines.push(details.exception);
|
|
149
|
+
}
|
|
150
|
+
if (!lines.length && details.text)
|
|
151
|
+
lines.push(details.text);
|
|
152
|
+
return lines.join('\n');
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* TAK Server HTML error page - `safe` is the summary, `details` the full breakdown
|
|
156
|
+
*/
|
|
157
|
+
export class TAKServerError extends Err {
|
|
158
|
+
details;
|
|
159
|
+
html;
|
|
160
|
+
parsed;
|
|
161
|
+
constructor(status, html, parsed) {
|
|
162
|
+
const details = parsed || parseHTMLError(html) || {
|
|
163
|
+
fields: {},
|
|
164
|
+
text: stripTags(html)
|
|
165
|
+
};
|
|
166
|
+
super(status, null, summarizeHTMLError(details, status));
|
|
167
|
+
this.parsed = details;
|
|
168
|
+
this.details = formatHTMLError(details);
|
|
169
|
+
this.html = html;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=html-error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"html-error.js","sourceRoot":"","sources":["../../../lib/utils/html-error.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import test from 'node:test';
|
|
2
|
+
import assert from 'node:assert/strict';
|
|
3
|
+
import Err from '@openaddresses/batch-error';
|
|
4
|
+
import { TAKServerError, isHTML, parseHTMLError, summarizeHTMLError, formatHTMLError, } from '../lib/utils/html-error.js';
|
|
5
|
+
const TOMCAT = `<!doctype html><html lang="en"><head><title>HTTP Status 500 – Internal Server Error</title><style type="text/css">body {font-family:Tahoma,Arial,sans-serif;} h1, h2, h3, b {color:white;background-color:#525D76;} h1 {font-size:22px;} h2 {font-size:16px;} h3 {font-size:14px;} p {font-size:12px;} a {color:black;} .line {height:1px;background-color:#525D76;border:none;}</style></head><body><h1>HTTP Status 500 – Internal Server Error</h1><hr class="line" /><p><b>Type</b> Exception Report</p><p><b>Message</b> Exception performing TAK Server authentication</p><p><b>Description</b> The server encountered an unexpected condition that prevented it from fulfilling the request.</p><p><b>Exception</b></p><pre>org.springframework.security.authentication.BadCredentialsException: Exception performing TAK Server authentication
|
|
6
|
+
\tcom.bbn.marti.util.spring.TakAuthenticationProvider.authenticateCore(TakAuthenticationProvider.java:190)
|
|
7
|
+
\tcom.bbn.marti.util.spring.TakAuthenticationProvider.authenticate(TakAuthenticationProvider.java:244)
|
|
8
|
+
\torg.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:181)
|
|
9
|
+
</pre><p><b>Note</b> The full stack trace of the root cause is available in the server logs.</p><hr class="line" /><h3>Apache Tomcat/9.0.86</h3></body></html>`;
|
|
10
|
+
test('html-error: isHTML', () => {
|
|
11
|
+
assert.equal(isHTML(TOMCAT), true);
|
|
12
|
+
assert.equal(isHTML(' <html><body>x</body></html>'), true);
|
|
13
|
+
assert.equal(isHTML('<h1>HTTP Status 404 – Not Found</h1>'), true);
|
|
14
|
+
assert.equal(isHTML('{"message":"nope"}'), false);
|
|
15
|
+
assert.equal(isHTML('Plain text failure'), false);
|
|
16
|
+
assert.equal(isHTML(null), false);
|
|
17
|
+
assert.equal(isHTML({}), false);
|
|
18
|
+
});
|
|
19
|
+
test('html-error: entities are decoded', () => {
|
|
20
|
+
const parsed = parseHTMLError('<html><body><p><b>Message</b> a – b & <c> 'd' A</p></body></html>');
|
|
21
|
+
assert.ok(parsed);
|
|
22
|
+
assert.equal(parsed.fields.Message, 'a – b & <c> \'d\' A');
|
|
23
|
+
});
|
|
24
|
+
test('html-error: malformed HTML strips hidden blocks & unterminated tags', () => {
|
|
25
|
+
const parsed = parseHTMLError('<html><script>let a = "<b>";</script><body><STYLE>b {x:y}</STYLE><p class="x">Gateway <b>Timeout</b><script>never closed');
|
|
26
|
+
assert.ok(parsed);
|
|
27
|
+
assert.equal(parsed.text, 'Gateway Timeout');
|
|
28
|
+
assert.equal(parseHTMLError('<html><body>Broken <tag')?.text, 'Broken');
|
|
29
|
+
// Pathological input scales linearly (CodeQL polynomial regex finding)
|
|
30
|
+
const time = (n) => {
|
|
31
|
+
const big = '<html>' + '<head\t'.repeat(n) + '<'.repeat(n);
|
|
32
|
+
const start = performance.now();
|
|
33
|
+
assert.ok(parseHTMLError(big));
|
|
34
|
+
return performance.now() - start;
|
|
35
|
+
};
|
|
36
|
+
time(1000); // warm up
|
|
37
|
+
const small = time(10000);
|
|
38
|
+
const large = time(40000);
|
|
39
|
+
assert.ok(large < Math.max(small * 10, 50), `4x input took ${large}ms vs ${small}ms`);
|
|
40
|
+
});
|
|
41
|
+
test('html-error: TAKServerError from non-HTML body', () => {
|
|
42
|
+
const err = new TAKServerError(502, 'upstream <b>down</b>');
|
|
43
|
+
assert.equal(err.message, 'upstream down');
|
|
44
|
+
assert.equal(err.details, 'upstream down');
|
|
45
|
+
});
|
|
46
|
+
test('html-error: malformed HTML falls back to visible text', () => {
|
|
47
|
+
const parsed = parseHTMLError('<html><head><style>b {x:y}</style></head><body><p>Bad Gateway<br>upstream unavailable</body></html>');
|
|
48
|
+
assert.ok(parsed);
|
|
49
|
+
assert.equal(parsed.title, undefined);
|
|
50
|
+
assert.equal(parsed.text, 'Bad Gateway upstream unavailable');
|
|
51
|
+
assert.equal(summarizeHTMLError(parsed, 502), 'Bad Gateway upstream unavailable');
|
|
52
|
+
});
|
|
53
|
+
test('html-error: parseHTMLError - Tomcat Exception Report', () => {
|
|
54
|
+
const parsed = parseHTMLError(TOMCAT);
|
|
55
|
+
assert.ok(parsed);
|
|
56
|
+
assert.equal(parsed.title, 'HTTP Status 500 – Internal Server Error');
|
|
57
|
+
assert.deepEqual(parsed.fields, {
|
|
58
|
+
Type: 'Exception Report',
|
|
59
|
+
Message: 'Exception performing TAK Server authentication',
|
|
60
|
+
Description: 'The server encountered an unexpected condition that prevented it from fulfilling the request.',
|
|
61
|
+
Note: 'The full stack trace of the root cause is available in the server logs.',
|
|
62
|
+
});
|
|
63
|
+
assert.ok(parsed.exception);
|
|
64
|
+
assert.ok(parsed.exception.startsWith('org.springframework.security.authentication.BadCredentialsException: Exception performing TAK Server authentication\n'));
|
|
65
|
+
assert.ok(parsed.exception.includes('TakAuthenticationProvider.java:244'));
|
|
66
|
+
assert.ok(!parsed.exception.endsWith('\n'));
|
|
67
|
+
// Styles & exception body are excluded from the text fallback
|
|
68
|
+
assert.ok(!parsed.text.includes('font-family'));
|
|
69
|
+
assert.ok(!parsed.text.includes('TakAuthenticationProvider'));
|
|
70
|
+
assert.ok(parsed.text.includes('Apache Tomcat/9.0.86'));
|
|
71
|
+
assert.equal(summarizeHTMLError(parsed), 'Exception performing TAK Server authentication');
|
|
72
|
+
const formatted = formatHTMLError(parsed);
|
|
73
|
+
assert.equal(formatted.split('\n').slice(0, 6).join('\n'), [
|
|
74
|
+
'HTTP Status 500 – Internal Server Error',
|
|
75
|
+
'Type: Exception Report',
|
|
76
|
+
'Message: Exception performing TAK Server authentication',
|
|
77
|
+
'Description: The server encountered an unexpected condition that prevented it from fulfilling the request.',
|
|
78
|
+
'Note: The full stack trace of the root cause is available in the server logs.',
|
|
79
|
+
'',
|
|
80
|
+
].join('\n'));
|
|
81
|
+
assert.ok(formatted.endsWith('ProviderManager.authenticate(ProviderManager.java:181)'));
|
|
82
|
+
});
|
|
83
|
+
test('html-error: parseHTMLError - status page without Message', () => {
|
|
84
|
+
const parsed = parseHTMLError('<!doctype html><html><head><title>HTTP Status 404 – Not Found</title></head><body><h1>HTTP Status 404 – Not Found</h1><p><b>Type</b> Status Report</p><p><b>Description</b> The origin server did not find a current representation for the target resource.</p></body></html>');
|
|
85
|
+
assert.ok(parsed);
|
|
86
|
+
assert.equal(summarizeHTMLError(parsed, 404), 'The origin server did not find a current representation for the target resource.');
|
|
87
|
+
});
|
|
88
|
+
test('html-error: parseHTMLError - exception only', () => {
|
|
89
|
+
const parsed = parseHTMLError('<html><body><pre>java.lang.IllegalStateException: Mission already exists</pre></body></html>');
|
|
90
|
+
assert.ok(parsed);
|
|
91
|
+
assert.equal(summarizeHTMLError(parsed), 'Mission already exists');
|
|
92
|
+
assert.equal(formatHTMLError(parsed), 'java.lang.IllegalStateException: Mission already exists');
|
|
93
|
+
});
|
|
94
|
+
test('html-error: parseHTMLError - unstructured HTML', () => {
|
|
95
|
+
const parsed = parseHTMLError('<html><body><div>Service Unavailable</div></body></html>');
|
|
96
|
+
assert.ok(parsed);
|
|
97
|
+
assert.equal(parsed.title, undefined);
|
|
98
|
+
assert.equal(summarizeHTMLError(parsed, 503), 'Service Unavailable');
|
|
99
|
+
assert.equal(formatHTMLError(parsed), 'Service Unavailable');
|
|
100
|
+
assert.equal(parseHTMLError('not html'), null);
|
|
101
|
+
});
|
|
102
|
+
test('html-error: TAKServerError', () => {
|
|
103
|
+
const err = new TAKServerError(500, TOMCAT);
|
|
104
|
+
assert.ok(err instanceof Err);
|
|
105
|
+
assert.ok(err instanceof Error);
|
|
106
|
+
assert.equal(err.name, 'PublicError');
|
|
107
|
+
assert.equal(err.status, 500);
|
|
108
|
+
assert.equal(err.message, 'Exception performing TAK Server authentication');
|
|
109
|
+
assert.equal(err.safe, 'Exception performing TAK Server authentication');
|
|
110
|
+
assert.ok(err.details.startsWith('HTTP Status 500 – Internal Server Error\nType: Exception Report\n'));
|
|
111
|
+
assert.ok(err.details.includes('BadCredentialsException'));
|
|
112
|
+
assert.equal(err.html, TOMCAT);
|
|
113
|
+
assert.equal(err.parsed.fields.Type, 'Exception Report');
|
|
114
|
+
});
|
|
115
|
+
//# sourceMappingURL=html-error.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"html-error.test.js","sourceRoot":"","sources":["../../test/html-error.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"root":["../cli.ts","../index.ts","../test/default.test.ts","../test/findCoT.test.ts","../test/mission-layer.test.ts","../test/mission.test.ts","../test/pipeline.test.ts","../test/queue.test.ts","../test/uploadPackage.test.ts","../lib/api.ts","../lib/auth.ts","../lib/commands.ts","../lib/fetch.ts","../lib/multipart.ts","../lib/stream.ts","../lib/api/certificate.ts","../lib/api/client.ts","../lib/api/contacts.ts","../lib/api/credentials.ts","../lib/api/export.ts","../lib/api/files.ts","../lib/api/groups.ts","../lib/api/iconsets.ts","../lib/api/injectors.ts","../lib/api/locate.ts","../lib/api/mission-invite.ts","../lib/api/mission-layer.ts","../lib/api/mission-log.ts","../lib/api/mission.ts","../lib/api/oauth.ts","../lib/api/package.ts","../lib/api/profile.ts","../lib/api/query.ts","../lib/api/repeater.ts","../lib/api/security.ts","../lib/api/subscriptions.ts","../lib/api/types.ts","../lib/api/video.ts","../lib/utils/queue.ts"],"version":"6.0.3"}
|
|
1
|
+
{"root":["../cli.ts","../index.ts","../test/default.test.ts","../test/findCoT.test.ts","../test/html-error.test.ts","../test/mission-layer.test.ts","../test/mission.test.ts","../test/pipeline.test.ts","../test/queue.test.ts","../test/uploadPackage.test.ts","../lib/api.ts","../lib/auth.ts","../lib/commands.ts","../lib/fetch.ts","../lib/multipart.ts","../lib/stream.ts","../lib/api/certificate.ts","../lib/api/client.ts","../lib/api/contacts.ts","../lib/api/credentials.ts","../lib/api/export.ts","../lib/api/files.ts","../lib/api/groups.ts","../lib/api/iconsets.ts","../lib/api/injectors.ts","../lib/api/locate.ts","../lib/api/mission-invite.ts","../lib/api/mission-layer.ts","../lib/api/mission-log.ts","../lib/api/mission.ts","../lib/api/oauth.ts","../lib/api/package.ts","../lib/api/profile.ts","../lib/api/query.ts","../lib/api/repeater.ts","../lib/api/security.ts","../lib/api/subscriptions.ts","../lib/api/types.ts","../lib/api/video.ts","../lib/utils/html-error.ts","../lib/utils/queue.ts"],"version":"6.0.3"}
|
package/index.ts
CHANGED
|
@@ -9,6 +9,7 @@ import TAKAPI from './lib/api.js';
|
|
|
9
9
|
import { TAKAuth } from './lib/auth.js';
|
|
10
10
|
import { Queue } from './lib/utils/queue.js';
|
|
11
11
|
export * from './lib/auth.js';
|
|
12
|
+
export * from './lib/utils/html-error.js';
|
|
12
13
|
|
|
13
14
|
/* eslint-disable no-control-regex */
|
|
14
15
|
export const REGEX_CONTROL = /[\u000B-\u001F\u007F-\u009F]/g;
|
package/lib/api.ts
CHANGED
|
@@ -21,6 +21,7 @@ import Subscription from './api/subscriptions.js';
|
|
|
21
21
|
import Video from './api/video.js';
|
|
22
22
|
import Export from './api/export.js';
|
|
23
23
|
import Err from '@openaddresses/batch-error';
|
|
24
|
+
import { TAKServerError, isHTML } from './utils/html-error.js';
|
|
24
25
|
import * as auth from './auth.js';
|
|
25
26
|
|
|
26
27
|
type ErrorWithCause = Error & {
|
|
@@ -210,6 +211,9 @@ export default class TAKAPI {
|
|
|
210
211
|
bdy = null;
|
|
211
212
|
}
|
|
212
213
|
|
|
214
|
+
// TAK Server returns HTML error pages
|
|
215
|
+
if (isHTML(bdy)) throw new TAKServerError(res.status, bdy);
|
|
216
|
+
|
|
213
217
|
throw new Err(res.status, null, bdy || `Status Code: ${res.status}`);
|
|
214
218
|
}
|
|
215
219
|
|
|
@@ -219,7 +223,7 @@ export default class TAKAPI {
|
|
|
219
223
|
return await res.text();
|
|
220
224
|
}
|
|
221
225
|
} catch (err) {
|
|
222
|
-
if (err instanceof
|
|
226
|
+
if (err instanceof Err) throw err;
|
|
223
227
|
throw new Err(400, null, formatFetchError(err));
|
|
224
228
|
}
|
|
225
229
|
}
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
import Err from '@openaddresses/batch-error';
|
|
2
|
+
import xmljs from '@tak-ps/xml-js';
|
|
3
|
+
import type { Element } from '@tak-ps/xml-js';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* TAK Server (Tomcat) returns HTML "Exception Report" pages on failure.
|
|
7
|
+
* Parse them into a human readable message + plain-text details
|
|
8
|
+
* so clients don't render raw HTML.
|
|
9
|
+
*/
|
|
10
|
+
export interface HTMLErrorDetails {
|
|
11
|
+
/** <title> or <h1> */
|
|
12
|
+
title?: string;
|
|
13
|
+
/** <p><b>Label</b> value</p> pairs - ie: Type, Message, Description */
|
|
14
|
+
fields: Record<string, string>;
|
|
15
|
+
/** <pre> stack traces */
|
|
16
|
+
exception?: string;
|
|
17
|
+
/** Visible text fallback */
|
|
18
|
+
text: string;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const HIDDEN = new Set(['style', 'script', 'head']);
|
|
22
|
+
|
|
23
|
+
function collapse(input: string): string {
|
|
24
|
+
return input.replace(/\s+/g, ' ').trim();
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/** Linear-time tag stripper for malformed HTML - drops the contents of HIDDEN elements */
|
|
28
|
+
function stripTags(html: string): string {
|
|
29
|
+
const lower = html.toLowerCase();
|
|
30
|
+
let out = '';
|
|
31
|
+
let i = 0;
|
|
32
|
+
|
|
33
|
+
while (i < html.length) {
|
|
34
|
+
const open = html.indexOf('<', i);
|
|
35
|
+
if (open === -1) {
|
|
36
|
+
out += html.slice(i);
|
|
37
|
+
break;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
out += html.slice(i, open) + ' ';
|
|
41
|
+
|
|
42
|
+
const close = html.indexOf('>', open);
|
|
43
|
+
if (close === -1) break;
|
|
44
|
+
|
|
45
|
+
const tag = lower.slice(open + 1, close).trim().split(/\s/, 1)[0];
|
|
46
|
+
i = close + 1;
|
|
47
|
+
|
|
48
|
+
if (HIDDEN.has(tag)) {
|
|
49
|
+
const end = lower.indexOf(`</${tag}`, i);
|
|
50
|
+
if (end === -1) break;
|
|
51
|
+
i = html.indexOf('>', end);
|
|
52
|
+
if (i === -1) break;
|
|
53
|
+
i += 1;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
return collapse(out);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function textOf(el: Element, opts: { skipPre?: boolean } = {}): string {
|
|
61
|
+
if (el.type === 'text') return String(el.text ?? '');
|
|
62
|
+
if (el.type !== 'element' || !el.elements) return '';
|
|
63
|
+
if (opts.skipPre && el.name === 'pre') return '';
|
|
64
|
+
|
|
65
|
+
return el.elements.map((child) => textOf(child, opts)).join('');
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function* walk(el: Element, skipHidden = true): Generator<Element> {
|
|
69
|
+
if (el.type === 'element' && el.name && skipHidden && HIDDEN.has(el.name.toLowerCase())) return;
|
|
70
|
+
|
|
71
|
+
if (el.type === 'element') yield el;
|
|
72
|
+
|
|
73
|
+
for (const child of el.elements || []) yield* walk(child, skipHidden);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function find(root: Element, name: string): Element | undefined {
|
|
77
|
+
for (const el of walk(root, false)) {
|
|
78
|
+
if (el.name?.toLowerCase() === name) return el;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export function isHTML(body: unknown): body is string {
|
|
83
|
+
if (typeof body !== 'string') return false;
|
|
84
|
+
|
|
85
|
+
const head = body.slice(0, 512).trimStart().toLowerCase();
|
|
86
|
+
|
|
87
|
+
return head.startsWith('<!doctype html')
|
|
88
|
+
|| head.startsWith('<html')
|
|
89
|
+
|| /^<(head|body|title|h1)[\s>]/.test(head);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/** Returns null if body is not HTML */
|
|
93
|
+
export function parseHTMLError(body: unknown): HTMLErrorDetails | null {
|
|
94
|
+
if (!isHTML(body)) return null;
|
|
95
|
+
|
|
96
|
+
const details: HTMLErrorDetails = {
|
|
97
|
+
fields: {},
|
|
98
|
+
text: '',
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
let root: Element;
|
|
102
|
+
try {
|
|
103
|
+
root = xmljs.xml2js(body, { compact: false }) as Element;
|
|
104
|
+
} catch {
|
|
105
|
+
// Not well-formed XHTML - fall back to visible text
|
|
106
|
+
details.text = stripTags(body);
|
|
107
|
+
|
|
108
|
+
return details;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
const title = find(root, 'title') || find(root, 'h1');
|
|
112
|
+
if (title && collapse(textOf(title))) details.title = collapse(textOf(title));
|
|
113
|
+
|
|
114
|
+
const pres: string[] = [];
|
|
115
|
+
let text = '';
|
|
116
|
+
|
|
117
|
+
for (const el of walk(root)) {
|
|
118
|
+
const name = el.name?.toLowerCase();
|
|
119
|
+
|
|
120
|
+
if (name === 'p' && el.elements?.[0]?.name?.toLowerCase() === 'b') {
|
|
121
|
+
const label = collapse(textOf(el.elements[0]));
|
|
122
|
+
const value = collapse(el.elements.slice(1).map((child) => textOf(child)).join(''));
|
|
123
|
+
|
|
124
|
+
if (label && value) details.fields[label] = value;
|
|
125
|
+
} else if (name === 'pre') {
|
|
126
|
+
const value = textOf(el)
|
|
127
|
+
.split('\n')
|
|
128
|
+
.map((line) => line.trimEnd())
|
|
129
|
+
.join('\n')
|
|
130
|
+
.trim();
|
|
131
|
+
|
|
132
|
+
if (value) pres.push(value);
|
|
133
|
+
} else if (name === 'body') {
|
|
134
|
+
text = collapse(textOf(el, { skipPre: true }));
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
if (pres.length) details.exception = pres.join('\n\n');
|
|
139
|
+
|
|
140
|
+
details.text = text || collapse(textOf(root, { skipPre: true }));
|
|
141
|
+
|
|
142
|
+
return details;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/** Most useful human readable line from the page */
|
|
146
|
+
export function summarizeHTMLError(details: HTMLErrorDetails, status?: number): string {
|
|
147
|
+
const message = details.fields.Message
|
|
148
|
+
|| details.fields.message
|
|
149
|
+
|| details.fields.Description
|
|
150
|
+
|| details.fields.description;
|
|
151
|
+
|
|
152
|
+
if (message) return message;
|
|
153
|
+
|
|
154
|
+
if (details.exception) {
|
|
155
|
+
// "<ExceptionClass>: <message>"
|
|
156
|
+
const first = details.exception.split('\n')[0].trim();
|
|
157
|
+
const colon = first.indexOf(': ');
|
|
158
|
+
if (colon !== -1 && colon < first.length - 2) return first.slice(colon + 2).trim();
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
if (details.title) return details.title;
|
|
162
|
+
|
|
163
|
+
if (details.text) return details.text.length > 200 ? details.text.slice(0, 197) + '...' : details.text;
|
|
164
|
+
|
|
165
|
+
return status ? `Status Code: ${status}` : 'Unknown TAK Server Error';
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/** Plain-text breakdown for an "Advanced" details pane */
|
|
169
|
+
export function formatHTMLError(details: HTMLErrorDetails): string {
|
|
170
|
+
const lines: string[] = [];
|
|
171
|
+
|
|
172
|
+
if (details.title) lines.push(details.title);
|
|
173
|
+
|
|
174
|
+
for (const [label, value] of Object.entries(details.fields)) {
|
|
175
|
+
if (value) lines.push(`${label}: ${value}`);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
if (details.exception) {
|
|
179
|
+
if (lines.length) lines.push('');
|
|
180
|
+
lines.push(details.exception);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
if (!lines.length && details.text) lines.push(details.text);
|
|
184
|
+
|
|
185
|
+
return lines.join('\n');
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* TAK Server HTML error page - `safe` is the summary, `details` the full breakdown
|
|
190
|
+
*/
|
|
191
|
+
export class TAKServerError extends Err {
|
|
192
|
+
details: string;
|
|
193
|
+
html: string;
|
|
194
|
+
parsed: HTMLErrorDetails;
|
|
195
|
+
|
|
196
|
+
constructor(status: number, html: string, parsed?: HTMLErrorDetails) {
|
|
197
|
+
const details = parsed || parseHTMLError(html) || {
|
|
198
|
+
fields: {},
|
|
199
|
+
text: stripTags(html)
|
|
200
|
+
};
|
|
201
|
+
|
|
202
|
+
super(status, null, summarizeHTMLError(details, status));
|
|
203
|
+
|
|
204
|
+
this.parsed = details;
|
|
205
|
+
this.details = formatHTMLError(details);
|
|
206
|
+
this.html = html;
|
|
207
|
+
}
|
|
208
|
+
}
|
package/package.json
CHANGED
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import test from 'node:test';
|
|
2
|
+
import assert from 'node:assert/strict';
|
|
3
|
+
import Err from '@openaddresses/batch-error';
|
|
4
|
+
import {
|
|
5
|
+
TAKServerError,
|
|
6
|
+
isHTML,
|
|
7
|
+
parseHTMLError,
|
|
8
|
+
summarizeHTMLError,
|
|
9
|
+
formatHTMLError,
|
|
10
|
+
} from '../lib/utils/html-error.js';
|
|
11
|
+
|
|
12
|
+
const TOMCAT = `<!doctype html><html lang="en"><head><title>HTTP Status 500 – Internal Server Error</title><style type="text/css">body {font-family:Tahoma,Arial,sans-serif;} h1, h2, h3, b {color:white;background-color:#525D76;} h1 {font-size:22px;} h2 {font-size:16px;} h3 {font-size:14px;} p {font-size:12px;} a {color:black;} .line {height:1px;background-color:#525D76;border:none;}</style></head><body><h1>HTTP Status 500 – Internal Server Error</h1><hr class="line" /><p><b>Type</b> Exception Report</p><p><b>Message</b> Exception performing TAK Server authentication</p><p><b>Description</b> The server encountered an unexpected condition that prevented it from fulfilling the request.</p><p><b>Exception</b></p><pre>org.springframework.security.authentication.BadCredentialsException: Exception performing TAK Server authentication
|
|
13
|
+
\tcom.bbn.marti.util.spring.TakAuthenticationProvider.authenticateCore(TakAuthenticationProvider.java:190)
|
|
14
|
+
\tcom.bbn.marti.util.spring.TakAuthenticationProvider.authenticate(TakAuthenticationProvider.java:244)
|
|
15
|
+
\torg.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:181)
|
|
16
|
+
</pre><p><b>Note</b> The full stack trace of the root cause is available in the server logs.</p><hr class="line" /><h3>Apache Tomcat/9.0.86</h3></body></html>`;
|
|
17
|
+
|
|
18
|
+
test('html-error: isHTML', () => {
|
|
19
|
+
assert.equal(isHTML(TOMCAT), true);
|
|
20
|
+
assert.equal(isHTML(' <html><body>x</body></html>'), true);
|
|
21
|
+
assert.equal(isHTML('<h1>HTTP Status 404 – Not Found</h1>'), true);
|
|
22
|
+
assert.equal(isHTML('{"message":"nope"}'), false);
|
|
23
|
+
assert.equal(isHTML('Plain text failure'), false);
|
|
24
|
+
assert.equal(isHTML(null), false);
|
|
25
|
+
assert.equal(isHTML({}), false);
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
test('html-error: entities are decoded', () => {
|
|
29
|
+
const parsed = parseHTMLError('<html><body><p><b>Message</b> a – b & <c> 'd' A</p></body></html>');
|
|
30
|
+
assert.ok(parsed);
|
|
31
|
+
assert.equal(parsed.fields.Message, 'a – b & <c> \'d\' A');
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
test('html-error: malformed HTML strips hidden blocks & unterminated tags', () => {
|
|
35
|
+
const parsed = parseHTMLError('<html><script>let a = "<b>";</script><body><STYLE>b {x:y}</STYLE><p class="x">Gateway <b>Timeout</b><script>never closed');
|
|
36
|
+
assert.ok(parsed);
|
|
37
|
+
assert.equal(parsed.text, 'Gateway Timeout');
|
|
38
|
+
assert.equal(parseHTMLError('<html><body>Broken <tag')?.text, 'Broken');
|
|
39
|
+
|
|
40
|
+
// Pathological input scales linearly (CodeQL polynomial regex finding)
|
|
41
|
+
const time = (n: number) => {
|
|
42
|
+
const big = '<html>' + '<head\t'.repeat(n) + '<'.repeat(n);
|
|
43
|
+
const start = performance.now();
|
|
44
|
+
assert.ok(parseHTMLError(big));
|
|
45
|
+
return performance.now() - start;
|
|
46
|
+
};
|
|
47
|
+
time(1000); // warm up
|
|
48
|
+
const small = time(10000);
|
|
49
|
+
const large = time(40000);
|
|
50
|
+
assert.ok(large < Math.max(small * 10, 50), `4x input took ${large}ms vs ${small}ms`);
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
test('html-error: TAKServerError from non-HTML body', () => {
|
|
54
|
+
const err = new TAKServerError(502, 'upstream <b>down</b>');
|
|
55
|
+
assert.equal(err.message, 'upstream down');
|
|
56
|
+
assert.equal(err.details, 'upstream down');
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
test('html-error: malformed HTML falls back to visible text', () => {
|
|
60
|
+
const parsed = parseHTMLError('<html><head><style>b {x:y}</style></head><body><p>Bad Gateway<br>upstream unavailable</body></html>');
|
|
61
|
+
assert.ok(parsed);
|
|
62
|
+
assert.equal(parsed.title, undefined);
|
|
63
|
+
assert.equal(parsed.text, 'Bad Gateway upstream unavailable');
|
|
64
|
+
assert.equal(summarizeHTMLError(parsed, 502), 'Bad Gateway upstream unavailable');
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
test('html-error: parseHTMLError - Tomcat Exception Report', () => {
|
|
68
|
+
const parsed = parseHTMLError(TOMCAT);
|
|
69
|
+
assert.ok(parsed);
|
|
70
|
+
|
|
71
|
+
assert.equal(parsed.title, 'HTTP Status 500 – Internal Server Error');
|
|
72
|
+
assert.deepEqual(parsed.fields, {
|
|
73
|
+
Type: 'Exception Report',
|
|
74
|
+
Message: 'Exception performing TAK Server authentication',
|
|
75
|
+
Description: 'The server encountered an unexpected condition that prevented it from fulfilling the request.',
|
|
76
|
+
Note: 'The full stack trace of the root cause is available in the server logs.',
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
assert.ok(parsed.exception);
|
|
80
|
+
assert.ok(parsed.exception.startsWith('org.springframework.security.authentication.BadCredentialsException: Exception performing TAK Server authentication\n'));
|
|
81
|
+
assert.ok(parsed.exception.includes('TakAuthenticationProvider.java:244'));
|
|
82
|
+
assert.ok(!parsed.exception.endsWith('\n'));
|
|
83
|
+
|
|
84
|
+
// Styles & exception body are excluded from the text fallback
|
|
85
|
+
assert.ok(!parsed.text.includes('font-family'));
|
|
86
|
+
assert.ok(!parsed.text.includes('TakAuthenticationProvider'));
|
|
87
|
+
assert.ok(parsed.text.includes('Apache Tomcat/9.0.86'));
|
|
88
|
+
|
|
89
|
+
assert.equal(summarizeHTMLError(parsed), 'Exception performing TAK Server authentication');
|
|
90
|
+
|
|
91
|
+
const formatted = formatHTMLError(parsed);
|
|
92
|
+
assert.equal(formatted.split('\n').slice(0, 6).join('\n'), [
|
|
93
|
+
'HTTP Status 500 – Internal Server Error',
|
|
94
|
+
'Type: Exception Report',
|
|
95
|
+
'Message: Exception performing TAK Server authentication',
|
|
96
|
+
'Description: The server encountered an unexpected condition that prevented it from fulfilling the request.',
|
|
97
|
+
'Note: The full stack trace of the root cause is available in the server logs.',
|
|
98
|
+
'',
|
|
99
|
+
].join('\n'));
|
|
100
|
+
assert.ok(formatted.endsWith('ProviderManager.authenticate(ProviderManager.java:181)'));
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
test('html-error: parseHTMLError - status page without Message', () => {
|
|
104
|
+
const parsed = parseHTMLError('<!doctype html><html><head><title>HTTP Status 404 – Not Found</title></head><body><h1>HTTP Status 404 – Not Found</h1><p><b>Type</b> Status Report</p><p><b>Description</b> The origin server did not find a current representation for the target resource.</p></body></html>');
|
|
105
|
+
assert.ok(parsed);
|
|
106
|
+
assert.equal(summarizeHTMLError(parsed, 404), 'The origin server did not find a current representation for the target resource.');
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
test('html-error: parseHTMLError - exception only', () => {
|
|
110
|
+
const parsed = parseHTMLError('<html><body><pre>java.lang.IllegalStateException: Mission already exists</pre></body></html>');
|
|
111
|
+
assert.ok(parsed);
|
|
112
|
+
assert.equal(summarizeHTMLError(parsed), 'Mission already exists');
|
|
113
|
+
assert.equal(formatHTMLError(parsed), 'java.lang.IllegalStateException: Mission already exists');
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
test('html-error: parseHTMLError - unstructured HTML', () => {
|
|
117
|
+
const parsed = parseHTMLError('<html><body><div>Service Unavailable</div></body></html>');
|
|
118
|
+
assert.ok(parsed);
|
|
119
|
+
assert.equal(parsed.title, undefined);
|
|
120
|
+
assert.equal(summarizeHTMLError(parsed, 503), 'Service Unavailable');
|
|
121
|
+
assert.equal(formatHTMLError(parsed), 'Service Unavailable');
|
|
122
|
+
|
|
123
|
+
assert.equal(parseHTMLError('not html'), null);
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
test('html-error: TAKServerError', () => {
|
|
127
|
+
const err = new TAKServerError(500, TOMCAT);
|
|
128
|
+
|
|
129
|
+
assert.ok(err instanceof Err);
|
|
130
|
+
assert.ok(err instanceof Error);
|
|
131
|
+
assert.equal(err.name, 'PublicError');
|
|
132
|
+
assert.equal(err.status, 500);
|
|
133
|
+
assert.equal(err.message, 'Exception performing TAK Server authentication');
|
|
134
|
+
assert.equal(err.safe, 'Exception performing TAK Server authentication');
|
|
135
|
+
assert.ok(err.details.startsWith('HTTP Status 500 – Internal Server Error\nType: Exception Report\n'));
|
|
136
|
+
assert.ok(err.details.includes('BadCredentialsException'));
|
|
137
|
+
assert.equal(err.html, TOMCAT);
|
|
138
|
+
assert.equal(err.parsed.fields.Type, 'Exception Report');
|
|
139
|
+
});
|