Skip to content

Commit f2dae21

Browse files
committed
fix: local file maybe block by origin null
1 parent 35066fb commit f2dae21

File tree

6 files changed

+66
-16
lines changed

6 files changed

+66
-16
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "xswitch",
33
"description": "A proxy tool based on Chrome.extensions",
44
"author": "yize",
5-
"version": "1.6.0",
5+
"version": "1.6.1",
66
"main": "src/background.js",
77
"dependencies": {
88
"monaco-editor": "^0.13.1"

src/background.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,3 +81,8 @@ chrome.webRequest.onBeforeRequest.addListener(
8181
chrome.webRequest.onHeadersReceived.addListener(details=>window.onHeadersReceivedCallback(details), {
8282
urls: ['<all_urls>']
8383
}, ["blocking", "responseHeaders"]);
84+
85+
chrome.webRequest.onBeforeSendHeaders.addListener(
86+
details=>window.onBeforeSendHeadersCallback(details),
87+
{urls: ["<all_urls>"]},
88+
["blocking", "requestHeaders"]);

src/defaultData.json

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{
2+
"proxy": [
3+
[
4+
"//alinw.alicdn.com/platform/daily-test/isDaily.js",
5+
"//alinw.alicdn.com/platform/daily-test/isDaily.json"
6+
],
7+
[
8+
"alinw.alicdn.com",
9+
"g.alicdn.com"
10+
]
11+
]
12+
}

src/forward.js

Lines changed: 41 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,30 +2,49 @@ window.lastRequestId = null;
22
window.proxyConfig = {};
33
window.urls = new Array(200); // for cache
44
window.isString = string => ({}.toString.call(string) === '[object String]');
5+
window.originRequestId = null;
6+
window.originValue = null;
57

68
//Breaking the CORS Limitation
79
window.onHeadersReceivedCallback = details => {
10+
811
if (window.proxyDisabled == 'disabled') {
912
return {};
1013
}
1114

1215
let resHeaders = [];
13-
if(details.responseHeaders && details.responseHeaders.filter){
14-
resHeaders = details.responseHeaders.filter((responseHeader) => {
15-
return !~responseHeader.name.toLowerCase().indexOf('access-control-allow');
16-
})
16+
if (details.responseHeaders && details.responseHeaders.filter) {
17+
resHeaders = details.responseHeaders.filter(responseHeader => {
18+
if (
19+
[
20+
'access-control-allow-origin',
21+
'access-control-allow-credentials',
22+
'access-control-allow-methods'
23+
].indexOf(responseHeader.name.toLowerCase()) < 0
24+
) {
25+
return true;
26+
}
27+
return false;
28+
});
1729
}
18-
19-
resHeaders.push({ name: 'Access-Control-Allow-Origin', value: details.initiator || '*' });
30+
31+
resHeaders.push({
32+
name: 'Access-Control-Allow-Origin',
33+
// when Origin has value null, CORS header must be null.
34+
value: (window.originRequestId === details.requestId ? window.originValue : details.initiator) || '*'
35+
});
2036
resHeaders.push({ name: 'Access-Control-Allow-Credentials', value: 'true' });
21-
resHeaders.push({ name: 'Access-Control-Allow-Headers', value: 'x-requested-with,Content-Type' });
37+
resHeaders.push({
38+
name: 'Access-Control-Allow-Methods',
39+
value: '*'
40+
});
2241

2342
return {
2443
responseHeaders: resHeaders
2544
};
2645
};
2746

28-
window.redirectToMatchingRule = (details) => {
47+
window.redirectToMatchingRule = details => {
2948
const rules = window.proxyConfig.proxy;
3049
let redirectUrl = details.url;
3150

@@ -66,8 +85,22 @@ window.redirectToMatchingRule = (details) => {
6685
} catch (e) {
6786
console.error('rule match error', e);
6887
}
88+
6989
window.lastRequestId = details.requestId;
7090
return redirectUrl === details.url ? {} : { redirectUrl };
7191
};
7292

93+
window.onBeforeSendHeadersCallback = function (details) {
94+
for (var i = 0; i < details.requestHeaders.length; ++i) {
95+
96+
if (details.requestHeaders[i].name === 'Origin') {
97+
window.originRequestId = details.requestId;
98+
window.originValue = details.requestHeaders[i].value;
99+
break;
100+
}
101+
}
102+
103+
return { requestHeaders: details.requestHeaders };
104+
}
105+
73106
window.onBeforeRequestCallback = details => redirectToMatchingRule(details);

src/manifest.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "XSwitch",
33
"description": "XSwitch tools for proxy web request url, support reg",
44
"short_name": "xs",
5-
"version": "1.6.0",
5+
"version": "1.6.1",
66
"manifest_version": 2,
77
"browser_action": {
88
"default_icon": "images/grey_128.png",

test/index.spec.js

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -452,8 +452,8 @@ describe('CORS without Access-Control-Allow-Origin', () => {
452452
value: 'true'
453453
},
454454
{
455-
name: 'Access-Control-Allow-Headers',
456-
value: 'x-requested-with,Content-Type'
455+
name: 'Access-Control-Allow-Methods',
456+
value: '*'
457457
}
458458
];
459459
expect(
@@ -660,8 +660,8 @@ describe('CORS withCredentials', () => {
660660
value: 'true'
661661
},
662662
{
663-
name: 'Access-Control-Allow-Headers',
664-
value: 'x-requested-with,Content-Type'
663+
name: 'Access-Control-Allow-Methods',
664+
value: '*'
665665
}
666666
];
667667
expect(
@@ -683,8 +683,8 @@ describe('CORS withCredentials and no proxyConfig', () => {
683683
value: 'true'
684684
},
685685
{
686-
name: 'Access-Control-Allow-Headers',
687-
value: 'x-requested-with,Content-Type'
686+
name: 'Access-Control-Allow-Methods',
687+
value: '*'
688688
}
689689
]);
690690
});

0 commit comments

Comments
 (0)