From 5535aa3d51c6af2380540bb5f0908357b76ebd13 Mon Sep 17 00:00:00 2001 From: Fedor Indutny Date: Wed, 22 Sep 2010 19:51:53 +0700 Subject: [PATCH] Fixed 'upgrade' event for httpclient onend and ondata was cleaning on parser end --- lib/http.js | 8 ++- test/simple/test-http-upgrade-client2.js | 64 ++++++++++++++++++++++++ 2 files changed, 70 insertions(+), 2 deletions(-) create mode 100644 test/simple/test-http-upgrade-client2.js diff --git a/lib/http.js b/lib/http.js index 45a71c9b51..e78bda71a0 100644 --- a/lib/http.js +++ b/lib/http.js @@ -883,7 +883,7 @@ function Client ( ) { }; }; - self.ondata = function (d, start, end) { + function onData(d, start, end) { if (!parser) { throw new Error("parser not initialized prior to Client.ondata call"); } @@ -909,6 +909,10 @@ function Client ( ) { self.addListener("connect", function () { debug('client connected'); + + self.ondata = onData; + self.onend = onEnd; + if (this.https) { this.setSecure(this.credentials); } else { @@ -924,7 +928,7 @@ function Client ( ) { outgoingFlush(self); }); - self.onend = function () { + function onEnd() { if (parser) parser.finish(); debug("self got end closing. readyState = " + self.readyState); self.end(); diff --git a/test/simple/test-http-upgrade-client2.js b/test/simple/test-http-upgrade-client2.js new file mode 100644 index 0000000000..1ef839be18 --- /dev/null +++ b/test/simple/test-http-upgrade-client2.js @@ -0,0 +1,64 @@ +var common = require("../common"); +var assert = common.assert +var http = require('http'), + CRLF = '\r\n'; + +var server = http.createServer(); +server.on('upgrade', function(req, socket, head) { + socket.write('HTTP/1.1 101 Ok' + CRLF + + 'Connection: Upgrade' + CRLF + + 'Upgrade: Test' + CRLF + CRLF + 'head'); + socket.on('end', function () { + socket.end(); + }); +}); +server.listen(8000); + +var client = http.createClient(8000); + +function upgradeRequest(fn) { + var request = client.request('GET', '/', { + 'Connection': 'Upgrade', + 'Upgrade': 'Test' + }); + + var wasUpgrade = false; + + function onUpgrade(res, socket, head) { + wasUpgrade = true; + + client.removeListener('upgrade', onUpgrade); + socket.end(); + } + client.on('upgrade', onUpgrade); + + function onEnd() { + client.removeListener('end', onEnd); + if (!wasUpgrade) { + throw new Error('hasn\'t received upgrade event'); + } else { + fn && process.nextTick(fn); + } + } + client.on('end', onEnd); + + request.write('head'); + +} + +successCount = 0; +upgradeRequest(function() { + successCount++; + upgradeRequest(function() { + successCount++; + // Test pass + console.log('Pass!'); + client.end(); + client.destroy(); + server.close(); + }); +}); + +process.on('exit', function () { + assert.equal(2, successCount); +});