Skip to content

Commit 47d7cec

Browse files
committed
🐛 处理 GM_xmlhttpRequest redirect问题 #330
1 parent 28f3d86 commit 47d7cec

1 file changed

Lines changed: 51 additions & 5 deletions

File tree

src/app/service/service_worker/gm_api.ts

Lines changed: 51 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
3440
export 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

Comments
 (0)