Skip to content

Commit aadce8e

Browse files
committed
Optimize, clean up net2 net.js and http2.js
1 parent c328f3e commit aadce8e

2 files changed

Lines changed: 201 additions & 150 deletions

File tree

lib/http2.js

Lines changed: 96 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -270,78 +270,6 @@ ClientRequest.prototype.finish = function (responseListener) {
270270
};
271271

272272

273-
function createIncomingMessageStream (socket, cb) {
274-
var incoming, field, value;
275-
276-
socket._parser.onMessageBegin = function () {
277-
incoming = new IncomingMessage(socket);
278-
field = null;
279-
value = null;
280-
};
281-
282-
// Only servers will get URL events.
283-
socket._parser.onURL = function (b, start, len) {
284-
var slice = b.asciiSlice(start, start+len);
285-
if (incoming.url) {
286-
incoming.url += slice;
287-
} else {
288-
// Almost always will branch here.
289-
incoming.url = slice;
290-
}
291-
};
292-
293-
socket._parser.onHeaderField = function (b, start, len) {
294-
var slice = b.asciiSlice(start, start+len).toLowerCase();
295-
if (value) {
296-
incoming._addHeaderLine(field, value);
297-
field = null;
298-
value = null;
299-
}
300-
if (field) {
301-
field += slice;
302-
} else {
303-
field = slice;
304-
}
305-
};
306-
307-
socket._parser.onHeaderValue = function (b, start, len) {
308-
var slice = b.asciiSlice(start, start+len);
309-
if (value) {
310-
value += slice;
311-
} else {
312-
value = slice;
313-
}
314-
};
315-
316-
socket._parser.onHeadersComplete = function (info) {
317-
if (field && value) {
318-
incoming._addHeaderLine(field, value);
319-
}
320-
321-
incoming.httpVersionMajor = info.versionMajor;
322-
incoming.httpVersionMinor = info.versionMinor;
323-
324-
if (info.method) {
325-
// server only
326-
incoming.method = info.method;
327-
} else {
328-
// client only
329-
incoming.statusCode = info.statusCode;
330-
}
331-
332-
cb(incoming, info.shouldKeepAlive);
333-
};
334-
335-
socket._parser.onBody = function (b, start, len) {
336-
incoming.emit("data", b.slice(start, start+len));
337-
};
338-
339-
socket._parser.onMessageComplete = function () {
340-
incoming.emit("eof");
341-
};
342-
}
343-
344-
345273
/* Returns true if the message queue is finished and the socket
346274
* should be closed. */
347275
function flushMessageQueue (socket, queue) {
@@ -368,24 +296,106 @@ function flushMessageQueue (socket, queue) {
368296
}
369297

370298

299+
var parserFreeList = [];
300+
301+
function newParser (type) {
302+
var parser;
303+
if (parserFreeList.length) {
304+
parser = parserFreeList.shift();
305+
parser.reinitialize(type);
306+
} else {
307+
parser = new process.HTTPParser(type);
308+
309+
parser.onMessageBegin = function () {
310+
parser.incoming = new IncomingMessage(parser.socket);
311+
parser.field = null;
312+
parser.value = null;
313+
};
314+
315+
// Only servers will get URL events.
316+
parser.onURL = function (b, start, len) {
317+
var slice = b.asciiSlice(start, start+len);
318+
if (parser.incoming.url) {
319+
parser.incoming.url += slice;
320+
} else {
321+
// Almost always will branch here.
322+
parser.incoming.url = slice;
323+
}
324+
};
325+
326+
parser.onHeaderField = function (b, start, len) {
327+
var slice = b.asciiSlice(start, start+len).toLowerCase();
328+
if (parser.value) {
329+
parser.incoming._addHeaderLine(parser.field, parser.value);
330+
parser.field = null;
331+
parser.value = null;
332+
}
333+
if (parser.field) {
334+
parser.field += slice;
335+
} else {
336+
parser.field = slice;
337+
}
338+
};
339+
340+
parser.onHeaderValue = function (b, start, len) {
341+
var slice = b.asciiSlice(start, start+len);
342+
if (parser.value) {
343+
parser.value += slice;
344+
} else {
345+
parser.value = slice;
346+
}
347+
};
348+
349+
parser.onHeadersComplete = function (info) {
350+
if (parser.field && parser.value) {
351+
parser.incoming._addHeaderLine(parser.field, parser.value);
352+
}
353+
354+
parser.incoming.httpVersionMajor = info.versionMajor;
355+
parser.incoming.httpVersionMinor = info.versionMinor;
356+
357+
if (info.method) {
358+
// server only
359+
parser.incoming.method = info.method;
360+
} else {
361+
// client only
362+
parser.incoming.statusCode = info.statusCode;
363+
}
364+
365+
parser.onIncoming(parser.incoming, info.shouldKeepAlive);
366+
};
367+
368+
parser.onBody = function (b, start, len) {
369+
parser.incoming.emit("data", b.slice(start, start+len));
370+
};
371+
372+
parser.onMessageComplete = function () {
373+
parser.incoming.emit("eof");
374+
};
375+
}
376+
return parser;
377+
}
378+
379+
function freeParser (parser) {
380+
if (parserFreeList.length < 1000) parserFreeList.push(parser);
381+
}
382+
371383
function connectionListener (socket) {
372384
var self = this;
373-
if (socket._parser) throw new Error("socket already has a parser?");
374-
socket._parser = new process.HTTPParser('request');
385+
var parser = newParser('request');
375386
// An array of responses for each socket. In pipelined connections
376387
// we need to keep track of the order they were sent.
377388
var responses = [];
378389

379-
socket.addListener('data', function (d) {
380-
socket._parser.execute(d, 0, d.length);
390+
socket.addListener('dataLite', function (d, start, end) {
391+
parser.execute(d, start, end - start);
381392
});
382393

383394
// is this really needed?
384395
socket.addListener('eof', function () {
385-
socket._parser.finish();
396+
parser.finish();
386397
// unref the parser for easy gc
387-
socket._parser.host = null;
388-
socket._parser = null;
398+
freeParser(parser);
389399

390400
if (responses.length == 0) {
391401
socket.close();
@@ -394,10 +404,14 @@ function connectionListener (socket) {
394404
}
395405
});
396406

397-
createIncomingMessageStream(socket, function (incoming, shouldKeepAlive) {
407+
parser.socket = socket;
408+
// The following callback is issued after the headers have been read on a
409+
// new message. In this callback we setup the response object and pass it
410+
// to the user.
411+
parser.onIncoming = function (incoming, shouldKeepAlive) {
398412
var req = incoming;
399-
400413
var res = new ServerResponse(req);
414+
401415
res.shouldKeepAlive = shouldKeepAlive;
402416
res.addListener('flush', function () {
403417
if (flushMessageQueue(socket, responses)) {
@@ -407,7 +421,7 @@ function connectionListener (socket) {
407421
responses.push(res);
408422

409423
self.emit('request', req, res);
410-
});
424+
};
411425
}
412426

413427

0 commit comments

Comments
 (0)