Add another http upgrade test
authorRyan Dahl <ry@tinyclouds.org>
Mon, 3 May 2010 18:23:36 +0000 (11:23 -0700)
committerRyan Dahl <ry@tinyclouds.org>
Mon, 3 May 2010 18:23:36 +0000 (11:23 -0700)
lib/http.js
test/simple/test-http-upgrade2.js [new file with mode: 0644]

index fd00910..3cfe75b 100644 (file)
@@ -569,10 +569,11 @@ function connectionListener (socket) {
       // in the upgradeHead from the closing lines of the headers
       var upgradeHead = d.slice(start + bytesParsed + 1, end);
 
-      if(self.listeners("upgrade").length > 0) {
+      if (self.listeners("upgrade").length) {
         self.emit('upgrade', req, req.socket, upgradeHead);
       } else {
-        socket.end();
+        // Got upgrade header, but have no handler.
+        socket.destroy();
       }
     }
   };
diff --git a/test/simple/test-http-upgrade2.js b/test/simple/test-http-upgrade2.js
new file mode 100644 (file)
index 0000000..4fed20b
--- /dev/null
@@ -0,0 +1,53 @@
+require('../common');
+
+http = require('http');
+net = require('net');
+
+server = http.createServer(function (req, res) {
+  error('got req');
+  throw new Error("This shouldn't happen.");
+});
+
+server.addListener('upgrade', function (req, socket, upgradeHead) {
+  error('got upgrade event');
+  // test that throwing an error from upgrade gets forworded
+  // to the server'server 'error' event.
+  throw new Error('upgrade error');
+});
+
+gotError = false;
+
+server.addListener('clientError', function (e) {
+  error('got "clientError" event');
+  assert.equal('upgrade error', e.message);
+  gotError = true;
+});
+
+server.listen(PORT);
+
+
+server.addListener('listening', function () {
+  var c = net.createConnection(PORT);
+
+  c.addListener('connect', function () {
+    error('client wrote message');
+    c.write( "GET /blah HTTP/1.1\r\n"
+           + "Upgrade: WebSocket\r\n"
+           + "Connection: Upgrade\r\n"
+           + "\r\n\r\nhello world"
+           );
+  });
+
+  c.addListener('end', function () {
+    c.end();
+  });
+
+  c.addListener('close', function () {
+    error('client close');
+    server.close();
+  });
+});
+
+process.addListener('exit', function () {
+  assert.ok(gotError);
+});