|
1 var protocol = exports; |
|
2 |
|
3 // |
|
4 // ### function parseSynHead (type, flags, data) |
|
5 // #### @type {Number} Frame type |
|
6 // #### @flags {Number} Frame flags |
|
7 // #### @data {Buffer} input data |
|
8 // Returns parsed syn_* frame's head |
|
9 // |
|
10 protocol.parseSynHead = function parseSynHead(type, flags, data) { |
|
11 var stream = type === 0x01; |
|
12 |
|
13 return { |
|
14 type: stream ? 'SYN_STREAM' : 'SYN_REPLY', |
|
15 id: data.readUInt32BE(0, true) & 0x7fffffff, |
|
16 version: 2, |
|
17 associated: stream ? data.readUInt32BE(4, true) & 0x7fffffff : 0, |
|
18 priority: stream ? data[8] >> 6 : 0, |
|
19 fin: (flags & 0x01) === 0x01, |
|
20 unidir: (flags & 0x02) === 0x02, |
|
21 _offset: stream ? 10 : 6 |
|
22 }; |
|
23 }; |
|
24 |
|
25 // |
|
26 // ### function parseHeaders (pairs) |
|
27 // #### @pairs {Buffer} header pairs |
|
28 // Returns hashmap of parsed headers |
|
29 // |
|
30 protocol.parseHeaders = function parseHeaders(pairs) { |
|
31 var count = pairs.readUInt16BE(0, true), |
|
32 headers = {}; |
|
33 |
|
34 pairs = pairs.slice(2); |
|
35 |
|
36 function readString() { |
|
37 var len = pairs.readUInt16BE(0, true), |
|
38 value = pairs.slice(2, 2 + len); |
|
39 |
|
40 pairs = pairs.slice(2 + len); |
|
41 |
|
42 return value.toString(); |
|
43 } |
|
44 |
|
45 while(count > 0) { |
|
46 headers[readString()] = readString(); |
|
47 count--; |
|
48 } |
|
49 |
|
50 return headers; |
|
51 }; |
|
52 |
|
53 // |
|
54 // ### function parsesRst frame |
|
55 protocol.parseRst = function parseRst(data) { |
|
56 return { |
|
57 type: 'RST_STREAM', |
|
58 id: data.readUInt32BE(0, true) & 0x7fffffff, |
|
59 status: data.readUInt32BE(4, true) |
|
60 }; |
|
61 }; |
|
62 |
|
63 protocol.parseGoaway = function parseGoaway(data) { |
|
64 return { |
|
65 type: 'GOAWAY', |
|
66 lastId: data.readUInt32BE(0, true) & 0x7fffffff |
|
67 }; |
|
68 }; |