@@ -31,6 +31,12 @@ export type Request = MessageRequest & {
3131 script : Script ;
3232} ;
3333
34+ export type RequestResultParams = {
35+ requestId : number ;
36+ statusCode : number ;
37+ responseHeader : string ;
38+ } ;
39+
3440export const unsafeHeaders : { [ key : string ] : boolean } = {
3541 // 部分浏览器中并未允许
3642 "user-agent" : true ,
@@ -449,7 +455,12 @@ export default class GMApi {
449455
450456 gmXhrHeadersReceived : EventEmitter = new EventEmitter ( ) ;
451457
452- dealFetch ( config : GMSend . XHRDetails , response : Response , readyState : 0 | 1 | 2 | 3 | 4 ) {
458+ dealFetch (
459+ config : GMSend . XHRDetails ,
460+ response : Response ,
461+ readyState : 0 | 1 | 2 | 3 | 4 ,
462+ resultParam ?: RequestResultParams
463+ ) {
453464 let respHeader = "" ;
454465 response . headers . forEach ( ( value , key ) => {
455466 respHeader += `${ key } : ${ value } \n` ;
@@ -462,26 +473,59 @@ export default class GMApi {
462473 responseHeaders : respHeader ,
463474 responseType : config . responseType ,
464475 } ;
476+ if ( resultParam ) {
477+ respond . status = respond . status || resultParam . statusCode ;
478+ respond . responseHeaders = resultParam . responseHeader || respond . responseHeaders ;
479+ }
465480 return respond ;
466481 }
467482
468- CAT_fetch ( config : GMSend . XHRDetails , con : GetSender , resultParam : { requestId : number ; responseHeader : string } ) {
483+ CAT_fetch ( config : GMSend . XHRDetails , con : GetSender , resultParam : RequestResultParams ) {
469484 const { url } = config ;
470485 let connect = con . getConnect ( ) ;
471486 return fetch ( url , {
472487 method : config . method || "GET" ,
473488 body : < any > config . data ,
474489 headers : config . headers ,
490+ redirect : config . redirect ,
491+ signal : config . timeout ? AbortSignal . timeout ( config . timeout ) : undefined ,
475492 } ) . then ( ( resp ) => {
476- const send = this . dealFetch ( config , resp , 1 ) ;
493+ let send = this . dealFetch ( config , resp , 1 ) ;
494+ switch ( resp . type ) {
495+ case "opaqueredirect" :
496+ // 处理manual重定向
497+ connect . sendMessage ( {
498+ action : "onloadstart" ,
499+ data : send ,
500+ } ) ;
501+ send = this . dealFetch ( config , resp , 2 , resultParam ) ;
502+ connect . sendMessage ( {
503+ action : "onreadystatechange" ,
504+ data : send ,
505+ } ) ;
506+ send . readyState = 4 ;
507+ connect . sendMessage ( {
508+ action : "onreadystatechange" ,
509+ data : send ,
510+ } ) ;
511+ connect . sendMessage ( {
512+ action : "onload" ,
513+ data : send ,
514+ } ) ;
515+ connect . sendMessage ( {
516+ action : "onloadend" ,
517+ data : send ,
518+ } ) ;
519+ return ;
520+ }
477521 const reader = resp . body ?. getReader ( ) ;
478522 if ( ! reader ) {
479523 throw new Error ( "read is not found" ) ;
480524 }
481525 const _this = this ;
482526 reader . read ( ) . then ( function read ( { done, value } ) {
483527 if ( done ) {
484- const data = _this . dealFetch ( config , resp , 4 ) ;
528+ const data = _this . dealFetch ( config , resp , 4 , resultParam ) ;
485529 data . responseHeaders = resultParam . responseHeader || data . responseHeaders ;
486530 connect . sendMessage ( {
487531 action : "onreadystatechange" ,
@@ -559,8 +603,9 @@ export default class GMApi {
559603 }
560604 params . headers [ "X-Scriptcat-GM-XHR-Request-Id" ] = requestId . toString ( ) ;
561605 params . headers = await this . buildDNRRule ( requestId , request . params [ 0 ] ) ;
562- let resultParam = {
606+ let resultParam : RequestResultParams = {
563607 requestId,
608+ statusCode : 0 ,
564609 responseHeader : "" ,
565610 } ;
566611 // 等待response
@@ -570,6 +615,7 @@ export default class GMApi {
570615 details . responseHeaders ?. forEach ( ( header ) => {
571616 resultParam . responseHeader += header . name + ": " + header . value + "\n" ;
572617 } ) ;
618+ resultParam . statusCode = details . statusCode ;
573619 this . gmXhrHeadersReceived . removeAllListeners ( "headersReceived:" + requestId ) ;
574620 }
575621 ) ;
0 commit comments