Friday, 15 January 2010

node.js - NodeJS Write a Masked WebSocket frame? -



node.js - NodeJS Write a Masked WebSocket frame? -

im need help, please.

im making little chat app , server using node.js

masked , unmasked info read eveything ok. write unmasked info ok no problem. im need sending masked data.

need little revision unmasked info sending script. please help.

my script :

this.send = function(data) { var datalength = buffer.bytelength(data), databuffer, rawbytessend = 2; if(datalength > 65535) { databuffer = new buffer(10 + datalength); databuffer[1] = 127; var low = datalength | 0, hi = (datalength - low) / 4294967296; databuffer[2] = (hi >> 24) & 255; databuffer[3] = (hi >> 16) & 255; databuffer[4] = (hi >> 8) & 255; databuffer[5] = hi & 255; databuffer[6] = (low >> 24) & 255; databuffer[7] = (low >> 16) & 255; databuffer[8] = (low >> 8) & 255; databuffer[9] = low & 255; rawbytessend += 8 } else if(datalength > 125) { databuffer = new buffer(4 + datalength); databuffer[1] = 126; databuffer[2] = (datalength >> 8) & 255; databuffer[3] = datalength & 255; rawbytessend += 2 } else { databuffer = new buffer(2 + datalength); databuffer[1] = datalength } databuffer[0] = 128 + (binary ? 2 : 1); databuffer[1] &= ~128; /* not woking code block <<<<------ mask = [math.floor(math.random() * 256), math.floor(math.random() * 256), math.floor(math.random() * 256), math.floor(math.random() * 256)]; (var = 0, n = databuffer.length - rawbytessend ; < n; i++) { databuffer[rawbytessend + i] = databuffer[rawbytessend + i] ^ mask[i % 4]; } */ //not woking code block how prepare problem !!!!!!!!!!!!! if(that.socket.writable) { databuffer.write(data, rawbytessend); this.socket.write(databuffer); that.rawbytessend += rawbytessend + datalength; that.bytessend += datalength } else { this.__end(true) } homecoming rawbytessend };

im found prepare sharing...

this.mask = function(payload, mask, offset) { if (!mask || mask.length === 0) homecoming payload; offset = offset || 0; (var = 0, n = payload.length - offset; < n; i++) { payload[offset + i] = payload[offset + i] ^ mask[i % 4]; } homecoming payload; }; this.send = function(data) { if (data instanceof array) info = new buffer(data); var code, type ='text', _masking=this._mask, opcodes ={continuation:0,text:1,binary:2,close:8,ping:9,pong:10}, istext = (typeof info === 'string'), opcode = opcodes[type || (istext ? 'text' : 'binary')], buffer = istext ? new buffer(data, 'utf8') : data, insert = code ? 2 : 0, length = buffer.length + insert, header = (length <= 125) ? 2 : (length <= 65535 ? 4 : 10), offset = header + (_masking ? 4 : 0), masked = _masking ? 128 : 0, frame = new buffer(length + offset), byte = 255, mask, i; frame[0] = 128 | opcode; if (length <= 125) { frame[1] = masked | length; } else if (length <= 65535) { frame[1] = masked | 126; frame[2] = math.floor(length / 256); frame[3] = length & byte; } else { frame[1] = masked | 127; frame[2] = math.floor(length / math.pow(2,56)) & byte; frame[3] = math.floor(length / math.pow(2,48)) & byte; frame[4] = math.floor(length / math.pow(2,40)) & byte; frame[5] = math.floor(length / math.pow(2,32)) & byte; frame[6] = math.floor(length / math.pow(2,24)) & byte; frame[7] = math.floor(length / math.pow(2,16)) & byte; frame[8] = math.floor(length / math.pow(2,8)) & byte; frame[9] = length & byte; } if (code) { frame[offset] = math.floor(code / 256) & byte; frame[offset+1] = code & byte; } buffer.copy(frame, offset + insert); if (_masking) { mask = [math.floor(math.random() * 256), math.floor(math.random() * 256), math.floor(math.random() * 256), math.floor(math.random() * 256)]; new buffer(mask).copy(frame, header); this.mask(frame, mask, offset); } if(that.socket.writable) { //databuffer.write(data, rawbytessend); this.socket.write(frame); //that.rawbytessend += rawbytessend + datalength; //that.bytessend += datalength } else { this.__end(true) } homecoming true; };

node.js sockets websocket masking

No comments:

Post a Comment