From 163f72264f37f4e90b3afb3f46c1bbd50eb4f78a Mon Sep 17 00:00:00 2001 From: James Coglan Date: Thu, 24 Nov 2011 02:50:27 +0000 Subject: [PATCH] Fix up the draft-76 parser. --- README.markdown | 2 +- lib/faye/websocket.js | 2 +- lib/faye/websocket/draft76_parser.js | 98 +++++++++++++++------------- 3 files changed, 55 insertions(+), 47 deletions(-) diff --git a/README.markdown b/README.markdown index a296d6a..92aedde 100644 --- a/README.markdown +++ b/README.markdown @@ -58,7 +58,7 @@ var WebSocket = require('faye-websocket'), ws.onopen = function(event) { console.log('open'); - ws.send('Hello, WebSocket!'); + ws.send('Hello, world!'); }; ws.onmessage = function(event) { diff --git a/lib/faye/websocket.js b/lib/faye/websocket.js index 73234c6..5ea5574 100644 --- a/lib/faye/websocket.js +++ b/lib/faye/websocket.js @@ -8,7 +8,7 @@ **/ var Draft75Parser = require('./websocket/draft75_parser'), - // Draft76Parser = require('./websocket/draft75_parser'), + Draft76Parser = require('./websocket/draft76_parser'), Protocol8Parser = require('./websocket/protocol8_parser'), API = require('./websocket/api'); diff --git a/lib/faye/websocket/draft76_parser.js b/lib/faye/websocket/draft76_parser.js index a76e497..25d5c11 100644 --- a/lib/faye/websocket/draft76_parser.js +++ b/lib/faye/websocket/draft76_parser.js @@ -1,48 +1,56 @@ -Faye.WebSocket.Draft76Parser = Faye.Class(Faye.WebSocket.Draft75Parser, { - version: 'draft-76', +var Draft75Parser = require('./draft75_parser'), + Draft76Parser = function() {}; + +var bridge = function() {}; +bridge.prototype = Draft75Parser.prototype; +Draft76Parser.prototype = new bridge(); + +var numberFromKey = function(key) { + return parseInt(key.match(/[0-9]/g).join(''), 10); +}; + +var spacesInKey = function(key) { + return key.match(/ /g).length; +}; + +var bigEndian = function(number) { + var string = ''; + Faye.each([24,16,8,0], function(offset) { + string += String.fromCharCode(number >> offset & 0xFF); + }); + return string; +}; + +Draft76Parser.prototype.version = 'draft-76'; - handshakeResponse: function(head) { - var request = this._socket.request, - stream = this._stream, - - key1 = request.headers['sec-websocket-key1'], - value1 = this._numberFromKey(key1) / this._spacesInKey(key1), - - key2 = request.headers['sec-websocket-key2'], - value2 = this._numberFromKey(key2) / this._spacesInKey(key2), - - MD5 = crypto.createHash('md5'); - - MD5.update(this._bigEndian(value1)); - MD5.update(this._bigEndian(value2)); - MD5.update(head.toString('binary')); - - try { - stream.write('HTTP/1.1 101 Web Socket Protocol Handshake\r\n', 'binary'); - stream.write('Upgrade: WebSocket\r\n', 'binary'); - stream.write('Connection: Upgrade\r\n', 'binary'); - stream.write('Sec-WebSocket-Origin: ' + request.headers.origin + '\r\n', 'binary'); - stream.write('Sec-WebSocket-Location: ' + this._socket.url + '\r\n\r\n', 'binary'); - stream.write(MD5.digest('binary'), 'binary'); - } catch (e) { - // socket closed while writing - // no handshake sent; client will stop using WebSocket - } - }, +Draft76Parser.prototype.handshakeResponse = function(head) { + var request = this._socket.request, + stream = this._stream, + + key1 = request.headers['sec-websocket-key1'], + value1 = numberFromKey(key1) / spacesInKey(key1), + + key2 = request.headers['sec-websocket-key2'], + value2 = numberFromKey(key2) / spacesInKey(key2), + + MD5 = crypto.createHash('md5'); - _numberFromKey: function(key) { - return parseInt(key.match(/[0-9]/g).join(''), 10); - }, + MD5.update(bigEndian(value1)); + MD5.update(bigEndian(value2)); + MD5.update(head.toString('binary')); - _spacesInKey: function(key) { - return key.match(/ /g).length; - }, - - _bigEndian: function(number) { - var string = ''; - Faye.each([24,16,8,0], function(offset) { - string += String.fromCharCode(number >> offset & 0xFF); - }); - return string; - } -}); + try { + stream.write('HTTP/1.1 101 Web Socket Protocol Handshake\r\n', 'binary'); + stream.write('Upgrade: WebSocket\r\n', 'binary'); + stream.write('Connection: Upgrade\r\n', 'binary'); + stream.write('Sec-WebSocket-Origin: ' + request.headers.origin + '\r\n', 'binary'); + stream.write('Sec-WebSocket-Location: ' + this._socket.url + '\r\n\r\n', 'binary'); + stream.write(MD5.digest('binary'), 'binary'); + } catch (e) { + // socket closed while writing + // no handshake sent; client will stop using WebSocket + } +}; + +module.exports = Draft76Parser; +