--- /dev/null
+// Regression test for GH-784
+// https://github.com/joyent/node/issues/784
+//
+// The test works by making a total of 8 requests to the server. The first
+// two are made with the server off - they should come back as ECONNREFUSED.
+// The next two are made with server on - they should come back successful.
+// The next two are made with the server off - and so on. Without the fix
+// we were experiencing parse errors and instead of ECONNREFUSED.
+var common = require('../common');
+var http = require('http');
+var assert = require('assert');
+
+
+var server = http.createServer(function(req, res) {
+ var body = '';
+
+ req.setEncoding('utf8');
+ req.on('data', function(chunk) {
+ body += chunk;
+ });
+
+ req.on('end', function() {
+ assert.equal('PING', body);
+ res.writeHead(200);
+ res.end('PONG');
+ });
+});
+
+
+server.on('listening', pingping);
+
+
+function serverOn() {
+ console.error("Server ON");
+ server.listen(common.PORT);
+}
+
+
+function serverOff() {
+ console.error("Server OFF");
+ server.close();
+ pingping();
+}
+
+var responses = []
+
+
+function afterPing(result) {
+ responses.push(result);
+ console.error('afterPing. responses.length = ' + responses.length);
+ switch (responses.length) {
+ case 2:
+ assert.ok(/ECONNREFUSED/.test(responses[0]));
+ assert.ok(/ECONNREFUSED/.test(responses[1]));
+ serverOn();
+ break;
+
+ case 4:
+ assert.ok(/success/.test(responses[2]));
+ assert.ok(/success/.test(responses[3]));
+ serverOff();
+ break;
+
+ case 6:
+ assert.ok(/ECONNREFUSED/.test(responses[4]));
+ assert.ok(/ECONNREFUSED/.test(responses[5]));
+ serverOn();
+ break;
+
+ case 8:
+ assert.ok(/success/.test(responses[6]));
+ assert.ok(/success/.test(responses[7]));
+ server.close();
+ // we should go to process.on('exit') from here.
+ break;
+ }
+}
+
+
+function ping() {
+ console.error("making req");
+
+ var opt = {
+ port: common.PORT,
+ path: '/ping',
+ method: 'POST'
+ };
+
+ var req = http.request(opt, function(res) {
+ var body = '';
+
+ res.setEncoding('utf8');
+ res.on('data', function(chunk) {
+ body += chunk;
+ });
+
+ res.on('end', function() {
+ assert.equal('PONG', body);
+ assert.ok(!hadError);
+ gotEnd = true;
+ afterPing("success");
+ });
+ });
+
+ req.end('PING');
+
+ var gotEnd = false;
+ var hadError = false;
+
+ req.on('error', function(error) {
+ console.log("Error making ping req: " + error);
+ hadError = true;
+ assert.ok(!gotEnd);
+ afterPing(error.message);
+ });
+}
+
+
+
+function pingping() {
+ ping();
+ ping();
+}
+
+
+pingping();
+
+
+
+
+process.on('exit', function() {
+ console.error("process.on('exit')");
+ console.error(responses);
+
+ assert.equal(8, responses.length);
+});