playwright icon indicating copy to clipboard operation
playwright copied to clipboard

[BUG] page.waitForResponse: response.text: Protocol error (Network.getResponseBody): (NS_ERROR_INVALID_CONTENT_ENCODING)

Open phramusca opened this issue 1 year ago • 4 comments

System info

  • Playwright Version: 1.33.0
  • Operating System: Windows 11
  • Browser: Firefox (works with WebKit and chromium)

Source code

await page.routeFromHAR('test.har', { notFound: 'fallback', url: HAR_URL, update: HAR_UPDATE, }); await Promise.all([page.waitForLoadState(), page.goto('/')]); ....... await page.waitForResponse(async response => { const text = await response.text(); return text.includes('accessToken') && text.includes('refreshToken') && text.includes('user'); });

here is an extract of the har, of the impacted response: "response": { "status": 200, "statusText": "OK", "httpVersion": "HTTP/1.1", "cookies": [], "headers": [ { "name": "Date", "value": "Wed" }, { "name": "Date", "value": "31 Jan 2024 13:47:53 GMT" }, { "name": "Content-Type", "value": "application/json; charset=utf-8" }, { "name": "Vary", "value": "Accept-Encoding" }, { "name": "X-Powered-By", "value": "Express" }, { "name": "Access-Control-Allow-Origin", "value": "*" }, { "name": "Access-Control-Allow-Credentials", "value": "true" }, { "name": "Access-Control-Expose-Headers", "value": "Content-Disposition" }, { "name": "ETag", "value": "W/"12e8-QR9mR2QsWwob72j5OSbnt3cOsDY"" }, { "name": "Content-Encoding", "value": "gzip" }, { "name": "Via", "value": "1.1 google" }, { "name": "Content-Length", "value": "1779" } ], "content": { "size": -1, "mimeType": "application/json; charset=utf-8", "_file": "411f6647642c5b0a1bef68f93926e7b7770eb036.json" },

Steps Works fine with webkit and chromium. However, while it works fine with Firefox if HAR_UPDATE=true, it fails on the response.text() when using har (HAR_UPDATE=false)

Note that if I remove { "name": "Content-Encoding", "value": "gzip" }, from the response in har, test passes on all chromium, webkit AND firefox (even with HAR_UPDATE=false).

Any idea of what could be wrong ?

Expected

Pass

Actual

Error: page.waitForResponse: response.text: Protocol error (Network.getResponseBody): Component returned failure code: 0x804b001b (NS_ERROR_INVALID_CONTENT_ENCODING) [nsIStreamListener.onDataAvailable] convertString@chrome://juggler/content/NetworkObserver.js:932:13 getBase64EncodedResponse@chrome://juggler/content/NetworkObserver.js:841:18 getResponseBody@chrome://juggler/content/NetworkObserver.js:90:34 Network.getResponseBody@chrome://juggler/content/protocol/PageHandler.js:261:30 dispatch@chrome://juggler/content/protocol/Dispatcher.js:132:39 _dispatch@chrome://juggler/content/protocol/Dispatcher.js:69:36 receiveMessage@chrome://juggler/content/components/Juggler.js:118:20

phramusca avatar Jan 31 '24 14:01 phramusca

We need to have a full repro to be able to act on this issue, please follow the BUG issue template to provide one.

pavelfeldman avatar Jan 31 '24 17:01 pavelfeldman

I hoped that the issue might be known or that you would have an idea on the problem. I will try to make a repro then

phramusca avatar Feb 01 '24 08:02 phramusca

I don't know how to provide a repro. I have a website running in local that calls a backend API. I record calls to backend in har. But, I cannot provide front nor back code :(

phramusca avatar Feb 01 '24 13:02 phramusca

A basic repo with a server that serves one file that demonstrates the problem would suffice.

pavelfeldman avatar Feb 01 '24 17:02 pavelfeldman

I finally found out some time to create a repro: ReproIssueFirefox.zip

Here are the results I get:

`npx playwright test

Running 3 tests using 3 workers

✓ 1 [chromium] › example.test.js:3:5 › Repro firefox issue (1.7s) ✓ 2 [webkit] › example.test.js:3:5 › Repro firefox issue (2.6s) ✘ 3 [firefox] › example.test.js:3:5 › Repro firefox issue (3.5s) before page load page loaded button clicked. waiting on response received response test: {"data":{"signin":{"accessToken":"ThisIsTheValueIwant"}}}

before page load page loaded button clicked. waiting on response received response test: {"data":{"signin":{"accessToken":"ThisIsTheValueIwant"}}}

before page load page loaded received response

  1. [firefox] › example.test.js:3:5 › Repro firefox issue ─────────────────────────────────────────
Error: page.waitForResponse: response.text: Protocol error (Network.getResponseBody): Component returned failure code: 0x804b001b (NS_ERROR_INVALID_CONTENT_ENCODING) [nsIStreamListener.onDataAvailable]

  12 |     page.getByRole('button', { name: 'Charger les utilisateurs', exact: true }).click(),
  13 |     console.log('button clicked. waiting on response');
> 14 |     await page.waitForResponse(async response => {
     |                ^
  15 |         console.log('received response');
  16 |         const text = await response.text();
  17 |         console.log('test:', text);

    at C:\xxxxxx\ReproIssueFirefox\tests\example.test.js:14:16

1 failed [firefox] › example.test.js:3:5 › Repro firefox issue ────────────────────────────────────────── 2 passed (17.1s)`

phramusca avatar Feb 05 '24 15:02 phramusca

Investigation notes: we fulfill with { "name": "Content-Encoding", "value": "gzip" } which makes firefox network observer try to decode json as gzip.

dgozman avatar Feb 05 '24 20:02 dgozman

Hi @dgozman Any news ?

phramusca avatar Feb 23 '24 15:02 phramusca