@@ -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. */
347275function 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+
371383function 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