Spaces:
Running
Running
import fetch from 'node-fetch'; | |
import { forwardFetchResponse } from '../util.js'; | |
/** | |
* Middleware to proxy requests to a different domain | |
* @param {import('express').Request} req Express request object | |
* @param {import('express').Response} res Express response object | |
*/ | |
export default async function corsProxyMiddleware(req, res) { | |
const url = req.params.url; // get the url from the request path | |
// Disallow circular requests | |
const serverUrl = req.protocol + '://' + req.get('host'); | |
if (url.startsWith(serverUrl)) { | |
return res.status(400).send('Circular requests are not allowed'); | |
} | |
try { | |
const headers = JSON.parse(JSON.stringify(req.headers)); | |
const headersToRemove = [ | |
'x-csrf-token', 'host', 'referer', 'origin', 'cookie', | |
'x-forwarded-for', 'x-forwarded-protocol', 'x-forwarded-proto', | |
'x-forwarded-host', 'x-real-ip', 'sec-fetch-mode', | |
'sec-fetch-site', 'sec-fetch-dest', | |
]; | |
headersToRemove.forEach(header => delete headers[header]); | |
const bodyMethods = ['POST', 'PUT', 'PATCH']; | |
const response = await fetch(url, { | |
method: req.method, | |
headers: headers, | |
body: bodyMethods.includes(req.method) ? JSON.stringify(req.body) : undefined, | |
}); | |
// Copy over relevant response params to the proxy response | |
forwardFetchResponse(response, res); | |
} catch (error) { | |
res.status(500).send('Error occurred while trying to proxy to: ' + url + ' ' + error); | |
} | |
} | |