diff options
author | Timothy J Fontaine <tjfontaine@gmail.com> | 2013-04-11 15:15:41 -0700 |
---|---|---|
committer | Ben Noordhuis <info@bnoordhuis.nl> | 2013-04-17 00:08:28 +0200 |
commit | bb56489f21da9d668c279edb45d6a90d03517a30 (patch) | |
tree | 75ba40840ef03fb020179a62c7f3df5bf394c4ea /lib/http.js | |
parent | 5909a9c9bddddaab91693d18a8840d8b300bbc28 (diff) | |
download | node-new-bb56489f21da9d668c279edb45d6a90d03517a30.tar.gz |
http: move parsers into _http_common.js
Diffstat (limited to 'lib/http.js')
-rw-r--r-- | lib/http.js | 183 |
1 files changed, 3 insertions, 180 deletions
diff --git a/lib/http.js b/lib/http.js index af57425ef6..15fff690bf 100644 --- a/lib/http.js +++ b/lib/http.js @@ -24,7 +24,6 @@ var net = require('net'); var Stream = require('stream'); var url = require('url'); var EventEmitter = require('events').EventEmitter; -var FreeList = require('freelist').FreeList; var HTTPParser = process.binding('http_parser').HTTPParser; var assert = require('assert').ok; @@ -36,162 +35,12 @@ if (process.env.NODE_DEBUG && /http/.test(process.env.NODE_DEBUG)) { } var incoming = require('_http_incoming'); -var readStart = incoming.readStart; -var readStop = incoming.readStop; var IncomingMessage = exports.IncomingMessage = incoming.IncomingMessage; -// Only called in the slow case where slow means -// that the request headers were either fragmented -// across multiple TCP packets or too large to be -// processed in a single run. This method is also -// called to process trailing HTTP headers. -function parserOnHeaders(headers, url) { - // Once we exceeded headers limit - stop collecting them - if (this.maxHeaderPairs <= 0 || - this._headers.length < this.maxHeaderPairs) { - this._headers = this._headers.concat(headers); - } - this._url += url; -} - -// info.headers and info.url are set only if .onHeaders() -// has not been called for this request. -// -// info.url is not set for response parsers but that's not -// applicable here since all our parsers are request parsers. -function parserOnHeadersComplete(info) { - var parser = this; - var headers = info.headers; - var url = info.url; - - if (!headers) { - headers = parser._headers; - parser._headers = []; - } - - if (!url) { - url = parser._url; - parser._url = ''; - } - - parser.incoming = new IncomingMessage(parser.socket); - parser.incoming.httpVersionMajor = info.versionMajor; - parser.incoming.httpVersionMinor = info.versionMinor; - parser.incoming.httpVersion = info.versionMajor + '.' + info.versionMinor; - parser.incoming.url = url; - - var n = headers.length; - - // If parser.maxHeaderPairs <= 0 - assume that there're no limit - if (parser.maxHeaderPairs > 0) { - n = Math.min(n, parser.maxHeaderPairs); - } - - for (var i = 0; i < n; i += 2) { - var k = headers[i]; - var v = headers[i + 1]; - parser.incoming._addHeaderLine(k, v); - } - - - if (info.method) { - // server only - parser.incoming.method = info.method; - } else { - // client only - parser.incoming.statusCode = info.statusCode; - // CHECKME dead code? we're always a request parser - } - - parser.incoming.upgrade = info.upgrade; - - var skipBody = false; // response to HEAD or CONNECT - - if (!info.upgrade) { - // For upgraded connections and CONNECT method request, - // we'll emit this after parser.execute - // so that we can capture the first part of the new protocol - skipBody = parser.onIncoming(parser.incoming, info.shouldKeepAlive); - } - - return skipBody; -} - -// XXX This is a mess. -// TODO: http.Parser should be a Writable emits request/response events. -function parserOnBody(b, start, len) { - var parser = this; - var stream = parser.incoming; - - // if the stream has already been removed, then drop it. - if (!stream) - return; - var socket = stream.socket; - - // pretend this was the result of a stream._read call. - if (len > 0 && !stream._dumped) { - var slice = b.slice(start, start + len); - var ret = stream.push(slice); - if (!ret) - readStop(socket); - } -} - -function parserOnMessageComplete() { - var parser = this; - var stream = parser.incoming; - - if (stream) { - stream.complete = true; - // Emit any trailing headers. - var headers = parser._headers; - if (headers) { - for (var i = 0, n = headers.length; i < n; i += 2) { - var k = headers[i]; - var v = headers[i + 1]; - parser.incoming._addHeaderLine(k, v); - } - parser._headers = []; - parser._url = ''; - } - - if (!stream.upgrade) - // For upgraded connections, also emit this after parser.execute - stream.push(null); - } - - if (stream && !parser.incoming._pendings.length) { - // For emit end event - stream.push(null); - } - - if (parser.socket.readable) { - // force to read the next incoming message - readStart(parser.socket); - } -} - - -var parsers = new FreeList('parsers', 1000, function() { - var parser = new HTTPParser(HTTPParser.REQUEST); - - parser._headers = []; - parser._url = ''; - - // Only called in the slow case where slow means - // that the request headers were either fragmented - // across multiple TCP packets or too large to be - // processed in a single run. This method is also - // called to process trailing HTTP headers. - parser.onHeaders = parserOnHeaders; - parser.onHeadersComplete = parserOnHeadersComplete; - parser.onBody = parserOnBody; - parser.onMessageComplete = parserOnMessageComplete; - - return parser; -}); -exports.parsers = parsers; +var common = require('_http_common'); +var parsers = exports.parsers = common.parsers; +var freeParser = common.freeParser; var CRLF = '\r\n'; @@ -1138,32 +987,6 @@ function createHangUpError() { return error; } -// Free the parser and also break any links that it -// might have to any other things. -// TODO: All parser data should be attached to a -// single object, so that it can be easily cleaned -// up by doing `parser.data = {}`, which should -// be done in FreeList.free. `parsers.free(parser)` -// should be all that is needed. -function freeParser(parser, req) { - if (parser) { - parser._headers = []; - parser.onIncoming = null; - if (parser.socket) { - parser.socket.onend = null; - parser.socket.ondata = null; - parser.socket.parser = null; - } - parser.socket = null; - parser.incoming = null; - parsers.free(parser); - parser = null; - } - if (req) { - req.parser = null; - } -} - function socketCloseListener() { var socket = this; |