@@ -1178,105 +1178,13 @@ async function connect (client) {
1178
1178
1179
1179
const isH2 = socket . alpnProtocol === 'h2'
1180
1180
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 )
1217
1182
} 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 )
1278
1184
}
1279
1185
1186
+ addListener ( socket , 'close' , onSocketClose )
1187
+
1280
1188
socket [ kCounter ] = 0
1281
1189
socket [ kMaxRequests ] = client [ kMaxRequests ]
1282
1190
socket [ kClient ] = client
@@ -2358,4 +2266,103 @@ function errorRequest (client, request, err) {
2358
2266
}
2359
2267
}
2360
2268
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
+
2361
2368
module . exports = Client
0 commit comments