Skip to content

Commit a33021b

Browse files
committed
Re-expose Set-Cookie in fetch(), fix multiple Set-Cookie headers
1 parent ad2e822 commit a33021b

File tree

1 file changed

+37
-4
lines changed

1 file changed

+37
-4
lines changed

extension/src/bg/background.js

Lines changed: 37 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,14 @@ async function perform_http_request(params) {
199199
var response_headers = {};
200200

201201
for (var pair of response.headers.entries()) {
202-
response_headers[pair[0]] = pair[1];
202+
// Fix Set-Cookie from onHeadersReceived (fetch() doesn't expose it)
203+
if (pair[0] === 'x-set-cookie') {
204+
// Original Set-Cookie may merge multiple headers, we have it packed
205+
response_headers['Set-Cookie'] = JSON.parse(pair[1]);
206+
}
207+
else {
208+
response_headers[pair[0]] = pair[1];
209+
}
203210
}
204211

205212
const redirect_hack_url_prefix = `${location.origin.toString()}/redirect-hack.html?id=`;
@@ -219,7 +226,15 @@ async function perform_http_request(params) {
219226
// Format headers
220227
var redirect_hack_headers = {};
221228
response_metadata.headers.map(header_data => {
222-
redirect_hack_headers[header_data.name] = header_data.value;
229+
// Original Set-Cookie may merge multiple headers, skip it
230+
if (header_data.name.toLowerCase() !== 'set-cookie') {
231+
if (header_data.name === 'X-Set-Cookie') {
232+
redirect_hack_headers['Set-Cookie'] = JSON.parse(header_data.value);
233+
}
234+
else {
235+
redirect_hack_headers[header_data.name] = header_data.value;
236+
}
237+
}
223238
});
224239

225240
const redirect_hack_data = {
@@ -402,8 +417,26 @@ chrome.webRequest.onHeadersReceived.addListener(function(details) {
402417
return
403418
}
404419

420+
// Rewrite Set-Cookie to expose it in fetch()
421+
cookies = []
422+
details.responseHeaders.map(responseHeader => {
423+
if(responseHeader.name.toLowerCase() === 'set-cookie') {
424+
cookies.push(responseHeader.value);
425+
}
426+
});
427+
if (cookies.length != 0) {
428+
details.responseHeaders.push({
429+
'name': 'X-Set-Cookie',
430+
// We pack array of cookies into string and depack later.
431+
// Otherwise multiple Set-Cookie headers would be merged together.
432+
'value': JSON.stringify(cookies)
433+
});
434+
}
435+
405436
if(!REDIRECT_STATUS_CODES.includes(details.statusCode)) {
406-
return
437+
return {
438+
responseHeaders: details.responseHeaders
439+
}
407440
}
408441

409442
const redirect_hack_id = uuidv4();
@@ -419,4 +452,4 @@ chrome.webRequest.onHeadersReceived.addListener(function(details) {
419452
};
420453
}, {
421454
urls: ["<all_urls>"]
422-
}, ["blocking", "responseHeaders", "extraHeaders"]);
455+
}, ["blocking", "responseHeaders", "extraHeaders"]);

0 commit comments

Comments
 (0)