@@ -199,7 +199,14 @@ async function perform_http_request(params) {
199
199
var response_headers = { } ;
200
200
201
201
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
+ }
203
210
}
204
211
205
212
const redirect_hack_url_prefix = `${ location . origin . toString ( ) } /redirect-hack.html?id=` ;
@@ -219,7 +226,15 @@ async function perform_http_request(params) {
219
226
// Format headers
220
227
var redirect_hack_headers = { } ;
221
228
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
+ }
223
238
} ) ;
224
239
225
240
const redirect_hack_data = {
@@ -402,8 +417,26 @@ chrome.webRequest.onHeadersReceived.addListener(function(details) {
402
417
return
403
418
}
404
419
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
+
405
436
if ( ! REDIRECT_STATUS_CODES . includes ( details . statusCode ) ) {
406
- return
437
+ return {
438
+ responseHeaders : details . responseHeaders
439
+ }
407
440
}
408
441
409
442
const redirect_hack_id = uuidv4 ( ) ;
@@ -419,4 +452,4 @@ chrome.webRequest.onHeadersReceived.addListener(function(details) {
419
452
} ;
420
453
} , {
421
454
urls : [ "<all_urls>" ]
422
- } , [ "blocking" , "responseHeaders" , "extraHeaders" ] ) ;
455
+ } , [ "blocking" , "responseHeaders" , "extraHeaders" ] ) ;
0 commit comments