Fix up the draft-76 parser.

This commit is contained in:
James Coglan
2011-11-24 02:50:27 +00:00
parent 7abd055b15
commit 163f72264f
3 changed files with 55 additions and 47 deletions
+1 -1
View File
@@ -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) {
+1 -1
View File
@@ -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');
+53 -45
View File
@@ -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;