单测
Some checks failed
test / Run tests (push) Failing after 15s
build / Build (push) Failing after 22s
Some checks failed
test / Run tests (push) Failing after 15s
build / Build (push) Failing after 22s
This commit is contained in:
@ -3,27 +3,78 @@ import { Group, MessageConnect } from "@Packages/message/server";
|
||||
export default class GMApi {
|
||||
constructor(private group: Group) {}
|
||||
|
||||
xmlHttpRequest(params: GMSend.XHRDetails, con: MessageConnect | null) {
|
||||
dealXhrResponse(con: MessageConnect, details: GMSend.XHRDetails, event: string, xhr: XMLHttpRequest, data?: any) {
|
||||
const finalUrl = xhr.responseURL || details.url;
|
||||
// 判断是否有headerFlag-final-url,有则替换finalUrl
|
||||
let response: GMTypes.XHRResponse = {
|
||||
finalUrl,
|
||||
readyState: <any>xhr.readyState,
|
||||
status: xhr.status,
|
||||
statusText: xhr.statusText,
|
||||
// responseHeaders: xhr.getAllResponseHeaders().replace(removeXCat, ""),
|
||||
responseType: details.responseType,
|
||||
};
|
||||
if (data) {
|
||||
response = Object.assign(response, data);
|
||||
}
|
||||
con.sendMessage({
|
||||
action: event,
|
||||
data: response,
|
||||
});
|
||||
return response;
|
||||
}
|
||||
|
||||
xmlHttpRequest(details: GMSend.XHRDetails, con: MessageConnect | null) {
|
||||
const xhr = new XMLHttpRequest();
|
||||
xhr.open(params.method || "GET", params.url);
|
||||
xhr.open(details.method || "GET", details.url);
|
||||
// 添加header
|
||||
if (params.headers) {
|
||||
for (const key in params.headers) {
|
||||
xhr.setRequestHeader(key, params.headers[key]);
|
||||
if (details.headers) {
|
||||
for (const key in details.headers) {
|
||||
xhr.setRequestHeader(key, details.headers[key]);
|
||||
}
|
||||
}
|
||||
xhr.onload = function () {
|
||||
console.log(xhr.getAllResponseHeaders());
|
||||
con?.sendMessage({
|
||||
action: "onload",
|
||||
data: {
|
||||
status: xhr.status,
|
||||
statusText: xhr.statusText,
|
||||
response: xhr.responseText,
|
||||
},
|
||||
});
|
||||
xhr.onload = () => {
|
||||
this.dealXhrResponse(con!, details, "onload", xhr);
|
||||
};
|
||||
xhr.onloadstart = () => {
|
||||
this.dealXhrResponse(con!, details, "onloadstart", xhr);
|
||||
};
|
||||
xhr.onloadend = () => {
|
||||
this.dealXhrResponse(con!, details, "onloadend", xhr);
|
||||
};
|
||||
xhr.onabort = () => {
|
||||
this.dealXhrResponse(con!, details, "onabort", xhr);
|
||||
};
|
||||
xhr.onerror = () => {
|
||||
this.dealXhrResponse(con!, details, "onerror", xhr);
|
||||
};
|
||||
xhr.onprogress = (event) => {
|
||||
const respond: GMTypes.XHRProgress = {
|
||||
done: xhr.DONE,
|
||||
lengthComputable: event.lengthComputable,
|
||||
loaded: event.loaded,
|
||||
total: event.total,
|
||||
totalSize: event.total,
|
||||
};
|
||||
this.dealXhrResponse(con!, details, "onprogress", xhr, respond);
|
||||
};
|
||||
xhr.onreadystatechange = () => {
|
||||
this.dealXhrResponse(con!, details, "onreadystatechange", xhr);
|
||||
};
|
||||
xhr.ontimeout = () => {
|
||||
con?.sendMessage({ action: "ontimeout", data: {} });
|
||||
};
|
||||
|
||||
if (details.timeout) {
|
||||
xhr.timeout = details.timeout;
|
||||
}
|
||||
if (details.overrideMimeType) {
|
||||
xhr.overrideMimeType(details.overrideMimeType);
|
||||
}
|
||||
xhr.send();
|
||||
con?.onDisconnect(() => {
|
||||
xhr.abort();
|
||||
});
|
||||
}
|
||||
|
||||
init() {
|
||||
|
@ -137,7 +137,6 @@ export default class GMApi {
|
||||
return Promise.reject(new Error("param is failed"));
|
||||
}
|
||||
const params = request.params[0] as GMSend.XHRDetails;
|
||||
console.log("xml request", request, con);
|
||||
// 先处理unsafe hearder
|
||||
// 关联自己生成的请求id与chrome.webRequest的请求id
|
||||
const requestId = 10000 + (await incr(Cache.getInstance(), "gmXhrRequestId", 1));
|
||||
@ -155,13 +154,15 @@ export default class GMApi {
|
||||
details.responseHeaders?.forEach((header) => {
|
||||
responseHeader += header.name + ": " + header.value + "\n";
|
||||
});
|
||||
console.log("处理", details, responseHeader);
|
||||
}
|
||||
);
|
||||
// 再发送到offscreen, 处理请求
|
||||
const offscreenCon = await connect(this.sender, "gmApi/xmlHttpRequest", request.params[0]);
|
||||
offscreenCon.onMessage((msg) => {
|
||||
console.log("offscreenCon", msg);
|
||||
offscreenCon.onMessage((msg: { action: string; data: any }) => {
|
||||
// 发送到content
|
||||
// 替换msg.data.responseHeaders
|
||||
msg.data.responseHeaders = responseHeader;
|
||||
con.sendMessage(msg);
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -211,3 +211,9 @@ export function checkSilenceUpdate(oldMeta: Metadata, newMeta: Metadata): boolea
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
export function sleep(time: number) {
|
||||
return new Promise((resolve) => {
|
||||
setTimeout(resolve, time);
|
||||
});
|
||||
}
|
||||
|
@ -219,8 +219,37 @@ export default class GMApi {
|
||||
let connect: MessageConnect;
|
||||
this.connect("GM_xmlhttpRequest", [param]).then((con) => {
|
||||
connect = con;
|
||||
con.onMessage((data) => {
|
||||
console.log("data", data);
|
||||
con.onMessage((data: { action: string; data: any }) => {
|
||||
// 处理返回
|
||||
switch (data.action) {
|
||||
case "onload":
|
||||
details.onload?.(data.data);
|
||||
break;
|
||||
case "onloadend":
|
||||
details.onloadend?.(data.data);
|
||||
break;
|
||||
case "onloadstart":
|
||||
details.onloadstart?.(data.data);
|
||||
break;
|
||||
case "onprogress":
|
||||
details.onprogress?.(data.data);
|
||||
break;
|
||||
case "onreadystatechange":
|
||||
details.onreadystatechange && details.onreadystatechange(data.data);
|
||||
break;
|
||||
case "ontimeout":
|
||||
details.ontimeout?.();
|
||||
break;
|
||||
case "onerror":
|
||||
details.onerror?.("");
|
||||
break;
|
||||
case "onabort":
|
||||
details.onabort?.();
|
||||
break;
|
||||
case "onstream":
|
||||
// controller?.enqueue(new Uint8Array(resp.data));
|
||||
break;
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
|
Reference in New Issue
Block a user