Browse Source

allow http proxied requests

Ben Phelps 2 năm trước cách đây
mục cha
commit
1f58d4be23
1 tập tin đã thay đổi với 52 bổ sung16 xóa
  1. 52 16
      src/pages/api/proxy.js

+ 52 - 16
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);
+  }
 }