add referrer
This commit is contained in:
parent
1ae9eb5387
commit
a6f6f92ab7
1 changed files with 161 additions and 160 deletions
321
index.js
321
index.js
|
|
@ -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,
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue