@@ -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