Luc
Luc

Reputation: 17072

nodejs proxy not responding

I have a node.js app that serve static files (html, js, css). Among the static files, some ajax request are done (with /TEST in the request). I need those request to be proxied to another server running on localhost:213445. The static pages are correctly displayed but when it comes to proxied request it hangs forever...

My code is:

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

// Create https server
var app = express.createServer({
    key: fs.readFileSync('privatekey.pem'),
    cert: fs.readFileSync('certificate.pem')
});

// Handle static files
app.use(express.static(__dirname + '/public'));

// Proxy request
app.all('/TEST/*',function(req, res){
  // Remove '/TEST' part from query string
  req.url = '/' + req.url.split('/').slice(2).join('/');

  // Create proxy
  var proxy = new httpProxy.HttpProxy();
  proxy.proxyRequest(req, res, {
     host: 'localhost',
     port: 21345,
     enableXForwarded: false,
     buffer: proxy.buffer(req)
  });
});

// Run application
app.listen(10443);

Upvotes: 3

Views: 2101

Answers (2)

thadk
thadk

Reputation: 1057

As described on the http-proxy issue 180 the trouble is related to the non-standard things done by connect mentioned above:

Use npm to install connect-restreamer and make this the final item in your app.configuration of express:

app.use(require('connect-restreamer')());

Then do something like:

var httpProxy = require('http-proxy');
var routingProxy = new httpProxy.RoutingProxy();

app.get('/proxy/', function (req, res) {
  routingProxy.proxyRequest(req, res, {
    target: {
       host : host,
       port : port
    }
  });
})

This will pass the whole URL, including "/proxy/" to the target host. You can rewrite/modify the headers of the req before they go into the proxyRequest() if you, e.g. want to mimic the request coming from a specific CNAME virtual host or different URL string.

Upvotes: 2

Ram
Ram

Reputation: 1297

I have the same issue. If you comment out the

// Handle static files
app.use(express.static(__dirname + '/public'));

you will see that the the proxy works.

Not sure how to fix it if express.static is used

Marak Squires responded to the bug report!

This is an express problem. The Connect / Express middlewares are doing non-standard things to your response object, breaks streaming. Try using the raw request module instead of http-proxy. If you need proper middleware stack, check out https://github.com/flatiron/union

Upvotes: 2

Related Questions