diff --git a/lib/client.js b/lib/client.js index 107e63bf296..a50ff846725 100644 --- a/lib/client.js +++ b/lib/client.js @@ -1107,8 +1107,7 @@ async function connect (client) { assert(socket) - const isH2 = socket.alpnProtocol === 'h2' - if (isH2) { + if (socket.alpnProtocol === 'h2') { if (!h2ExperimentalWarned) { h2ExperimentalWarned = true process.emitWarning('H2 support is experimental, expect them to change at any time.', { @@ -1122,32 +1121,30 @@ async function connect (client) { }) client[kHTTPConnVersion] = 'h2' - session.on('error', err => { + session.on('error', function (err) { assert(err.code !== 'ERR_TLS_CERT_ALTNAME_INVALID') - session[kError] = err + this[kError] = err - onError(session[kClient], err) + onError(this[kClient], err) }) - session.on('frameError', (type, code, id) => { + session.on('frameError', function (type, code, id) { if (id === 0) { const err = new InformationalError(`HTTP/2: "frameError" received - type ${type}, code ${code}`) - util.destroy(session, err) + util.destroy(this, err) util.destroy(socket, err) } }) - session.on('end', () => { + session.on('end', function () { const err = new SocketError('other side closed') - util.destroy(session, err) + util.destroy(this, err) util.destroy(socket, err) }) - session.on('goaway', (code) => { - // TODO (fix): How is this different from onSOcketClose? - - session[kError] = new InformationalError(`HTTP/2: "GOAWAY" frame received with code ${code}`) - + session.on('goaway', function (code) { + this[kError] = new InformationalError(`HTTP/2: "GOAWAY" frame received with code ${code}`) onSocketClose.call(session) }) + session.on('close', onSocketClose) session.unref() client[kSocket] = session @@ -1157,15 +1154,15 @@ async function connect (client) { llhttpPromise = null } - const parser = new Parser(client, socket, llhttpInstance) - socket[kNoRef] = false socket[kWriting] = false socket[kReset] = false socket[kBlocking] = false - socket[kParser] = parser + socket[kParser] = new Parser(client, socket, llhttpInstance) + + addListener(socket, 'error', function (err) { + const { [kParser]: parser } = this - addListener(socket, 'error', err => { // On Mac OS, we get an ECONNRESET even if there is a full body to be forwarded // to the user. if (err.code === 'ECONNRESET' && parser.statusCode && !parser.shouldKeepAlive) { @@ -1181,30 +1178,37 @@ async function connect (client) { onError(this[kClient], err) }) - addListener(socket, 'readable', () => { + addListener(socket, 'readable', function () { + const { [kParser]: parser } = this + if (parser) { parser.readMore() } }) - addListener(socket, 'end', () => { + addListener(socket, 'end', function () { + const { [kParser]: parser } = this + if (parser && parser.statusCode && !parser.shouldKeepAlive) { // We treat all incoming data so far as a valid response. parser.onMessageComplete() - return + } else { + util.destroy(this, new SocketError('other side closed', util.getSocketInfo(this))) } - - util.destroy(this, new SocketError('other side closed', util.getSocketInfo(this))) }) - addListener(socket, 'close', () => { - if (!socket[kError] && parser.statusCode && !parser.shouldKeepAlive) { + addListener(socket, 'close', function () { + const { [kParser]: parser } = this + + if (!this[kError] && parser.statusCode && !parser.shouldKeepAlive) { // We treat all incoming data so far as a valid response. parser.onMessageComplete() } - socket[kParser].destroy() - socket[kParser] = null + this[kParser].destroy() + this[kParser] = null + + onSocketClose() }) client[kSocket] = socket @@ -1215,8 +1219,6 @@ async function connect (client) { socket[kClient] = client socket[kError] = null - addListener(socket, 'close', onSocketClose) - if (channels.connected.hasSubscribers) { channels.connected.publish({ connectParams: {