From e3f2b910ec993587f4c4e963b7244dd75dd83be7 Mon Sep 17 00:00:00 2001 From: Alicia Sykes Date: Fri, 31 Dec 2021 22:23:39 +0000 Subject: [PATCH] :sparkles: Adds Netlify support for proxying CORS requests --- netlify.toml | 90 ++++++++++--------- services/serverless-functions/netlify-cors.js | 42 +++++++++ 2 files changed, 90 insertions(+), 42 deletions(-) create mode 100644 services/serverless-functions/netlify-cors.js diff --git a/netlify.toml b/netlify.toml index 6ed4983e..e0062796 100644 --- a/netlify.toml +++ b/netlify.toml @@ -1,42 +1,48 @@ -# Enables you to easily deploy a fork of Dashy to Netlify -# without the need to configure anything in admin UI -# Docs: https://www.netlify.com/docs/netlify-toml-reference/ - -# Essential site config -[build] - base = "/" - command = "yarn build" - publish = "dist" - functions = "services/serverless-functions" - -# Site info, used for the 1-Click deploy page -[template.environment] - STATUSKIT_PAGE_TITLE = "Dashy" - STATUSKIT_COMPANY_LOGO = "https://raw.githubusercontent.com/Lissy93/dashy/master/docs/assets/logo.png" - STATUSKIT_SUPPORT_CONTACT_LINK = "https://github.com/lissy93/dashy" - STATUSKIT_RESOURCES_LINK = "https://dashy.to/docs" - -# Redirect the Node endpoints to serverless functions -[[redirects]] - from = "/status-check" - to = "/.netlify/functions/cloud-status-check" - status = 301 - force = true -[[redirects]] - from = "/config-manager/*" - to = "/.netlify/functions/not-supported" - status = 301 - force = true - -# For router history mode, ensure pages land on index -[[redirects]] - from = "/*" - to = "/index.html" - status = 200 - -# Set any security headers here -[[headers]] - for = "/*" - [headers.values] - # Uncomment to enable Netlify user control. You must have a paid plan. - # Basic-Auth = "someuser:somepassword anotheruser:anotherpassword" +# Enables you to easily deploy a fork of Dashy to Netlify +# without the need to configure anything in admin UI +# Docs: https://www.netlify.com/docs/netlify-toml-reference/ + +# Essential site config +[build] + base = "/" + command = "yarn build" + publish = "dist" + functions = "services/serverless-functions" + +# Site info, used for the 1-Click deploy page +[template.environment] + STATUSKIT_PAGE_TITLE = "Dashy" + STATUSKIT_COMPANY_LOGO = "https://raw.githubusercontent.com/Lissy93/dashy/master/docs/assets/logo.png" + STATUSKIT_SUPPORT_CONTACT_LINK = "https://github.com/lissy93/dashy" + STATUSKIT_RESOURCES_LINK = "https://dashy.to/docs" + +# Redirect the Node endpoints to serverless functions +[[redirects]] + from = "/status-check" + to = "/.netlify/functions/cloud-status-check" + status = 301 + force = true +[[redirects]] + from = "/config-manager/*" + to = "/.netlify/functions/not-supported" + status = 301 + force = true +[[redirects]] + from = "/cors-proxy" + to = "/.netlify/functions/netlify-cors" + status = 301 + force = true + +# For router history mode, ensure pages land on index +[[redirects]] + from = "/*" + to = "/index.html" + status = 200 + +# Set any security headers here +[[headers]] + for = "/*" + [headers.values] + # Uncomment to enable Netlify user control. You must have a paid plan. + # Basic-Auth = "someuser:somepassword anotheruser:anotherpassword" + diff --git a/services/serverless-functions/netlify-cors.js b/services/serverless-functions/netlify-cors.js new file mode 100644 index 00000000..eaa7b4b7 --- /dev/null +++ b/services/serverless-functions/netlify-cors.js @@ -0,0 +1,42 @@ +/* A Netlify cloud function to handle requests to CORS-disabled services */ +const axios = require('axios'); + +exports.handler = (event, context, callback) => { + // Get URL from header or GET param + const requestUrl = event.queryStringParameters.url + || event.headers['Target-URL'] + || event.headers['target-url']; + + // If URL missing, return error + if (!requestUrl) { + callback(null, { + statusCode: 400, + body: JSON.stringify({ success: false, msg: 'Missing Target-URL header' }), + }); + } + + // Prepare request + const requestConfig = { + method: 'GET', + url: requestUrl, + json: event.body, + }; + + // Response headers + const headers = { + 'Access-Control-Allow-Origin': '*', + ...event.headers, + }; + + // Make request + axios.request(requestConfig) + .then((response) => { + const body = JSON.stringify(response.data); + callback(null, { statusCode: 200, body, headers }); + }).catch((error) => { + callback(null, { + statusCode: 400, + body: JSON.stringify({ success: false, msg: 'Request failed', error }), + }); + }); +};