From f9e83c000f5a6f43c6223202adc205de591c289f Mon Sep 17 00:00:00 2001 From: JonLuca DeCaro Date: Tue, 5 Mar 2024 18:40:23 -0800 Subject: [PATCH] fix(parsing): allow invalid decodeUriComponent parsing to occur #296 --- lib/pointer.ts | 10 +++++++++- test/specs/pointer/null.spec.ts | 8 ++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 test/specs/pointer/null.spec.ts diff --git a/lib/pointer.ts b/lib/pointer.ts index 35aeedc0..5a32fa7d 100644 --- a/lib/pointer.ts +++ b/lib/pointer.ts @@ -8,6 +8,14 @@ const tildes = /~/g; const escapedSlash = /~1/g; const escapedTilde = /~0/g; +const safeDecodeURIComponent = (encodedURIComponent: string): string => { + try { + return decodeURIComponent(encodedURIComponent); + } catch { + return encodedURIComponent; + } +}; + /** * This class represents a single JSON pointer and its resolved value. * @@ -181,7 +189,7 @@ class Pointer { // Decode each part, according to RFC 6901 for (let i = 0; i < pointer.length; i++) { - pointer[i] = decodeURIComponent(pointer[i].replace(escapedSlash, "/").replace(escapedTilde, "~")); + pointer[i] = safeDecodeURIComponent(pointer[i].replace(escapedSlash, "/").replace(escapedTilde, "~")); } if (pointer[0] !== "") { diff --git a/test/specs/pointer/null.spec.ts b/test/specs/pointer/null.spec.ts new file mode 100644 index 00000000..d8d912ed --- /dev/null +++ b/test/specs/pointer/null.spec.ts @@ -0,0 +1,8 @@ +import { describe, it } from "vitest"; +import Pointer from "../../../lib/pointer"; + +describe("Pointers", () => { + it("should parse successfully", async () => { + Pointer.parse("#/c%d"); + }); +});