michael@0: var protocol = exports; michael@0: michael@0: // michael@0: // ### function parseSynHead (type, flags, data) michael@0: // #### @type {Number} Frame type michael@0: // #### @flags {Number} Frame flags michael@0: // #### @data {Buffer} input data michael@0: // Returns parsed syn_* frame's head michael@0: // michael@0: protocol.parseSynHead = function parseSynHead(type, flags, data) { michael@0: var stream = type === 0x01; michael@0: michael@0: return { michael@0: type: stream ? 'SYN_STREAM' : 'SYN_REPLY', michael@0: id: data.readUInt32BE(0, true) & 0x7fffffff, michael@0: version: 3, michael@0: associated: stream ? data.readUInt32BE(4, true) & 0x7fffffff : 0, michael@0: priority: stream ? data[8] >> 5 : 0, michael@0: fin: (flags & 0x01) === 0x01, michael@0: unidir: (flags & 0x02) === 0x02, michael@0: _offset: stream ? 10 : 4 michael@0: }; michael@0: }; michael@0: michael@0: // michael@0: // ### function parseHeaders (pairs) michael@0: // #### @pairs {Buffer} header pairs michael@0: // Returns hashmap of parsed headers michael@0: // michael@0: protocol.parseHeaders = function parseHeaders(pairs) { michael@0: var count = pairs.readUInt32BE(0, true), michael@0: headers = {}; michael@0: michael@0: pairs = pairs.slice(4); michael@0: michael@0: function readString() { michael@0: var len = pairs.readUInt32BE(0, true), michael@0: value = pairs.slice(4, 4 + len); michael@0: michael@0: pairs = pairs.slice(4 + len); michael@0: michael@0: return value.toString(); michael@0: } michael@0: michael@0: while(count > 0) { michael@0: headers[readString().replace(/^:/, '')] = readString(); michael@0: count--; michael@0: } michael@0: michael@0: return headers; michael@0: }; michael@0: michael@0: // michael@0: // ### function parsesRst frame michael@0: protocol.parseRst = function parseRst(data) { michael@0: return { michael@0: type: 'RST_STREAM', michael@0: id: data.readUInt32BE(0, true) & 0x7fffffff, michael@0: status: data.readUInt32BE(4, true) michael@0: }; michael@0: }; michael@0: michael@0: protocol.parseSettings = function parseSettings(data) { michael@0: var settings = {}, michael@0: number = data.readUInt32BE(0, true), michael@0: idMap = { michael@0: 1: 'upload_bandwidth', michael@0: 2: 'download_bandwidth', michael@0: 3: 'round_trip_time', michael@0: 4: 'max_concurrent_streams', michael@0: 5: 'current_cwnd', michael@0: 6: 'download_retrans_rate', michael@0: 7: 'initial_window_size', michael@0: 8: 'client_certificate_vector_size' michael@0: }; michael@0: michael@0: for (var i=0; i