3 var NodeHTTPParser = process.binding('http_parser').HTTPParser,
4 version = NodeHTTPParser.RESPONSE ? 6 : 4;
6 var HttpParser = function(type) {
7 if (type === 'request')
8 this._parser = new NodeHTTPParser(NodeHTTPParser.REQUEST || 'request');
10 this._parser = new NodeHTTPParser(NodeHTTPParser.RESPONSE || 'response');
13 this._complete = false;
19 this._parser.onHeaderField = function(b, start, length) {
20 current = b.toString('utf8', start, start + length).toLowerCase();
23 this._parser.onHeaderValue = function(b, start, length) {
24 var value = b.toString('utf8', start, start + length);
26 if (self.headers.hasOwnProperty(current))
27 self.headers[current] += ', ' + value;
29 self.headers[current] = value;
32 this._parser.onHeadersComplete = this._parser[NodeHTTPParser.kOnHeadersComplete] =
33 function(majorVersion, minorVersion, headers, method, pathname, statusCode) {
34 var info = arguments[0];
36 if (typeof info === 'object') {
39 statusCode = info.statusCode;
40 headers = info.headers;
43 self.method = (typeof method === 'number') ? HttpParser.METHODS[method] : method;
44 self.statusCode = statusCode;
49 for (var i = 0, n = headers.length, key, value; i < n; i += 2) {
50 key = headers[i].toLowerCase();
52 if (self.headers.hasOwnProperty(key))
53 self.headers[key] += ', ' + value;
55 self.headers[key] = value;
58 self._complete = true;
62 HttpParser.METHODS = {
86 HttpParser.prototype.isComplete = function() {
87 return this._complete;
90 HttpParser.prototype.parse = function(chunk) {
91 var offset = (version < 6) ? 1 : 0,
92 consumed = this._parser.execute(chunk, 0, chunk.length) + offset;
95 this.body = (consumed < chunk.length)
96 ? chunk.slice(consumed)
100 module.exports = HttpParser;