Skip to content

fix arguments scope bug in fetch header injection callback#28

Open
maxeoneo wants to merge 1 commit into
acsbendi:masterfrom
maxeoneo:fix/warning
Open

fix arguments scope bug in fetch header injection callback#28
maxeoneo wants to merge 1 commit into
acsbendi:masterfrom
maxeoneo:fix/warning

Conversation

@maxeoneo

Copy link
Copy Markdown
Contributor

In the string URL branch of the window.fetch override, the callback passed to setAdditionalHeaders used arguments[1] to update the fetch options headers. But inside a regular function() arguments is rebound to the callback's own argument list, which only receives extraHeaders as arguments[0], making arguments[1] always undefined.

This caused a "TypeError: Cannot set properties of undefined (setting 'headers')". The error was caught silently by the try/catch in setAdditionalHeaders but a warning was logged. It only appeared for specific requests because only fetch calls using the Request object form (else branch) guard header injection inside a for...in loop, so they only error when extra headers are actually returned.

Now we capture arguments[1] into a fetchOptions variable in the outer window.fetch scope before the callback and reference that variable inside the callback instead. We also normalize the headers first, since there are three different header objects possible: Headers instance, an array of tuples and a plain object.

In the string URL branch of the window.fetch override, the callback passed to setAdditionalHeaders used `arguments[1]` to update the fetch options headers. But inside a regular function() `arguments` is rebound to the callback's own argument list, which only receives `extraHeaders` as arguments[0], making arguments[1] always undefined.

This caused a "TypeError: Cannot set properties of undefined (setting 'headers')". The error was caught silently by the try/catch in setAdditionalHeaders but a warning was logged. It only appeared for specific requests because only fetch calls using the Request object form (else branch) guard header injection inside a for...in loop, so they only error when extra headers are actually returned.

Now we capture `arguments[1]` into a `fetchOptions` variable in the outer window.fetch scope before the callback and reference that variable inside the callback instead.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant