I have an iframe in an electron app (v6.1.2) that loads an external URL. I need to load that URL with a custom header, therefore I use webRequest.onBeforeSendHeaders()
in order to intercept the requests and insert that header. As soon as I pass requestHeaders
to the callback parameter, cookies in the iframe stop working.
in main.js
:
import { remote } from 'electron'
// the constant MY_URL used below contains the extarnal URL
const webRequest = remote.getCurrentWindow().webContents.session.webRequest;
webRequest.onBeforeSendHeaders(
{
urls: [`${MY_URL}*`]
},
(details, callback) => {
// I need to clone details.headers, as simply setting
// details.headers['X-MY-CUSTOM-HEADER']
// won't work
let requestHeaders = Object.assign({}, details.headers);
requestHeaders['X-MY-CUSTOM-HEADER'] = '1'
// even if I set requestHeaders to details.headers, the issue persists.
// only removing the requestHeaders property from the object below will make it work again:
callback({ cancel: false, requestHeaders });
},
['blocking', 'requestHeaders'] // doesn't make a difference,
// and I didn't find anything cookie-related for the "extraInfoSpec" argument
);
PHP Script at the target URL:
<?php
session_start();
var_dump(session_id());
var_dump($_COOKIE);
exit;
?>
The (pseudo-)output of that script on every refresh of the app or iframe is this:
string(26) "(random PHP session ID different on every call here)" array(0) { }
If I remove the requestHeaders
property from the callback argument in main.js
above, the output is as desired: the PHP session ID stays the same and any cookies the target site sets persist. That's how I know that it's not an issue on the PHP side. I can also rule out that the X-MY-CUSTOM-HEADER
itself is interfering, as even when not changing the headers at all (see code comments), the issue remains.
Am I missing something or is this a bug in electron? Is there any way around this?
It turned out to be a rather stupid mistake, but as it's quite hard to find any good documentation about this API, I'd tend to not close this as a simple typo, as I think it might be of help to others.
The details
object has a headers
property and a requestHeaders
property. I'm actually not sure what the difference is, as there seem to be some overlappings. I correctly overwrote the requestHeaders
, but I did so extending details.headers
instead of details.requestHeaders
. So all I had to do was changing
let requestHeaders = Object.assign({}, details.headers);
to
let requestHeaders = Object.assign({}, details.requestHeaders);