diff --git a/package.json b/package.json index 9228931..a432b37 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@webrecorder/wombat", - "version": "3.7.9", + "version": "3.7.10", "main": "index.js", "license": "AGPL-3.0-or-later", "author": "Ilya Kreymer, Webrecorder Software", diff --git a/src/wombat.js b/src/wombat.js index d5c24cd..00268cb 100755 --- a/src/wombat.js +++ b/src/wombat.js @@ -3026,6 +3026,9 @@ Wombat.prototype.overridePropExtract = function(proto, prop) { var new_getter = function () { var obj = wombat.proxyToObj(this); var res = orig_getter.call(obj); + if (obj.__WB_no_unrewrite) { + return res; + } return wombat.extractOriginalURL(res); }; this.defGetterProp(proto, prop, new_getter); @@ -4612,25 +4615,15 @@ Wombat.prototype.initHTTPOverrides = function() { if (input instanceof Request) { var new_url = wombat.rewriteUrl(input.url); - var real_url = input.__WB_real_url; - // if already a Request with rewritten url, just use that - if (new_url === input.url || new_url === real_url || new_url === wombat.$wbwindow.location.origin + real_url) { + input.__WB_no_unrewrite = true; + if (new_url === input.url) { request = input; } else { request = new Request(new_url, input); } + delete input.__WB_no_unrewrite; } else { input = wombat.rewriteUrl(input.toString()); - - if (!init_opts) { - init_opts = {}; - } - if (init_opts.credentials === undefined) { - try { - init_opts.credentials = 'include'; - } catch(e) {} - } - request = new Request(input, init_opts); } @@ -4665,30 +4658,24 @@ Wombat.prototype.initHTTPOverrides = function() { } break; } - const props = ['cache', 'headers', 'integrity', - 'keepalive', 'method', 'mode', 'redirect', - 'referrerPolicy', 'signal' - ]; - - const newOpts = {}; - - for (const prop of props) { - newOpts[prop] = newInitOpts[prop]; - } - - newOpts.credentials = 'include'; - - if (newInitOpts.referrer) { - newOpts.referrer = wombat.rewriteUrl(newInitOpts.referrer); + let unrwSet = false; + // make a duplicate object to override referrer + if (newInitOpts && newInitOpts.referrer) { + var newReferrer = wombat.rewriteUrl(newInitOpts.referrer); + if (newReferrer !== newInitOpts.referrer) { + if (newInitOpts instanceof Request) { + newInitOpts.__WB_no_unrewrite = true; + unrwSet = true; + } else { + newInitOpts.referrer = newReferrer; + } + } } - if (newInitOpts.duplex && newInitOpts.body) { - newOpts.body = newInitOpts.body; - newOpts.duplex = newInitOpts.duplex; + var request = new Request_(newInput, newInitOpts); + if (unrwSet) { + delete newInitOpts.__WB_no_unrewrite; } - - var request = new Request_(newInput, newOpts); - request.__WB_real_url = newInput; return request; }; })(this.$wbwindow.Request); diff --git a/test/overrides-http.js b/test/overrides-http.js index 1bfe33d..f11d3bc 100644 --- a/test/overrides-http.js +++ b/test/overrides-http.js @@ -118,15 +118,36 @@ test('fetch: should rewrite the input argument when it is an Request object, als const data = await response.json(); return {url: data.url, rwUrl: request.url, - realUrl: request.__WB_real_url, respURL: response.url}; }); t.is(result.rwUrl, 'https://tests.wombat.io/test'); - t.is(result.realUrl, '/live/20180803160549mp_/https://tests.wombat.io/test'); t.is(result.url, '/live/20180803160549mp_/https://tests.wombat.io/test'); t.is(result.respURL, 'https://tests.wombat.io/test'); }); +test('fetch: Request.referrer is rewritten across multiple copies of Request', async t => { + const { sandbox, server } = t.context; + const result = await sandbox.evaluate(async () => { + let to; + let A = new Request('/test', {'referrer': '/abc'}); + let B = new Request('/test', A); + let C = new Request(B, {'referrer': '/xyz'}); + let D = new Request({'url': '/test', 'referrer': '/cde'}, C); + D.__WB_no_unrewrite = true; + + return {A: A.referrer, + B: B.referrer, + C: C.referrer, + D: D.referrer + }; + }); + t.is(result.A, 'https://tests.wombat.io/abc'); + t.is(result.B, 'https://tests.wombat.io/abc'); + t.is(result.C, 'https://tests.wombat.io/xyz'); + t.is(result.D, 'http://localhost:3030/live/20180803160549mp_/https://tests.wombat.io/xyz'); +}); + + test('fetch: should rewrite the input argument when it is a object, but return original', async t => { const { sandbox, server } = t.context; const result = await sandbox.evaluate(async () => {