Skip to content

Commit 46b3a8f

Browse files
committed
refactor: split h1 and h2 connect into own methods
1 parent 9ec64a0 commit 46b3a8f

File tree

1 file changed

+103
-96
lines changed

1 file changed

+103
-96
lines changed

lib/dispatcher/client.js

Lines changed: 103 additions & 96 deletions
Original file line numberDiff line numberDiff line change
@@ -1178,105 +1178,13 @@ async function connect (client) {
11781178

11791179
const isH2 = socket.alpnProtocol === 'h2'
11801180
if (isH2) {
1181-
if (!h2ExperimentalWarned) {
1182-
h2ExperimentalWarned = true
1183-
process.emitWarning('H2 support is experimental, expect them to change at any time.', {
1184-
code: 'UNDICI-H2'
1185-
})
1186-
}
1187-
1188-
const session = http2.connect(client[kUrl], {
1189-
createConnection: () => socket,
1190-
peerMaxConcurrentStreams: client[kHTTP2SessionState].maxConcurrentStreams
1191-
})
1192-
1193-
client[kHTTPConnVersion] = 'h2'
1194-
session[kClient] = client
1195-
session[kSocket] = socket
1196-
session.on('error', onHttp2SessionError)
1197-
session.on('frameError', onHttp2FrameError)
1198-
session.on('end', onHttp2SessionEnd)
1199-
session.on('goaway', onHTTP2GoAway)
1200-
session.on('close', onSocketClose)
1201-
session.unref()
1202-
1203-
client[kHTTP2Session] = session
1204-
socket[kHTTP2Session] = session
1205-
1206-
addListener(socket, 'error', function (err) {
1207-
assert(err.code !== 'ERR_TLS_CERT_ALTNAME_INVALID')
1208-
1209-
this[kError] = err
1210-
1211-
onError(this[kClient], err)
1212-
})
1213-
addListener(socket, 'end', function () {
1214-
util.destroy(this, new SocketError('other side closed', util.getSocketInfo(this)))
1215-
})
1216-
addListener(socket, 'close', onSocketClose)
1181+
await onHTTP2Connect(client, socket)
12171182
} else {
1218-
if (!llhttpInstance) {
1219-
llhttpInstance = await llhttpPromise
1220-
llhttpPromise = null
1221-
}
1222-
1223-
socket[kNoRef] = false
1224-
socket[kWriting] = false
1225-
socket[kReset] = false
1226-
socket[kBlocking] = false
1227-
socket[kParser] = new Parser(client, socket, llhttpInstance)
1228-
1229-
addListener(socket, 'error', function (err) {
1230-
const { [kParser]: parser } = this
1231-
1232-
assert(err.code !== 'ERR_TLS_CERT_ALTNAME_INVALID')
1233-
1234-
// On Mac OS, we get an ECONNRESET even if there is a full body to be forwarded
1235-
// to the user.
1236-
if (err.code === 'ECONNRESET' && parser.statusCode && !parser.shouldKeepAlive) {
1237-
// We treat all incoming data so for as a valid response.
1238-
parser.onMessageComplete()
1239-
return
1240-
}
1241-
1242-
this[kError] = err
1243-
1244-
onError(this[kClient], err)
1245-
})
1246-
addListener(socket, 'readable', function () {
1247-
const { [kParser]: parser } = this
1248-
if (parser) {
1249-
parser.readMore()
1250-
}
1251-
})
1252-
addListener(socket, 'end', function () {
1253-
const { [kParser]: parser } = this
1254-
1255-
if (parser.statusCode && !parser.shouldKeepAlive) {
1256-
// We treat all incoming data so far as a valid response.
1257-
parser.onMessageComplete()
1258-
return
1259-
}
1260-
1261-
util.destroy(this, new SocketError('other side closed', util.getSocketInfo(this)))
1262-
})
1263-
addListener(socket, 'close', function () {
1264-
const { [kParser]: parser } = this
1265-
1266-
if (parser) {
1267-
if (!this[kError] && parser.statusCode && !parser.shouldKeepAlive) {
1268-
// We treat all incoming data so far as a valid response.
1269-
parser.onMessageComplete()
1270-
}
1271-
1272-
this[kParser].destroy()
1273-
this[kParser] = null
1274-
}
1275-
1276-
onSocketClose.call(this)
1277-
})
1183+
await onHTTP1Connect(client, socket)
12781184
}
12791185

1186+
addListener(socket, 'close', onSocketClose)
1187+
12801188
socket[kCounter] = 0
12811189
socket[kMaxRequests] = client[kMaxRequests]
12821190
socket[kClient] = client
@@ -2358,4 +2266,103 @@ function errorRequest (client, request, err) {
23582266
}
23592267
}
23602268

2269+
async function onHTTP1Connect (client, socket) {
2270+
if (!llhttpInstance) {
2271+
llhttpInstance = await llhttpPromise
2272+
llhttpPromise = null
2273+
}
2274+
2275+
socket[kNoRef] = false
2276+
socket[kWriting] = false
2277+
socket[kReset] = false
2278+
socket[kBlocking] = false
2279+
socket[kParser] = new Parser(client, socket, llhttpInstance)
2280+
2281+
addListener(socket, 'error', function (err) {
2282+
const { [kParser]: parser } = this
2283+
2284+
assert(err.code !== 'ERR_TLS_CERT_ALTNAME_INVALID')
2285+
2286+
// On Mac OS, we get an ECONNRESET even if there is a full body to be forwarded
2287+
// to the user.
2288+
if (err.code === 'ECONNRESET' && parser.statusCode && !parser.shouldKeepAlive) {
2289+
// We treat all incoming data so for as a valid response.
2290+
parser.onMessageComplete()
2291+
return
2292+
}
2293+
2294+
this[kError] = err
2295+
2296+
onError(this[kClient], err)
2297+
})
2298+
addListener(socket, 'readable', function () {
2299+
const { [kParser]: parser } = this
2300+
if (parser) {
2301+
parser.readMore()
2302+
}
2303+
})
2304+
addListener(socket, 'end', function () {
2305+
const { [kParser]: parser } = this
2306+
2307+
if (parser.statusCode && !parser.shouldKeepAlive) {
2308+
// We treat all incoming data so far as a valid response.
2309+
parser.onMessageComplete()
2310+
return
2311+
}
2312+
2313+
util.destroy(this, new SocketError('other side closed', util.getSocketInfo(this)))
2314+
})
2315+
addListener(socket, 'close', function () {
2316+
const { [kParser]: parser } = this
2317+
2318+
if (parser) {
2319+
if (!this[kError] && parser.statusCode && !parser.shouldKeepAlive) {
2320+
// We treat all incoming data so far as a valid response.
2321+
parser.onMessageComplete()
2322+
}
2323+
2324+
this[kParser].destroy()
2325+
this[kParser] = null
2326+
}
2327+
})
2328+
}
2329+
2330+
async function onHTTP2Connect (client, socket) {
2331+
if (!h2ExperimentalWarned) {
2332+
h2ExperimentalWarned = true
2333+
process.emitWarning('H2 support is experimental, expect them to change at any time.', {
2334+
code: 'UNDICI-H2'
2335+
})
2336+
}
2337+
2338+
const session = http2.connect(client[kUrl], {
2339+
createConnection: () => socket,
2340+
peerMaxConcurrentStreams: client[kHTTP2SessionState].maxConcurrentStreams
2341+
})
2342+
2343+
client[kHTTPConnVersion] = 'h2'
2344+
session[kClient] = client
2345+
session[kSocket] = socket
2346+
session.on('error', onHttp2SessionError)
2347+
session.on('frameError', onHttp2FrameError)
2348+
session.on('end', onHttp2SessionEnd)
2349+
session.on('goaway', onHTTP2GoAway)
2350+
session.on('close', onSocketClose)
2351+
session.unref()
2352+
2353+
client[kHTTP2Session] = session
2354+
socket[kHTTP2Session] = session
2355+
2356+
addListener(socket, 'error', function (err) {
2357+
assert(err.code !== 'ERR_TLS_CERT_ALTNAME_INVALID')
2358+
2359+
this[kError] = err
2360+
2361+
onError(this[kClient], err)
2362+
})
2363+
addListener(socket, 'end', function () {
2364+
util.destroy(this, new SocketError('other side closed', util.getSocketInfo(this)))
2365+
})
2366+
}
2367+
23612368
module.exports = Client

0 commit comments

Comments
 (0)