From 1f3cd43bef6b4bcd3b016dd1727c21367d47c546 Mon Sep 17 00:00:00 2001 From: Ben Phelps Date: Thu, 25 Aug 2022 20:57:25 +0300 Subject: [PATCH] forward proxy bodies raw --- src/pages/api/proxy.js | 66 +++++++++++++----------------------------- src/utils/http.js | 46 +++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+), 46 deletions(-) create mode 100644 src/utils/http.js diff --git a/src/pages/api/proxy.js b/src/pages/api/proxy.js index 01d33d84f..df72887e3 100644 --- a/src/pages/api/proxy.js +++ b/src/pages/api/proxy.js @@ -1,52 +1,16 @@ import https from "https"; -import http from "http"; +import getRawBody from "raw-body"; -function httpsRequest(params) { - return new Promise(function (resolve, reject) { - var request = https.request(params, function (response) { - let data = ""; +import { httpRequest, httpsRequest } from "utils/http"; - response.on("data", (chunk) => { - data = data + chunk.toString(); - }); - - response.on("end", () => { - resolve([response.statusCode, data]); - }); - }); - - request.on("error", (error) => { - reject([500, error]); - }); - - request.end(); - }); -} - -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 const config = { + api: { + bodyParser: false, + }, +}; export default async function handler(req, res) { - const headers = ["X-API-Key", "Content-Type", "Authorization"].reduce((obj, key) => { + const headers = ["X-API-Key", "Authorization"].reduce((obj, key) => { if (req.headers && req.headers.hasOwnProperty(key.toLowerCase())) { obj[key] = req.headers[key.toLowerCase()]; } @@ -69,7 +33,12 @@ export default async function handler(req, res) { agent: httpsAgent, method: req.method, headers: headers, - body: req.method == "GET" || req.method == "HEAD" ? null : req.body, + body: + req.method == "GET" || req.method == "HEAD" + ? null + : await getRawBody(req, { + encoding: "utf8", + }), }); return res.status(status).send(data); @@ -80,7 +49,12 @@ export default async function handler(req, res) { port: url.port, method: req.method, headers: headers, - body: req.method == "GET" || req.method == "HEAD" ? null : req.body, + body: + req.method == "GET" || req.method == "HEAD" + ? null + : await getRawBody(req, { + encoding: "utf8", + }), }); return res.status(status).send(data); diff --git a/src/utils/http.js b/src/utils/http.js new file mode 100644 index 000000000..8d69eb068 --- /dev/null +++ b/src/utils/http.js @@ -0,0 +1,46 @@ +import https from "https"; +import http from "http"; + +export function httpsRequest(params) { + return new Promise(function (resolve, reject) { + var request = https.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 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(); + }); +}