@@ -442,15 +442,20 @@ export default class GMApi {
442442 }
443443 }
444444
445+ // 有一些操作需要同步,就用Map作为缓存
446+ cache = new Map < string , any > ( ) ;
447+
445448 // 根据header生成dnr规则
446449 async buildDNRRule (
447450 reqeustId : number ,
448451 params : GMSend . XHRDetails ,
449452 sender : GetSender
450453 ) : Promise < { [ key : string ] : string } > {
451- // 默认移除origin
452454 const headers = params . headers || { } ;
453- headers [ "origin" ] = headers [ "origin" ] || "" ;
455+ // 如果header中没有origin就设置为空字符串,如果有origin就不做处理,注意处理大小写
456+ if ( ! ( "Origin" in headers ) && ! ( "origin" in headers ) ) {
457+ headers [ "Origin" ] = "" ;
458+ }
454459
455460 const requestHeaders = [
456461 {
@@ -544,9 +549,8 @@ export default class GMApi {
544549 deleteHeader && delete headers [ key ] ;
545550 } ) ;
546551
547- const ruleId = reqeustId ;
548552 const rule = { } as chrome . declarativeNetRequest . Rule ;
549- rule . id = ruleId ;
553+ rule . id = reqeustId ;
550554 rule . action = {
551555 type : "modifyHeaders" as chrome . declarativeNetRequest . RuleActionType ,
552556 requestHeaders : requestHeaders ,
@@ -565,8 +569,9 @@ export default class GMApi {
565569 requestMethods : [ ( params . method || "GET" ) . toLowerCase ( ) as chrome . declarativeNetRequest . RequestMethod ] ,
566570 excludedTabIds : excludedTabIds ,
567571 } ;
572+ this . cache . set ( "dnrRule:" + reqeustId . toString ( ) , rule ) ;
568573 await chrome . declarativeNetRequest . updateSessionRules ( {
569- removeRuleIds : [ ruleId ] ,
574+ removeRuleIds : [ reqeustId ] ,
570575 addRules : [ rule ] ,
571576 } ) ;
572577 return headers ;
@@ -1113,7 +1118,7 @@ export default class GMApi {
11131118 if ( details . requestHeaders ) {
11141119 const requestId = details . requestHeaders . find ( ( header ) => header . name === "X-Scriptcat-GM-XHR-Request-Id" ) ;
11151120 if ( requestId ) {
1116- Cache . getInstance ( ) . set ( "gmXhrRequest:" + details . requestId , requestId . value ) ;
1121+ this . cache . set ( "gmXhrRequest:" + details . requestId , requestId . value ) ;
11171122 }
11181123 }
11191124 }
@@ -1129,18 +1134,40 @@ export default class GMApi {
11291134 ( details ) => {
11301135 if ( details . tabId === - 1 ) {
11311136 // 判断请求是否与gmXhrRequest关联
1132- Cache . getInstance ( )
1133- . get ( "gmXhrRequest:" + details . requestId )
1134- . then ( ( requestId ) => {
1135- if ( requestId ) {
1136- this . gmXhrHeadersReceived . emit ( "headersReceived:" + requestId , details ) ;
1137- // 删除关联与DNR
1138- Cache . getInstance ( ) . del ( "gmXhrRequest:" + details . requestId ) ;
1139- chrome . declarativeNetRequest . updateSessionRules ( {
1140- removeRuleIds : [ parseInt ( requestId ) ] ,
1141- } ) ;
1137+ const requestId = this . cache . get ( "gmXhrRequest:" + details . requestId ) ;
1138+ if ( requestId ) {
1139+ // 判断是否重定向
1140+ let location = "" ;
1141+ details . responseHeaders ?. forEach ( ( header ) => {
1142+ if ( header . name . toLowerCase ( ) === "location" ) {
1143+ // 重定向
1144+ location = header . value || "" ;
11421145 }
11431146 } ) ;
1147+ if ( location ) {
1148+ // 处理重定向后的unsafeHeader
1149+ const rule = this . cache . get ( "dnrRule:" + requestId ) as chrome . declarativeNetRequest . Rule ;
1150+ // 修改匹配链接
1151+ rule . condition . urlFilter = location ;
1152+ // 不处理cookie
1153+ rule . action . requestHeaders = rule . action . requestHeaders ?. filter (
1154+ ( header ) => header . header . toLowerCase ( ) !== "cookie"
1155+ ) ;
1156+ chrome . declarativeNetRequest . updateSessionRules ( {
1157+ removeRuleIds : [ parseInt ( requestId ) ] ,
1158+ addRules : [ rule ] ,
1159+ } ) ;
1160+ console . log ( "old rule" , requestId , rule ) ;
1161+ return ;
1162+ }
1163+ this . gmXhrHeadersReceived . emit ( "headersReceived:" + requestId , details ) ;
1164+ // 删除关联与DNR
1165+ this . cache . delete ( "gmXhrRequest:" + details . requestId ) ;
1166+ this . cache . delete ( "dnrRule:" + requestId ) ;
1167+ chrome . declarativeNetRequest . updateSessionRules ( {
1168+ removeRuleIds : [ parseInt ( requestId ) ] ,
1169+ } ) ;
1170+ }
11441171 }
11451172 return undefined ;
11461173 } ,
0 commit comments