11

Here's the module version that I'm using:

$ npm list -g | grep proxy
├─┬ [email protected]

A webservice calls into my machine and my task is to proxy the request to a different url and host with an additional query parameter based on the contents of the request's body:

var http      = require('http'),
    httpProxy = require('http-proxy')
    form2json = require('form2json');

httpProxy.createServer(function (req, res, proxy) {
  // my custom logic
  var fullBody = '';
  req.on('data', function(chunk) {
      // append the current chunk of data to the fullBody variable
      fullBody += chunk.toString();
  });
  req.on('end', function() {
      var jsonBody = form2json.decode(fullBody);
      var payload = JSON.parse(jsonBody.payload);
      req.url = '/my_couch_db/_design/ddoc_name/_update/my_handler?id="' + payload.id + '"';

      // standard proxy stuff
      proxy.proxyRequest(req, res, {
        changeOrigin: true,
        host: 'my.cloudant.com',
        port: 443,
        https: true
      });
  });
}).listen(8080);

But I keep running into errors like: An error has occurred: {"code":"ECONNRESET"}

Anyone have an idea about what needs to be fixed here?

4 Answers 4

16

This did the trick for me:

var httpProxy = require('http-proxy');

var options = {
  changeOrigin: true,
  target: {
      https: true
  }
}

httpProxy.createServer(443, 'www.google.com', options).listen(8001);
Sign up to request clarification or add additional context in comments.

1 Comment

Thank you Aaron, that is the first useful answer I've received on this topic in a long time and one that actually works!
6

To forward all requests that come in on port 3000 to https://google.com:

const https = require('https')
const httpProxy = require('http-proxy')

httpProxy.createProxyServer({
  target: 'https://google.com',
  agent: https.globalAgent,
  headers: {
    host: 'google.com'
  }
}).listen(3000)

Example inspired by https://github.com/nodejitsu/node-http-proxy/blob/master/examples/http/proxy-http-to-https.js.

Comments

2

After some trial and error, this worked for me:

var fs = require('fs')
var httpProxy = require('http-proxy');
var https = require('https');

var KEY  = 'newfile.key.pem';
var CERT = 'newfile.crt.pem';

httpProxy.createServer({
  changeOrigin: true,
  target: 'https://example.com',
  agent: new https.Agent({
    port: 443,
    key: fs.readFileSync(KEY),
    cert: fs.readFileSync(CERT)
  })
}).listen(8080);

Comments

0

With [email protected], I turn off the secure, and it works.

const apiProxy = httpProxy.createProxyServer({ hostRewrite: true });
apiProxy.web(req, res, {
   target: "https://example.com",
   secure: false,
   changeOrigin: true,
});

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.