1'use strict'; 2const common = require('../common'); 3 4if (!common.hasCrypto) 5 common.skip('missing crypto'); 6 7const http2 = require('http2'); 8const net = require('net'); 9 10const { 11 HTTP2_HEADER_PATH, 12} = http2.constants; 13 14// Create a normal session, as a control case 15function normalSession(cb) { 16 http2.connect('https://google.com', (clientSession) => { 17 let error = null; 18 const req = clientSession.request({ [HTTP2_HEADER_PATH]: '/' }); 19 req.on('error', (err) => { 20 error = err; 21 }); 22 req.on('response', (_headers) => { 23 req.on('data', (_chunk) => { }); 24 req.on('end', () => { 25 clientSession.close(); 26 return cb(error); 27 }); 28 }); 29 }); 30} 31normalSession(common.mustSucceed()); 32 33// Create a session using a socket that has not yet finished connecting 34function socketNotFinished(done) { 35 const socket2 = net.connect(443, 'google.com'); 36 http2.connect('https://google.com', { socket2 }, (clientSession) => { 37 let error = null; 38 const req = clientSession.request({ [HTTP2_HEADER_PATH]: '/' }); 39 req.on('error', (err) => { 40 error = err; 41 }); 42 req.on('response', (_headers) => { 43 req.on('data', (_chunk) => { }); 44 req.on('end', () => { 45 clientSession.close(); 46 socket2.destroy(); 47 return done(error); 48 }); 49 }); 50 }); 51} 52socketNotFinished(common.mustSucceed()); 53 54// Create a session using a socket that has finished connecting 55function socketFinished(done) { 56 const socket = net.connect(443, 'google.com', () => { 57 http2.connect('https://google.com', { socket }, (clientSession) => { 58 let error = null; 59 const req = clientSession.request({ [HTTP2_HEADER_PATH]: '/' }); 60 req.on('error', (err) => { 61 error = err; 62 }); 63 req.on('response', (_headers) => { 64 req.on('data', (_chunk) => { }); 65 req.on('end', () => { 66 clientSession.close(); 67 return done(error); 68 }); 69 }); 70 }); 71 }); 72} 73socketFinished(common.mustSucceed()); 74