http-proxy-mitm

0.1.2 • Public • Published

http-proxy-mitm Build Status

Use it with http-proxy to transform the response from the proxied server.

Based on node-http-proxy-json by langjt. Thank you for your work!

Motivation

There is very hard to modify non-XML response when using http-proxy. For HTML/XML document you can try Harmon.

Usually the server will compress the data, confirm your server compression format before using this repository: http-proxy-mitm currently supports gzipdeflate and uncompressed content encoding.

If you need other compression format, try to pass in decoder and encoder as the first and the last transformer.

Installation

npm i http-proxy-mitm

Examples

Handling server with gzip compression

const zlib = require('zlib');
const http = require('http');
const httpProxy = require('http-proxy');
const httpProxyMitm = require('http-proxy-mitm');
 
// Create a proxy server
const proxy = httpProxy.createProxyServer({
    target: 'http://localhost:5001'
});
 
// Listen for the `proxyRes` event on `proxy`.
proxy.on('proxyRes', httpProxyMitm([
    {
        condition: function(res, req) { return req.url === '/1'; },
        bodyTransform: function (body) {
            body = JSON.parse(body);
            if (body) {
                body.age = 2;
                body.version = undefined;
            }
            return JSON.stringify(body);
        }
    },
    {
        condition: function(res, req) { return req.url === '/2'; },
        transform: through2(function (chunk, enc, cb) {
            cb(null, new Buffer(chunk.toString().replace(',"age":1', ',"age":2').replace(',"version":"1.0.0"', '')));
        })
    }
]));
 
// Create your server and then proxies the request
const server = http.createServer(function (req, res) {
    proxy.web(req, res);
}).listen(5000);
 
// Create your target server
const targetServer = http.createServer(function (req, res) {
    // Create gzipped content
    const gzip = zlib.Gzip();
    gzip.pipe(res);
 
    res.writeHead(200, {'Content-Type': 'application/json', 'Content-Encoding': 'gzip'});
    gzip.write(JSON.stringify({name: 'node-http-proxy-mitm', age: 1, version: '1.0.0'}));
    gzip.end();
}).listen(5001);

Handling server with deflate compression

const zlib = require('zlib');
const http = require('http');
const httpProxy = require('http-proxy');
const httpProxyMitm = require('http-proxy-mitm');
 
// Create a proxy server
const proxy = httpProxy.createProxyServer({
    target: 'http://localhost:5001'
});
 
// Listen for the `proxyRes` event on `proxy`.
proxy.on('proxyRes', httpProxyMitm([{
    transform: through2(function (chunk, enc, cb) {
        cb(null, new Buffer(chunk.toString().replace(',"age":1', ',"age":2').replace(',"version":"1.0.0"', '')));
    })
}]));
 
// Create your server and then proxies the request
const server = http.createServer(function (req, res) {
    proxy.web(req, res);
}).listen(5000);
 
// Create your target server
const targetServer = http.createServer(function (req, res) {
    // Create deflated content
    const deflate = zlib.Deflate();
    deflate.pipe(res);
 
    res.writeHead(200, {'Content-Type': 'application/json', 'Content-Encoding': 'deflate'});
    deflate.write(JSON.stringify({name: 'node-http-proxy-mitm', age: 1, version: '1.0.0'}));
    deflate.end();
}).listen(5001);

Handling server without compression

const http = require('http');
const httpProxy = require('http-proxy');
const modifyResponse = require('../');
 
// Create a proxy server
const proxy = httpProxy.createProxyServer({
    target: 'http://localhost:5001'
});
 
// Listen for the `proxyRes` event on `proxy`.
proxy.on('proxyRes', httpProxyMitm([{
    transform: through2(function (chunk, enc, cb) {
        cb(null, new Buffer(chunk.toString().replace(',"age":1', ',"age":2').replace(',"version":"1.0.0"', '')));
    })
}]));
 
// Create your server and then proxies the request
const server = http.createServer(function (req, res) {
    proxy.web(req, res);
}).listen(5000);
 
// Create your target server
const targetServer = http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'application/json', 'Content-Encoding': 'deflate'});
    res.write(JSON.stringify({name: 'node-http-proxy-mitm', age: 1, version: '1.0.0'}));
    res.end();
}).listen(5001);

Tests

To run the test suite, first install the dependencies, then run npm test:

npm install
npm test

License

MIT

Versions

Current Tags

  • Version
    Downloads (Last 7 Days)
    • Tag
  • 0.1.2
    1
    • latest

Version History

  • Version
    Downloads (Last 7 Days)
    • Published
  • 0.1.2
    1
  • 0.1.1
    0

Package Sidebar

Install

npm i http-proxy-mitm

Weekly Downloads

1

Version

0.1.2

License

MIT

Last publish

Collaborators

  • qfox