revise installing a license file
[platform/upstream/nodejs.git] / test / parallel / test-http-parser-bad-ref.js
1 'use strict';
2 // Run this program with valgrind or efence with --expose_gc to expose the
3 // problem.
4
5 // Flags: --expose_gc
6
7 require('../common');
8 var assert = require('assert');
9 var HTTPParser = process.binding('http_parser').HTTPParser;
10
11 var kOnHeaders = HTTPParser.kOnHeaders | 0;
12 var kOnHeadersComplete = HTTPParser.kOnHeadersComplete | 0;
13 var kOnBody = HTTPParser.kOnBody | 0;
14 var kOnMessageComplete = HTTPParser.kOnMessageComplete | 0;
15
16 var headersComplete = 0;
17 var messagesComplete = 0;
18
19 function flushPool() {
20   new Buffer(Buffer.poolSize - 1);
21   gc();
22 }
23
24 function demoBug(part1, part2) {
25   flushPool();
26
27   var parser = new HTTPParser('REQUEST');
28
29   parser.headers = [];
30   parser.url = '';
31
32   parser[kOnHeaders] = function(headers, url) {
33     parser.headers = parser.headers.concat(headers);
34     parser.url += url;
35   };
36
37   parser[kOnHeadersComplete] = function(info) {
38     headersComplete++;
39     console.log('url', info.url);
40   };
41
42   parser[kOnBody] = function(b, start, len) { };
43
44   parser[kOnMessageComplete] = function() {
45     messagesComplete++;
46   };
47
48
49   // We use a function to eliminate references to the Buffer b
50   // We want b to be GCed. The parser will hold a bad reference to it.
51   (function() {
52     var b = Buffer(part1);
53     flushPool();
54
55     console.log('parse the first part of the message');
56     parser.execute(b, 0, b.length);
57   })();
58
59   flushPool();
60
61   (function() {
62     var b = Buffer(part2);
63
64     console.log('parse the second part of the message');
65     parser.execute(b, 0, b.length);
66     parser.finish();
67   })();
68
69   flushPool();
70 }
71
72
73 demoBug('POST /1', '/22 HTTP/1.1\r\n' +
74         'Content-Type: text/plain\r\n' +
75         'Content-Length: 4\r\n\r\n' +
76         'pong');
77
78 demoBug('POST /1/22 HTTP/1.1\r\n' +
79         'Content-Type: tex', 't/plain\r\n' +
80         'Content-Length: 4\r\n\r\n' +
81         'pong');
82
83 process.on('exit', function() {
84   assert.equal(2, headersComplete);
85   assert.equal(2, messagesComplete);
86   console.log('done!');
87 });