|
/** |
|
* A Licensing Server Proxy |
|
*/ |
|
const proxyUrl = 'http://example.com'; |
|
const proxyHostname = 'example.com' |
|
|
|
export default { |
|
async fetch( |
|
request: Request, |
|
env: Env, |
|
ctx: ExecutionContext, |
|
): Promise<Response> { |
|
// only handle POST requests |
|
if (request.method.toUpperCase() !== "POST") { |
|
return new Response('Method must be POST', { |
|
status: 403, |
|
}); |
|
} |
|
|
|
// currently only handle formData requests (may support JSON later) |
|
const acceptedContentType = ['application/x-www-form-urlencoded', 'multipart/form-data'] |
|
if (!acceptedContentType.includes(request.headers.get('content-type') || '')) { |
|
console.error( |
|
'Request Error', |
|
request.headers.get('content-type'), |
|
await request.text() |
|
) |
|
|
|
return new Response('Content Type must be "application/x-www-form-urlencoded"', { |
|
status: 400, |
|
}); |
|
} |
|
|
|
// rate limit the endpoint |
|
const ipAddress = request.headers.get("cf-connecting-ip") || "" |
|
const {success} = await env.LIMITER.limit({key: ipAddress}) |
|
if (!success) { |
|
return new Response('', { |
|
status: 429 |
|
}); |
|
} |
|
|
|
// get formData so we can route the request |
|
const requestBody = await request.clone().formData() |
|
if (!requestBody.has('edd_action')) { |
|
return new Response('', { |
|
status: 403, |
|
}); |
|
} |
|
|
|
try { |
|
switch (requestBody.get('edd_action')) { |
|
default: |
|
return defaultRoute(request) |
|
} |
|
|
|
} catch (e: any) { |
|
console.error(e) |
|
return new Response('', { |
|
status: 500, |
|
}); |
|
} |
|
} |
|
} satisfies ExportedHandler<Env>; |
|
|
|
async function defaultRoute(request: Request): Promise<Response> { |
|
console.log('Getting response from API', await request.clone().text()) |
|
|
|
let response = await originApiRequest(request) |
|
|
|
// Log response |
|
const textResponse = await response.clone().text() |
|
|
|
console.log('Origin API Response', textResponse, JSON.stringify(Object.fromEntries(response.headers)), response.status) |
|
|
|
try { |
|
JSON.parse(textResponse) |
|
} catch (e) { |
|
// Throw an error if an invalid response is received from the API server |
|
return new Response(textResponse, { |
|
status: 500, |
|
}); |
|
} |
|
|
|
return response |
|
} |
|
|
|
async function originApiRequest(request: Request): Promise<Response> { |
|
/* Create a new request to the endpoint */ |
|
const url = new URL(proxyUrl); |
|
url.hostname = proxyHostname; |
|
|
|
const newRequest = new Request( |
|
url.toString() as string, |
|
new Request(request) as Request, |
|
); |
|
|
|
console.log('Origin API Request', JSON.stringify(Object.fromEntries(newRequest.headers)), newRequest.method) |
|
|
|
return fetch(newRequest); |
|
} |