proxy.js 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. import https from "https";
  2. import http from "http";
  3. function httpsRequest(params) {
  4. return new Promise(function (resolve, reject) {
  5. var request = https.request(params, function (response) {
  6. let data = "";
  7. response.on("data", (chunk) => {
  8. data = data + chunk.toString();
  9. });
  10. response.on("end", () => {
  11. resolve([response.statusCode, data]);
  12. });
  13. });
  14. request.on("error", (error) => {
  15. reject([500, error]);
  16. });
  17. request.end();
  18. });
  19. }
  20. function httpRequest(params) {
  21. return new Promise(function (resolve, reject) {
  22. var request = http.request(params, function (response) {
  23. let data = "";
  24. response.on("data", (chunk) => {
  25. data = data + chunk.toString();
  26. });
  27. response.on("end", () => {
  28. resolve([response.statusCode, data]);
  29. });
  30. });
  31. request.on("error", (error) => {
  32. reject([500, error]);
  33. });
  34. request.end();
  35. });
  36. }
  37. export default async function handler(req, res) {
  38. const headers = ["X-API-Key", "Content-Type", "Authorization"].reduce((obj, key) => {
  39. if (req.headers && req.headers.hasOwnProperty(key.toLowerCase())) {
  40. obj[key] = req.headers[key.toLowerCase()];
  41. }
  42. return obj;
  43. }, {});
  44. const url = new URL(req.query.url);
  45. if (url.protocol === "https:") {
  46. // this agent allows us to bypass the certificate check
  47. // which is required for most self-signed certificates
  48. const httpsAgent = new https.Agent({
  49. rejectUnauthorized: false,
  50. });
  51. const [status, data] = await httpsRequest({
  52. hostname: url.hostname,
  53. path: url.pathname,
  54. port: url.port,
  55. agent: httpsAgent,
  56. method: req.method,
  57. headers: headers,
  58. body: req.method == "GET" || req.method == "HEAD" ? null : req.body,
  59. });
  60. return res.status(status).send(data);
  61. } else {
  62. const [status, data] = await httpRequest({
  63. hostname: url.hostname,
  64. path: url.pathname,
  65. port: url.port,
  66. method: req.method,
  67. headers: headers,
  68. body: req.method == "GET" || req.method == "HEAD" ? null : req.body,
  69. });
  70. return res.status(status).send(data);
  71. }
  72. }