add referrer

This commit is contained in:
Jason 2022-12-30 20:25:31 +00:00
parent 1ae9eb5387
commit a6f6f92ab7
No known key found for this signature in database

321
index.js
View file

@ -1,7 +1,7 @@
let secret let secret
addEventListener('fetch', (event) => { addEventListener('fetch', (event) => {
event.respondWith(handleRequest(event)) event.respondWith(handleRequest(event))
}) })
/** /**
@ -9,181 +9,182 @@ addEventListener('fetch', (event) => {
* @param {Event} event * @param {Event} event
*/ */
async function handleRequest(event) { async function handleRequest(event) {
const { request } = event const { request } = event
// Set this in your worker's environment. wrangler.toml or cloudflare dashboard // Set this in your worker's environment. wrangler.toml or cloudflare dashboard
if (WORKERLINKS_SECRET === undefined) { if (WORKERLINKS_SECRET === undefined) {
return new Response('Secret is not defined. Please add WORKERLINKS_SECRET.') return new Response('Secret is not defined. Please add WORKERLINKS_SECRET.')
} else {
secret = WORKERLINKS_SECRET
}
var key = new URL(request.url).pathname
var shorturl = new URL(request.url).origin + key
if (request.method == 'PUT') {
return await putLink(
request.headers.get('Authorization'),
shorturl,
key,
request.headers.get('URL'),
)
} else if (request.method == 'POST') {
if (key != '/') {
return Response.json(
{
code: '405 Method Not Allowed',
message: 'POST not valid for individual keys. Did you mean PUT?',
},
{
status: 405,
},
)
}
key = '/' + Math.random().toString(36).slice(5)
shorturl = new URL(request.url).origin + key
return await putLink(
request.headers.get('Authorization'),
shorturl,
key,
request.headers.get('URL'),
)
} else if (request.method == 'GET' || request.method == 'HEAD') {
let url = await kv.get(key)
if (url == null) {
return Response.json(
{
code: '404 Not Found',
message: 'Key does not exist or has not propagated.',
},
{
status: 404,
},
)
} else { } else {
// PLAUSIBLE_HOST should be the full URL to your Plausible Analytics instance secret = WORKERLINKS_SECRET
// e.g. https://plausible.io/ }
if (typeof PLAUSIBLE_HOST !== 'undefined') {
const url = PLAUSIBLE_HOST + 'api/event'
const headers = new Headers()
headers.append('User-Agent', request.headers.get('User-Agent'))
headers.append(
'X-Forwarded-For',
request.headers.get('X-Forwarded-For'),
)
headers.append('Content-Type', 'application/json')
const data = { var key = new URL(request.url).pathname
name: 'pageview', var shorturl = new URL(request.url).origin + key
url: request.url,
domain: new URL(request.url).hostname, if (request.method == 'PUT') {
return await putLink(
request.headers.get('Authorization'),
shorturl,
key,
request.headers.get('URL'),
)
} else if (request.method == 'POST') {
if (key != '/') {
return Response.json(
{
code: '405 Method Not Allowed',
message: 'POST not valid for individual keys. Did you mean PUT?',
},
{
status: 405,
},
)
} }
event.waitUntil( key = '/' + Math.random().toString(36).slice(5)
fetch(url, { method: 'POST', headers, body: JSON.stringify(data) }), shorturl = new URL(request.url).origin + key
return await putLink(
request.headers.get('Authorization'),
shorturl,
key,
request.headers.get('URL'),
) )
} } else if (request.method == 'GET' || request.method == 'HEAD') {
return new Response(null, { status: 302, headers: { Location: url } }) let url = await kv.get(key)
} if (url == null) {
} else if (request.method == 'DELETE') { return Response.json(
if (request.headers.get('Authorization') != secret) { {
return Response.json( code: '404 Not Found',
{ message: 'Key does not exist or has not propagated.',
code: '401 Unauthorized', },
message: 'Unauthorized.', {
}, status: 404,
{ },
status: 401, )
}, } else {
) // PLAUSIBLE_HOST should be the full URL to your Plausible Analytics instance
// e.g. https://plausible.io/
if (typeof PLAUSIBLE_HOST !== 'undefined') {
const url = PLAUSIBLE_HOST + 'api/event'
const headers = new Headers()
headers.append('User-Agent', request.headers.get('User-Agent'))
headers.append(
'X-Forwarded-For',
request.headers.get('X-Forwarded-For'),
)
headers.append('Content-Type', 'application/json')
const data = {
name: 'pageview',
url: request.url,
domain: new URL(request.url).hostname,
referrer: request.referrer,
}
event.waitUntil(
fetch(url, { method: 'POST', headers, body: JSON.stringify(data) }),
)
}
return new Response(null, { status: 302, headers: { Location: url } })
}
} else if (request.method == 'DELETE') {
if (request.headers.get('Authorization') != secret) {
return Response.json(
{
code: '401 Unauthorized',
message: 'Unauthorized.',
},
{
status: 401,
},
)
}
shorturl = new URL(request.url).origin + key
let url = await kv.get(key)
if (url == null) {
return Response.json(
{
code: '404 Not Found',
message: 'Key does not exist or has not propagated.',
},
{
status: 404,
},
)
} else {
await kv.delete(key)
return Response.json(
{
message: 'Short URL deleted succesfully.',
key: key.substr(1),
shorturl: shorturl,
longurl: url,
},
{
status: 200,
},
)
}
} }
shorturl = new URL(request.url).origin + key return Response.json(
let url = await kv.get(key)
if (url == null) {
return Response.json(
{ {
code: '404 Not Found', code: '405 Method Not Allowed',
message: 'Key does not exist or has not propagated.', message:
'Unsupported method. Please use one of GET, PUT, POST, DELETE, HEAD.',
}, },
{ {
status: 404, status: 405,
}, },
) )
} else {
await kv.delete(key)
return Response.json(
{
message: 'Short URL deleted succesfully.',
key: key.substr(1),
shorturl: shorturl,
longurl: url,
},
{
status: 200,
},
)
}
}
return Response.json(
{
code: '405 Method Not Allowed',
message:
'Unsupported method. Please use one of GET, PUT, POST, DELETE, HEAD.',
},
{
status: 405,
},
)
} }
function validateUrl(url) { function validateUrl(url) {
// quick and dirty validation // quick and dirty validation
if (url == '') { if (url == '') {
return false return false
} }
try { try {
new URL(url) new URL(url)
} catch (TypeError) { } catch (TypeError) {
return false return false
} }
return true return true
} }
async function putLink(givenSecret, shorturl, key, url) { async function putLink(givenSecret, shorturl, key, url) {
if (givenSecret != secret) { if (givenSecret != secret) {
return Response.json( return Response.json(
{ {
code: '401 Unauthorized', code: '401 Unauthorized',
message: 'Unauthorized.', message: 'Unauthorized.',
}, },
{ {
status: 401, status: 401,
}, },
) )
} }
if (url == null || !validateUrl(url)) { if (url == null || !validateUrl(url)) {
return Response.json( return Response.json(
{ {
code: '400 Bad Request', code: '400 Bad Request',
message: "No valid URL given. Please set a 'URL' header.", message: "No valid URL given. Please set a 'URL' header.",
}, },
{ {
status: 400, status: 400,
}, },
) )
} }
await kv.put(key, url) await kv.put(key, url)
return Response.json( return Response.json(
{ {
message: 'URL created succesfully.', message: 'URL created succesfully.',
key: key.substr(1), key: key.substr(1),
shorturl: shorturl, shorturl: shorturl,
longurl: url, longurl: url,
}, },
{ {
status: 200, status: 200,
}, },
) )
} }