@@ -224,7 +224,14 @@ async function perform_http_request(params) {
224224 var response_headers = { } ;
225225
226226 for ( var pair of response . headers . entries ( ) ) {
227- response_headers [ pair [ 0 ] ] = pair [ 1 ] ;
227+ // Fix Set-Cookie from onHeadersReceived (fetch() doesn't expose it)
228+ if ( pair [ 0 ] === 'x-set-cookie' ) {
229+ // Original Set-Cookie may merge multiple headers, we have it packed
230+ response_headers [ 'Set-Cookie' ] = JSON . parse ( pair [ 1 ] ) ;
231+ }
232+ else {
233+ response_headers [ pair [ 0 ] ] = pair [ 1 ] ;
234+ }
228235 }
229236
230237 const redirect_hack_url_prefix = `${ location . origin . toString ( ) } /redirect-hack.html?id=` ;
@@ -244,7 +251,15 @@ async function perform_http_request(params) {
244251 // Format headers
245252 var redirect_hack_headers = { } ;
246253 response_metadata . headers . map ( header_data => {
247- redirect_hack_headers [ header_data . name ] = header_data . value ;
254+ // Original Set-Cookie may merge multiple headers, skip it
255+ if ( header_data . name . toLowerCase ( ) !== 'set-cookie' ) {
256+ if ( header_data . name === 'X-Set-Cookie' ) {
257+ redirect_hack_headers [ 'Set-Cookie' ] = JSON . parse ( header_data . value ) ;
258+ }
259+ else {
260+ redirect_hack_headers [ header_data . name ] = header_data . value ;
261+ }
262+ }
248263 } ) ;
249264
250265 const redirect_hack_data = {
@@ -427,8 +442,26 @@ chrome.webRequest.onHeadersReceived.addListener(function(details) {
427442 return
428443 }
429444
445+ // Rewrite Set-Cookie to expose it in fetch()
446+ cookies = [ ]
447+ details . responseHeaders . map ( responseHeader => {
448+ if ( responseHeader . name . toLowerCase ( ) === 'set-cookie' ) {
449+ cookies . push ( responseHeader . value ) ;
450+ }
451+ } ) ;
452+ if ( cookies . length != 0 ) {
453+ details . responseHeaders . push ( {
454+ 'name' : 'X-Set-Cookie' ,
455+ // We pack array of cookies into string and depack later.
456+ // Otherwise multiple Set-Cookie headers would be merged together.
457+ 'value' : JSON . stringify ( cookies )
458+ } ) ;
459+ }
460+
430461 if ( ! REDIRECT_STATUS_CODES . includes ( details . statusCode ) ) {
431- return
462+ return {
463+ responseHeaders : details . responseHeaders
464+ }
432465 }
433466
434467 const redirect_hack_id = uuidv4 ( ) ;
@@ -444,4 +477,4 @@ chrome.webRequest.onHeadersReceived.addListener(function(details) {
444477 } ;
445478} , {
446479 urls : [ "<all_urls>" ]
447- } , [ "blocking" , "responseHeaders" , "extraHeaders" ] ) ;
480+ } , [ "blocking" , "responseHeaders" , "extraHeaders" ] ) ;
0 commit comments