1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/testing/xpcshell/node-spdy/lib/spdy/protocol/v3/protocol.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,109 @@ 1.4 +var protocol = exports; 1.5 + 1.6 +// 1.7 +// ### function parseSynHead (type, flags, data) 1.8 +// #### @type {Number} Frame type 1.9 +// #### @flags {Number} Frame flags 1.10 +// #### @data {Buffer} input data 1.11 +// Returns parsed syn_* frame's head 1.12 +// 1.13 +protocol.parseSynHead = function parseSynHead(type, flags, data) { 1.14 + var stream = type === 0x01; 1.15 + 1.16 + return { 1.17 + type: stream ? 'SYN_STREAM' : 'SYN_REPLY', 1.18 + id: data.readUInt32BE(0, true) & 0x7fffffff, 1.19 + version: 3, 1.20 + associated: stream ? data.readUInt32BE(4, true) & 0x7fffffff : 0, 1.21 + priority: stream ? data[8] >> 5 : 0, 1.22 + fin: (flags & 0x01) === 0x01, 1.23 + unidir: (flags & 0x02) === 0x02, 1.24 + _offset: stream ? 10 : 4 1.25 + }; 1.26 +}; 1.27 + 1.28 +// 1.29 +// ### function parseHeaders (pairs) 1.30 +// #### @pairs {Buffer} header pairs 1.31 +// Returns hashmap of parsed headers 1.32 +// 1.33 +protocol.parseHeaders = function parseHeaders(pairs) { 1.34 + var count = pairs.readUInt32BE(0, true), 1.35 + headers = {}; 1.36 + 1.37 + pairs = pairs.slice(4); 1.38 + 1.39 + function readString() { 1.40 + var len = pairs.readUInt32BE(0, true), 1.41 + value = pairs.slice(4, 4 + len); 1.42 + 1.43 + pairs = pairs.slice(4 + len); 1.44 + 1.45 + return value.toString(); 1.46 + } 1.47 + 1.48 + while(count > 0) { 1.49 + headers[readString().replace(/^:/, '')] = readString(); 1.50 + count--; 1.51 + } 1.52 + 1.53 + return headers; 1.54 +}; 1.55 + 1.56 +// 1.57 +// ### function parsesRst frame 1.58 +protocol.parseRst = function parseRst(data) { 1.59 + return { 1.60 + type: 'RST_STREAM', 1.61 + id: data.readUInt32BE(0, true) & 0x7fffffff, 1.62 + status: data.readUInt32BE(4, true) 1.63 + }; 1.64 +}; 1.65 + 1.66 +protocol.parseSettings = function parseSettings(data) { 1.67 + var settings = {}, 1.68 + number = data.readUInt32BE(0, true), 1.69 + idMap = { 1.70 + 1: 'upload_bandwidth', 1.71 + 2: 'download_bandwidth', 1.72 + 3: 'round_trip_time', 1.73 + 4: 'max_concurrent_streams', 1.74 + 5: 'current_cwnd', 1.75 + 6: 'download_retrans_rate', 1.76 + 7: 'initial_window_size', 1.77 + 8: 'client_certificate_vector_size' 1.78 + }; 1.79 + 1.80 + for (var i=0; i<number; i++) { 1.81 + var id = data.readUInt32BE(4 + (i*8), true) & 0x00ffffff, 1.82 + flags = data.readUInt8(4 + (i*8), true), 1.83 + name = idMap[id]; 1.84 + settings[id] = settings[name] = { 1.85 + persist: !!(flags & 0x1), 1.86 + persisted: !!(flags & 0x2), 1.87 + value: data.readUInt32BE(8 + (i*8), true) 1.88 + }; 1.89 + } 1.90 + 1.91 + return { 1.92 + type: 'SETTINGS', 1.93 + settings: settings 1.94 + }; 1.95 +}; 1.96 + 1.97 +protocol.parseGoaway = function parseGoaway(data) { 1.98 + return { 1.99 + type: 'GOAWAY', 1.100 + lastId: data.readUInt32BE(0, true) & 0x7fffffff 1.101 + }; 1.102 +}; 1.103 + 1.104 +protocol.parseWindowUpdate = function parseWindowUpdate(data) { 1.105 + var ret = { 1.106 + type: 'WINDOW_UPDATE', 1.107 + id: data.readUInt32BE(0, true) & 0x7fffffff, 1.108 + delta: data.readUInt32BE(4, true) & 0x7fffffff 1.109 + }; 1.110 + 1.111 + return ret; 1.112 +};