-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathindex.js
More file actions
120 lines (110 loc) · 3.61 KB
/
Copy pathindex.js
File metadata and controls
120 lines (110 loc) · 3.61 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
const DEBUG = false
// const MYSUBDOMAIN = 'https://onesignal-proxy.username.workers.dev'
const osCdnUrl = 'https://cdn.onesignal.com'
const osMainUrl = 'https://onesignal.com'
const osImgUrl = 'https://img.onesignal.com'
const cdkRealName = 'OneSignalSDK'
const cdkFakeName = 'TwoSignalSDK'
const regexSDKFile = new RegExp(cdkRealName + '([\\S]*)\\.js', 'g')
const regexCdnUrl = new RegExp(osCdnUrl, 'g')
const regexMainUrl = new RegExp(osMainUrl, 'g')
const regexImgUrl = new RegExp(osImgUrl, 'g')
addEventListener('fetch', event => {
try {
event.respondWith(handleEvent(event))
} catch (e) {
if (DEBUG) {
return event.respondWith(
new Response(e.message || e.toString(), {
status: 500,
}),
)
}
event.respondWith(new Response('Internal Error', { status: 500 }))
}
})
async function gatherResponse(response) {
return await response.text()
}
function prepareFromUserHeaders(userIP = '', curHeaders) {
let headers = {}
headers['X-Forwarded-For'] = userIP
headers['X-ProxyUser-Ip'] = userIP
for (let pair of curHeaders) {
if (pair[0].toUpperCase() === 'HOST') {
} else {
headers[pair[0].toUpperCase()] = pair[1]
}
}
return headers
}
function prepFetchInit(userRequest, cfProp = {}) {
const userHeaders = prepareFromUserHeaders(
userRequest.headers.get('CF-Connecting-IP'),
userRequest.headers.entries(),
)
if (DEBUG) {
cfProp = { cacheTt: 0 }
}
return {
cf: cfProp,
method: userRequest.method,
headers: userHeaders,
body: userRequest.body,
redirect: 'manual',
}
}
async function handleEvent(event) {
const urlFull = event.request.url
let urlPath = urlFull.replace(/^.*\/\/[^\/]+/, '')
//routes
//https://cdn.onesignal.com/sdks/
if (urlPath.startsWith('/sdks/')) {
urlPath = urlPath.replace(cdkFakeName, cdkRealName)
if (
event.request.method === 'GET' &&
(urlPath.includes('js') || urlPath.includes('css')) &&
!urlPath.includes('map')
) {
const resp = await fetch(osCdnUrl + urlPath, prepFetchInit(event.request))
let bodyText = await gatherResponse(resp)
bodyText = bodyText.replace(regexCdnUrl, MYSUBDOMAIN)
bodyText = bodyText.replace(regexMainUrl, MYSUBDOMAIN)
bodyText = bodyText.replace(regexSDKFile, function (_match, group) {
group = group ?? ''
return cdkFakeName + group + '.js'
})
return new Response(bodyText, resp)
} else {
const resp = await fetch(osCdnUrl + urlPath, prepFetchInit(event.request))
return new Response(resp.body, resp)
}
}
//https://onesignal.com/api/
else if (urlPath.startsWith('/api/')) {
const resp = await fetch(osMainUrl + urlPath, prepFetchInit(event.request))
const resContType = resp.headers.get('Content-Type') || ''
if (resContType.includes('javascript') || resContType.includes('json')) {
let bodyText = await gatherResponse(resp)
bodyText = bodyText.replace(regexImgUrl, MYSUBDOMAIN + '/osimg')
return new Response(bodyText, resp)
}
return new Response(resp.body, resp)
}
//https://img.onesignal.com/
else if (urlPath.startsWith('/osimg/')) {
const resp = await fetch(
osImgUrl + urlPath.replace('/osimg', ''),
prepFetchInit(event.request, { cacheTt: 2592000 }),
)
let respToUser = new Response(resp.body, resp)
respToUser.headers.delete('Cache-Control')
respToUser.headers.set('Cache-Control', 'public, max-age=2678400')
if (urlPath.includes('png')) {
respToUser.headers.set('Content-Type', 'image/png')
}
return respToUser
} else {
return new Response('NOT FOUND', { status: 404 })
}
}