Skip to content

Alternatives to http-proxy #1687

@paulrutter

Description

@paulrutter

I've been using this module for a long time for http proxying, but since it's no longer maintained i was looking into alternatives.
For what it's worth, sharing my findings here.

Using node basic modules

My usecase: i have a expressjs app for which i want to proxy all requests to a Node process running on the same machine, on a different port. This code snippet shows how to proxy request/response including error handling.

const stream = require('stream');
const util = require('util');
const pipeline = util.promisify(stream.pipeline);

// proxyPort, req and res are passed here
// proxyPort: 5000
// req: incoming expressjs request
// res: outgoing expressjs response

// custom agent if needed
const proxyAgent = new http.Agent({
  keepAlive: global.PROXY_CONFIG.useKeepAlive,
  maxSockets: global.PROXY_CONFIG.maxSockets
});

// copy over url, method and headers here
const requestOptions = {
  hostname: "localhost",
  port: proxyPort,
  path: req.url,
  method: req.method,
  agent: proxyAgent ,
  headers: req.headers
};

// create the proxy request 
const proxyReq = http.request(requestOptions, async (proxyRes) => {
  // Proxy response headers
  for (const headerName of Object.keys(proxyRes.headers)) {
    res.setHeader(headerName, proxyRes.headers[headerName]);
  }

  // Proxy response status code and message
  res.statusCode = proxyRes.statusCode;
  res.statusMessage = proxyRes.statusMessage;

  // send the response body of the proxied response to the origin response 
  try {
    await pipeline(proxyRes, res);
  } catch (err) {
    // add error handling here or log it at least
   res.send(500).end();
  } finally {
    // proxy is done here, log it?
  }
});

// Proxy the request body
try {
  await pipeline(req, proxyReq);
} catch (error) {
  // add error handling here or log it at least
  res.send(500).end();
} finally {
    // The request body is fully proxied here, if you want to do anything with this information
}

This snippet doesn't offer everything this module offers, but it's easily extendable to add features like adding/removing headers from the request or response. It's all plain node code, no additional module involved.

Other proxy modules or ways to do it

I hope this is helpful to others moving away from http-proxy.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions