diff --git a/src/pages/api/proxy.js b/src/pages/api/proxy.js index 194e4909e..01d33d84f 100644 --- a/src/pages/api/proxy.js +++ b/src/pages/api/proxy.js @@ -1,4 +1,5 @@ import https from "https"; +import http from "http"; function httpsRequest(params) { return new Promise(function (resolve, reject) { @@ -22,6 +23,28 @@ function httpsRequest(params) { }); } +function httpRequest(params) { + return new Promise(function (resolve, reject) { + var request = http.request(params, function (response) { + let data = ""; + + response.on("data", (chunk) => { + data = data + chunk.toString(); + }); + + response.on("end", () => { + resolve([response.statusCode, data]); + }); + }); + + request.on("error", (error) => { + reject([500, error]); + }); + + request.end(); + }); +} + export default async function handler(req, res) { const headers = ["X-API-Key", "Content-Type", "Authorization"].reduce((obj, key) => { if (req.headers && req.headers.hasOwnProperty(key.toLowerCase())) { @@ -30,23 +53,36 @@ export default async function handler(req, res) { return obj; }, {}); - // this agent allows us to bypass the certificate check - // which is required for most self-signed certificates - const httpsAgent = new https.Agent({ - rejectUnauthorized: false, - }); - const url = new URL(req.query.url); - const [status, data] = await httpsRequest({ - hostname: url.hostname, - path: url.pathname, - port: url.port, - agent: httpsAgent, - method: req.method, - headers: headers, - body: req.method == "GET" || req.method == "HEAD" ? null : req.body, - }); + if (url.protocol === "https:") { + // this agent allows us to bypass the certificate check + // which is required for most self-signed certificates + const httpsAgent = new https.Agent({ + rejectUnauthorized: false, + }); + + const [status, data] = await httpsRequest({ + hostname: url.hostname, + path: url.pathname, + port: url.port, + agent: httpsAgent, + method: req.method, + headers: headers, + body: req.method == "GET" || req.method == "HEAD" ? null : req.body, + }); + + return res.status(status).send(data); + } else { + const [status, data] = await httpRequest({ + hostname: url.hostname, + path: url.pathname, + port: url.port, + method: req.method, + headers: headers, + body: req.method == "GET" || req.method == "HEAD" ? null : req.body, + }); - res.status(status).send(data); + return res.status(status).send(data); + } }