The problem is less than the end event and more data . If the client makes GET requests, there are headers and data. This is different from POST when the requestor sends data, so the on("data") handler gets hit. So (excuse me for the JS example, I'm not so familiar with coffeescript):
var http = require('http'); // You won't see the output of request.on("data") http.createServer(function (request, response) { request.on("end", function(){ console.log("here"); }); request.on("data", function(data) { console.log("I am here"); console.log(data.toString("utf8")); }); response.writeHead(200, {'Content-Type': 'text/plain'}); response.end('Hello World\n'); }).listen(8124); console.log('Server running at http://127.0.0.1:8124/');
If I make a curl call for this server, the data event never gets caught, because the GET request is nothing more than a header. Because of this, your logic becomes:
// okay setup the request... // However, the callback doesn't get hit until you // start writing some data or ending the proxyRequest! proxyRequest = http.request(options, (proxyResponse) -> // So this doesn't get hit yet... proxyResponse.on('data', (chunk) -> response.write(chunk, 'binary') ) // and this doesn't get hit yet proxyResponse.on('end', (chunk) -> // which is why your response.on("end") event isn't getting hit yet response.end() ) response.writeHead proxyResponse.statusCode, proxyResponse.headers ) // This doesn't get hit! request.on('data', (chunk) -> proxyRequest.write(chunk, 'binary') ) // So this isn't going to happen until your proxyRequest // callback handler gets hit, which hasn't happened because // unlike POST there no data in your GET request request.on('end', -> proxyRequest.end() ) // now the proxy request call is finally made, which // triggers the callback function in your http request setup proxyRequest.end()
So yes, you will have to manually call proxyRequest.end() for GET requests due to the logical branching just mentioned.
source share