Skip to content

Commit

Permalink
WIP
Browse files Browse the repository at this point in the history
  • Loading branch information
ronag committed Feb 23, 2024
1 parent 3833c4e commit be05f4b
Showing 1 changed file with 31 additions and 29 deletions.
60 changes: 31 additions & 29 deletions lib/client.js
Original file line number Diff line number Diff line change
Expand Up @@ -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.', {
Expand All @@ -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
Expand All @@ -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) {
Expand All @@ -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
Expand All @@ -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: {
Expand Down

0 comments on commit be05f4b

Please sign in to comment.