UNPKG

@reedchan/koa-http-proxy

Version:
189 lines (177 loc) 5.58 kB
var assert = require("assert"); var Koa = require("koa"); var agent = require("supertest").agent; var fs = require("fs"); var os = require("os"); var proxy = require("../"); var startProxyTarget = require("./support/proxyTarget"); startProxyTarget(8109, 1000); describe("body encoding", function () { "use strict"; this.timeout(10000); var pngHex = "89504e470d0a1a0a0" + "000000d4948445200" + "00000100000001080" + "60000001f15c48900" + "00000a49444154789" + "c6300010000050001" + "0d0a2db4000000004" + "9454e44ae426082"; var pngData = Buffer.from(pngHex, "hex"); var largePngData = Buffer.from(pngHex.repeat(100000), "hex"); // 6.7MB it("allow raw data", function (done) { var filename = os.tmpdir() + "/koa-http-proxy-test-" + new Date().getTime() + "-png-transparent.png"; var app = new Koa(); app.use( proxy("localhost:8109", { reqBodyEncoding: null, proxyReqBodyDecorator: function (bodyContent) { assert( Buffer.from(bodyContent) .toString("hex") .indexOf(pngData.toString("hex")) >= 0, "body should contain same data", ); return bodyContent; }, }), ); fs.writeFile(filename, pngData, function (err) { if (err) { throw err; } agent(app.callback()) .post("/post") .attach("image", filename) .end(function (err) { fs.unlink(filename, function () {}); // This test is both broken and I think unnecessary. // Its broken because http.bin no longer supports /post, but this test assertion is based on the old // httpbin behavior. // The assertion in the proxyReqOptDecorator above verifies the test title. //var response = Buffer.from(res.body.attachment.data).toString('base64'); //assert(response.indexOf(pngData.toString('base64')) >= 0, 'response should include original raw data'); done(err); }); }); }); // In this case, the package `raw-body` will print error stack which does not mater. it("should get 413 by posting file which is larger than 1mb without setting limit", function (done) { var filename = os.tmpdir() + "/koa-http-proxy-test-" + new Date().getTime() + "-png-transparent.png"; var app = new Koa(); app.use(proxy("localhost:8109", {})); fs.writeFile(filename, largePngData, function (err) { if (err) { throw err; } agent(app.callback()) .post("/post") .attach("image", filename) .expect(413) .end(function (err) { fs.unlink(filename, function () {}); assert(err === null); if (err) { return done(err); } done(); }); }); }); it("should not fail on large limit", function (done) { var filename = os.tmpdir() + "/koa-http-proxy-test-" + new Date().getTime() + "-png-transparent.png"; var app = new Koa(); app.use( proxy("localhost:8109", { // This case `parseReqBody` should not be set to false, limit: "20gb", }), ); fs.writeFile(filename, largePngData, function (err) { if (err) { throw err; } agent(app.callback()) .post("/post") .attach("image", filename) .expect(200) .end(function (err) { fs.unlink(filename, function () {}); assert(err === null); if (err) { return done(err); } done(); }); }); }); describe("when user sets parseReqBody", function () { it("should not parse body", function (done) { var filename = os.tmpdir() + "/koa-http-proxy-test-" + new Date().getTime() + "-png-transparent.png"; var app = new Koa(); app.use( proxy("localhost:8109", { parseReqBody: false, proxyReqBodyDecorator: function (bodyContent) { assert(!bodyContent, "body content should not be parsed."); return bodyContent; }, }), ); fs.writeFile(filename, pngData, function (err) { if (err) { throw err; } agent(app.callback()) .post("/post") .attach("image", filename) .end(function (err) { fs.unlink(filename, function () {}); // This test is both broken and I think unnecessary. // Its broken because http.bin no longer supports /post, but this test assertion is based on the old // httpbin behavior. // The assertion in the proxyReqOptDecorator above verifies the test title. // var response = new Buffer(res.body.attachment.data).toString('base64'); // assert(response.indexOf(pngData.toString('base64')) >= 0, 'response should include original raw data'); done(err); }); }); }); }); describe("when user sets reqBodyEncoding", function () { it("should set the accepts-charset header", function (done) { var app = new Koa(); app.use( proxy("httpbin.org", { reqBodyEncoding: "utf-16", }), ); agent(app.callback()) .get("/headers") .end(function (err, res) { if (err) { throw err; } assert.equal(res.body.headers["Accept-Charset"], "utf-16"); done(err); }); }); }); });