diff --git a/package.json b/package.json index e4d2835..6599d73 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "warcio", - "version": "2.4.3", + "version": "2.4.4", "keywords": [ "WARC", "web archiving" diff --git a/src/lib/utils.ts b/src/lib/utils.ts index 9bfe9e7..ef9fc91 100644 --- a/src/lib/utils.ts +++ b/src/lib/utils.ts @@ -124,13 +124,20 @@ export function postToGetUrl(request: Request) { } if (query != null) { + request.requestBody = query; + try { + query = decodeURI(query); + } catch (_) { + // just clear out invalid query string + query = ""; + } + request.url = appendRequestQuery( request.url, - decodeURI(query), + query, request.method, ); request.method = "GET"; - request.requestBody = query; return true; } diff --git a/test/testUtils.test.ts b/test/testUtils.test.ts index a5c59a4..de6fa70 100644 --- a/test/testUtils.test.ts +++ b/test/testUtils.test.ts @@ -80,6 +80,20 @@ describe("utils", () => { ); }); + test("post-to-get bad query string", () => { + const request = { + postData: "a=b&c=%ac", + headers: new Headers({"Content-Type": "application/x-www-form-urlencoded"}), + method: "POST", + url: "https://example.com/path/file", + }; + const result = postToGetUrl(request); + expect(result).toBe(true); + expect(request.url).toBe( + "https://example.com/path/file?__wb_method=POST&", + ); + }); + test("surt with www", () => { expect(getSurt("https://www23.example.com/some/path")).toBe( "com,example)/some/path",