Skip to content

Commit 624f0ed

Browse files
Validate xml before parsing.
1 parent 0229fd8 commit 624f0ed

File tree

6 files changed

+35
-17
lines changed

6 files changed

+35
-17
lines changed
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
export { parseXml, findChildElements, findElementRecursive, computeAttributeMap, qnameEq, qnamesInclude } from 'https://raw.githubusercontent.com/skymethod/denoflare/v0.5.1/common/xml_parser.ts';
2-
export type { ExtendedXmlNode, Qname } from 'https://raw.githubusercontent.com/skymethod/denoflare/v0.5.1/common/xml_parser.ts';
1+
export { parseXml, validateXml, findChildElements, findElementRecursive, computeAttributeMap, qnameEq, qnamesInclude } from 'https://raw.githubusercontent.com/skymethod/denoflare/eeacf004d8ec15913f94d5644d10f8f04d5340d2/common/xml_parser.ts';
2+
export type { ExtendedXmlNode, Qname } from 'https://raw.githubusercontent.com/skymethod/denoflare/eeacf004d8ec15913f94d5644d10f8f04d5340d2/common/xml_parser.ts';

validator-worker/common/validation_job_vm.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { checkMatches, checkEqual } from './check.ts';
22
import { Qnames } from './qnames.ts';
33
import { isReadonlyArray } from './util.ts';
44
import { RuleReference, MessageOptions, ValidationCallbacks, validateFeedXml, podcastIndexReference } from './validator.ts';
5-
import { computeAttributeMap, ExtendedXmlNode, parseXml } from './deps_xml.ts';
5+
import { computeAttributeMap, ExtendedXmlNode, parseXml, validateXml } from './deps_xml.ts';
66
import { setIntersect } from './sets.ts';
77
import { InMemoryCache, Callbacks, Comment, makeRateLimitedFetcher, makeThreadcap, Threadcap, updateThreadcap, Fetcher as ThreadcapFetcher } from './deps_comments.ts';
88

@@ -189,6 +189,11 @@ export class ValidationJobVM {
189189

190190
let xml: ExtendedXmlNode | undefined;
191191
try {
192+
const result = validateXml(text);
193+
if (result !== true) {
194+
const { code, col, line, msg } = result;
195+
throw new Error(`${code} (at line ${line}, col ${col}): ${msg}`);
196+
}
192197
xml = parseXml(text);
193198
console.log(xml);
194199
} catch (e) {

validator-worker/deps_cli.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
export { basename, dirname, join, fromFileUrl, resolve, toFileUrl, extname, relative, isAbsolute, normalize, parse as parsePath, globToRegExp } from 'https://deno.land/std@0.140.0/path/mod.ts';
22
export { parse as parseFlags } from 'https://deno.land/std@0.140.0/flags/mod.ts';
3-
export { ModuleWatcher } from 'https://raw.githubusercontent.com/skymethod/denoflare/v0.5.1/cli/module_watcher.ts';
4-
export { bundle } from 'https://raw.githubusercontent.com/skymethod/denoflare/e5a9ba66237f9e3a5d555442252539ec267ae989/cli/bundle.ts';
5-
export { fileExists } from 'https://raw.githubusercontent.com/skymethod/denoflare/v0.5.1/cli/fs_util.ts';
6-
export { Bytes } from 'https://raw.githubusercontent.com/skymethod/denoflare/v0.5.1/common/bytes.ts';
7-
export { parseJsonc } from 'https://raw.githubusercontent.com/skymethod/denoflare/v0.5.1/cli/jsonc.ts';
3+
export { ModuleWatcher } from 'https://raw.githubusercontent.com/skymethod/denoflare/eeacf004d8ec15913f94d5644d10f8f04d5340d2/cli/module_watcher.ts';
4+
export { bundle } from 'https://raw.githubusercontent.com/skymethod/denoflare/eeacf004d8ec15913f94d5644d10f8f04d5340d2/cli/bundle.ts';
5+
export { fileExists } from 'https://raw.githubusercontent.com/skymethod/denoflare/eeacf004d8ec15913f94d5644d10f8f04d5340d2/cli/fs_util.ts';
6+
export { Bytes } from 'https://raw.githubusercontent.com/skymethod/denoflare/eeacf004d8ec15913f94d5644d10f8f04d5340d2/common/bytes.ts';
7+
export { parseJsonc } from 'https://raw.githubusercontent.com/skymethod/denoflare/eeacf004d8ec15913f94d5644d10f8f04d5340d2/cli/jsonc.ts';

validator-worker/deps_worker.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
export { Bytes } from 'https://raw.githubusercontent.com/skymethod/denoflare/v0.5.1/common/bytes.ts';
2-
export { importText } from 'https://raw.githubusercontent.com/skymethod/denoflare/v0.5.1/common/import_text.ts';
3-
export type { IncomingRequestCf, ModuleWorkerContext, DurableObjectNamespace, DurableObjectState } from 'https://raw.githubusercontent.com/skymethod/denoflare/v0.5.1/common/cloudflare_workers_types.d.ts';
4-
export { ColoFromTrace } from 'https://raw.githubusercontent.com/skymethod/denoflare/v0.5.1/examples/tiered-websockets-worker/colo_from_trace.ts';
1+
export { Bytes } from 'https://raw.githubusercontent.com/skymethod/denoflare/eeacf004d8ec15913f94d5644d10f8f04d5340d2/common/bytes.ts';
2+
export { importText } from 'https://raw.githubusercontent.com/skymethod/denoflare/eeacf004d8ec15913f94d5644d10f8f04d5340d2/common/import_text.ts';
3+
export type { IncomingRequestCf, ModuleWorkerContext, DurableObjectNamespace, DurableObjectState } from 'https://raw.githubusercontent.com/skymethod/denoflare/eeacf004d8ec15913f94d5644d10f8f04d5340d2/common/cloudflare_workers_types.d.ts';
4+
export { ColoFromTrace } from 'https://raw.githubusercontent.com/skymethod/denoflare/eeacf004d8ec15913f94d5644d10f8f04d5340d2/examples/tiered-websockets-worker/colo_from_trace.ts';

validator-worker/static/app.js

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2389,11 +2389,13 @@ var getTraversalObj$1 = parser.getTraversalObj;
23892389
parser.j2xParser;
23902390
parser.parse;
23912391
parser.parseToNimn;
2392-
parser.validate;
2393-
function decodeXml(encoded) {
2392+
var validate$1 = parser.validate;
2393+
function decodeXml(encoded, additionalEntities = {}) {
23942394
return encoded.replaceAll(/&(#(\d+)|[a-z]+);/g, (str, entity, decimal)=>{
23952395
if (typeof decimal === 'string') return String.fromCharCode(parseInt(decimal));
23962396
if (typeof entity === 'string') {
2397+
const additional = additionalEntities[entity];
2398+
if (additional) return additional;
23972399
const rt = ENTITIES_TO_UNENCODED_CHARS[entity];
23982400
if (rt) return rt;
23992401
}
@@ -2407,12 +2409,18 @@ const ENTITIES_TO_UNENCODED_CHARS = {
24072409
'apos': `'`,
24082410
'quot': '"'
24092411
};
2410-
function parseXml(xml) {
2412+
function validateXml(xml) {
2413+
const rt = validate$1(xml);
2414+
return rt === true ? rt : rt.err;
2415+
}
2416+
function parseXml(xml, opts = {}) {
2417+
const { additionalEntities } = opts;
2418+
const tagValueProcessor = (tagName)=>decodeXml(tagName, additionalEntities);
24112419
const rt = getTraversalObj$1(xml, {
24122420
ignoreAttributes: false,
24132421
parseAttributeValue: false,
24142422
parseNodeValue: false,
2415-
tagValueProcessor: decodeXml
2423+
tagValueProcessor
24162424
});
24172425
const namespaces = new XmlNamespaces();
24182426
applyQnames(rt, namespaces);
@@ -4215,6 +4223,11 @@ class ValidationJobVM {
42154223
start = Date.now();
42164224
let xml;
42174225
try {
4226+
const result = validateXml(text);
4227+
if (result !== true) {
4228+
const { code , col , line , msg } = result;
4229+
throw new Error(`${code} (at line ${line}, col ${col}): ${msg}`);
4230+
}
42184231
xml = parseXml(text);
42194232
console.log(xml);
42204233
} catch (e) {
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
343c7c4c43753e414235693f577f48d9f9382172
1+
d053ae71a909e6e2ac4854bff6e2559e57f525a7

0 commit comments

Comments
 (0)