@ -34,7 +34,7 @@ const continueExpression = common.continueExpression;
const chunkExpression = common . chunkExpression ;
const httpSocketSetup = common . httpSocketSetup ;
const OutgoingMessage = require ( '_http_outgoing' ) . OutgoingMessage ;
const outHeadersKey = require ( 'internal/http' ) . outHeadersKey ;
const { outHeadersKey , ondrain } = require ( 'internal/http' ) ;
const STATUS_CODES = {
100 : 'Continue' ,
@ -296,7 +296,7 @@ function connectionListener(socket) {
// otherwise, destroy on timeout by default
if ( this . timeout )
socket . setTimeout ( this . timeout ) ;
socket . on ( 'timeout' , socketOnTimeout . bind ( undefined , this , socket ) ) ;
socket . on ( 'timeout' , socketOnTimeout ) ;
var parser = parsers . alloc ( ) ;
parser . reinitialize ( HTTPParser . REQUEST ) ;
@ -314,9 +314,9 @@ function connectionListener(socket) {
var state = {
onData : null ,
onError : null ,
onEnd : null ,
onClose : null ,
onDrain : null ,
outgoing : [ ] ,
incoming : [ ] ,
// `outgoingData` is an approximate amount of bytes queued through all
@ -326,21 +326,20 @@ function connectionListener(socket) {
outgoingData : 0
} ;
state . onData = socketOnData . bind ( undefined , this , socket , parser , state ) ;
state . onError = socketOnError . bind ( undefined , this , socket , state ) ;
state . onEnd = socketOnEnd . bind ( undefined , this , socket , parser , state ) ;
state . onClose = socketOnClose . bind ( undefined , socket , state ) ;
state . onDrain = socketOnDrain . bind ( undefined , socket , state ) ;
socket . on ( 'data' , state . onData ) ;
socket . on ( 'error' , state . o nError ) ;
socket . on ( 'error' , socketO nError ) ;
socket . on ( 'end' , state . onEnd ) ;
socket . on ( 'close' , state . onClose ) ;
socket . on ( 'drain' , state . onDrain ) ;
parser . onIncoming = parserOnIncoming . bind ( undefined , this , socket , state ) ;
// We are consuming socket, so it won't get any actual data
socket . on ( 'resume' , onSocketResume ) ;
socket . on ( 'pause' , onSocketPause ) ;
socket . on ( 'drain' , socketOnDrain . bind ( undefined , socket , state ) ) ;
// Override on to unconsume on `data`, `readable` listeners
socket . on = socketOnWrap ;
@ -378,15 +377,15 @@ function socketOnDrain(socket, state) {
}
}
function socketOnTimeout ( server , socket ) {
var req = socket . parser && socket . parser . incoming ;
var reqTimeout = req && ! req . complete && req . emit ( 'timeout' , socket ) ;
var res = socket . _ httpMessage ;
var resTimeout = res && res . emit ( 'timeout' , socket ) ;
var serverTimeout = server . emit ( 'timeout' , socket ) ;
function socketOnTimeout ( ) {
var req = this . parser && this . parser . incoming ;
var reqTimeout = req && ! req . complete && req . emit ( 'timeout' , this ) ;
var res = this . _ httpMessage ;
var resTimeout = res && res . emit ( 'timeout' , this ) ;
var serverTimeout = this . server . emit ( 'timeout' , this ) ;
if ( ! reqTimeout && ! resTimeout && ! serverTimeout )
socket . destroy ( ) ;
this . destroy ( ) ;
}
function socketOnClose ( socket , state ) {
@ -413,7 +412,7 @@ function socketOnEnd(server, socket, parser, state) {
if ( ret instanceof Error ) {
debug ( 'parse error' ) ;
state . onError ( ret ) ;
socketOnError . call ( socket , ret ) ;
return ;
}
@ -443,19 +442,19 @@ function onParserExecute(server, socket, parser, state, ret, d) {
onParserExecuteCommon ( server , socket , parser , state , ret , undefined ) ;
}
function socketOnError ( server , socket , state , e ) {
function socketOnError ( e ) {
// Ignore further errors
socket . removeListener ( 'error' , state . o nError ) ;
socket . on ( 'error' , ( ) => { } ) ;
this . removeListener ( 'error' , socketO nError ) ;
this . on ( 'error' , ( ) => { } ) ;
if ( ! server . emit ( 'clientError' , e , socket ) )
socket . destroy ( e ) ;
if ( ! this . server . emit ( 'clientError' , e , this ) )
this . destroy ( e ) ;
}
function onParserExecuteCommon ( server , socket , parser , state , ret , d ) {
if ( ret instanceof Error ) {
debug ( 'parse error' ) ;
state . onError ( ret ) ;
socketOnError . call ( socket , ret ) ;
} else if ( parser . incoming && parser . incoming . upgrade ) {
// Upgrade or CONNECT
var bytesParsed = ret ;
@ -468,6 +467,8 @@ function onParserExecuteCommon(server, socket, parser, state, ret, d) {
socket . removeListener ( 'data' , state . onData ) ;
socket . removeListener ( 'end' , state . onEnd ) ;
socket . removeListener ( 'close' , state . onClose ) ;
socket . removeListener ( 'drain' , state . onDrain ) ;
socket . removeListener ( 'drain' , ondrain ) ;
unconsume ( parser , socket ) ;
parser . finish ( ) ;
freeParser ( parser , req , null ) ;