diff --git a/src/main/ua-parser.js b/src/main/ua-parser.js index 7978902..8730b63 100755 --- a/src/main/ua-parser.js +++ b/src/main/ua-parser.js @@ -1236,14 +1236,21 @@ headers = extensions; // case UAParser(ua, headers) extensions = undefined; } + + // Convert Headers object into a plain object + if (headers && typeof headers.append === FUNC_TYPE) { + var kv = {}; + headers.forEach(function (v, k) { kv[k] = v; }); + headers = kv; + } if (!(this instanceof UAParser)) { return new UAParser(ua, extensions, headers).getResult(); } var userAgent = typeof ua === STR_TYPE ? ua : // Passed user-agent string - ((NAVIGATOR && NAVIGATOR.userAgent) ? NAVIGATOR.userAgent : // navigator.userAgent (headers && headers[USER_AGENT] ? headers[USER_AGENT] : // User-Agent from passed headers + ((NAVIGATOR && NAVIGATOR.userAgent) ? NAVIGATOR.userAgent : // navigator.userAgent EMPTY)), // empty string httpUACH = new UACHData(headers, true), diff --git a/test/playwright-test-main.spec.mjs b/test/playwright-test-main.spec.mjs index fe4ac7c..db6e149 100644 --- a/test/playwright-test-main.spec.mjs +++ b/test/playwright-test-main.spec.mjs @@ -123,4 +123,21 @@ test.describe('withFeatureCheck() tests', () => { expect(uap).toHaveProperty('device.model', 'iPad'); expect(uap).toHaveProperty('device.type', 'tablet'); }); -}); \ No newline at end of file +}); + +test.describe('request.headers can be passed in form of a Headers object', () => { + + test('Headers automatically converted into a plain key-value object', async ({ page }) => { + await page.addInitScript(() => { + Object.defineProperty(window, 'req', { + value : { + headers: new Headers([["User-Agent", "myBrowser/1.0"]]) + } + }); + }); + await page.goto(localHtml); + // @ts-ignore + const uap = await page.evaluate(() => UAParser(req.headers)); + expect(uap.ua).toBe('myBrowser/1.0'); + }); +});