| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 | 'use strict';var NodeHTTPParser = require('http-parser-js').HTTPParser,    Buffer         = require('safe-buffer').Buffer;var TYPES = {  request:  NodeHTTPParser.REQUEST  || 'request',  response: NodeHTTPParser.RESPONSE || 'response'};var HttpParser = function(type) {  this._type     = type;  this._parser   = new NodeHTTPParser(TYPES[type]);  this._complete = false;  this.headers   = {};  var current = null,      self    = this;  this._parser.onHeaderField = function(b, start, length) {    current = b.toString('utf8', start, start + length).toLowerCase();  };  this._parser.onHeaderValue = function(b, start, length) {    var value = b.toString('utf8', start, start + length);    if (self.headers.hasOwnProperty(current))      self.headers[current] += ', ' + value;    else      self.headers[current] = value;  };  this._parser.onHeadersComplete = this._parser[NodeHTTPParser.kOnHeadersComplete] =  function(majorVersion, minorVersion, headers, method, pathname, statusCode) {    var info = arguments[0];    if (typeof info === 'object') {      method     = info.method;      pathname   = info.url;      statusCode = info.statusCode;      headers    = info.headers;    }    self.method     = (typeof method === 'number') ? HttpParser.METHODS[method] : method;    self.statusCode = statusCode;    self.url        = pathname;    if (!headers) return;    for (var i = 0, n = headers.length, key, value; i < n; i += 2) {      key   = headers[i].toLowerCase();      value = headers[i+1];      if (self.headers.hasOwnProperty(key))        self.headers[key] += ', ' + value;      else        self.headers[key] = value;    }    self._complete = true;  };};HttpParser.METHODS = {  0:  'DELETE',  1:  'GET',  2:  'HEAD',  3:  'POST',  4:  'PUT',  5:  'CONNECT',  6:  'OPTIONS',  7:  'TRACE',  8:  'COPY',  9:  'LOCK',  10: 'MKCOL',  11: 'MOVE',  12: 'PROPFIND',  13: 'PROPPATCH',  14: 'SEARCH',  15: 'UNLOCK',  16: 'BIND',  17: 'REBIND',  18: 'UNBIND',  19: 'ACL',  20: 'REPORT',  21: 'MKACTIVITY',  22: 'CHECKOUT',  23: 'MERGE',  24: 'M-SEARCH',  25: 'NOTIFY',  26: 'SUBSCRIBE',  27: 'UNSUBSCRIBE',  28: 'PATCH',  29: 'PURGE',  30: 'MKCALENDAR',  31: 'LINK',  32: 'UNLINK'};var VERSION = process.version  ? process.version.match(/[0-9]+/g).map(function(n) { return parseInt(n, 10) })  : [];if (VERSION[0] === 0 && VERSION[1] === 12) {  HttpParser.METHODS[16] = 'REPORT';  HttpParser.METHODS[17] = 'MKACTIVITY';  HttpParser.METHODS[18] = 'CHECKOUT';  HttpParser.METHODS[19] = 'MERGE';  HttpParser.METHODS[20] = 'M-SEARCH';  HttpParser.METHODS[21] = 'NOTIFY';  HttpParser.METHODS[22] = 'SUBSCRIBE';  HttpParser.METHODS[23] = 'UNSUBSCRIBE';  HttpParser.METHODS[24] = 'PATCH';  HttpParser.METHODS[25] = 'PURGE';}HttpParser.prototype.isComplete = function() {  return this._complete;};HttpParser.prototype.parse = function(chunk) {  var consumed = this._parser.execute(chunk, 0, chunk.length);  if (typeof consumed !== 'number') {    this.error     = consumed;    this._complete = true;    return;  }  if (this._complete)    this.body = (consumed < chunk.length)              ? chunk.slice(consumed)              : Buffer.alloc(0);};module.exports = HttpParser;
 |