| 'use strict'; |
| |
| const common = require('../common'); |
| if (!common.hasCrypto) |
| common.skip('missing crypto'); |
| const h2 = require('http2'); |
| const tls = require('tls'); |
| const fixtures = require('../common/fixtures'); |
| const { Duplex } = require('stream'); |
| |
| const server = h2.createSecureServer({ |
| key: fixtures.readKey('agent1-key.pem'), |
| cert: fixtures.readKey('agent1-cert.pem') |
| }); |
| |
| class JSSocket extends Duplex { |
| constructor(socket) { |
| super({ emitClose: true }); |
| socket.on('close', () => this.destroy()); |
| socket.on('data', (data) => this.push(data)); |
| this.socket = socket; |
| } |
| |
| _write(data, encoding, callback) { |
| this.socket.write(data, encoding, callback); |
| } |
| |
| _read(size) { |
| } |
| |
| _final(cb) { |
| cb(); |
| } |
| } |
| |
| server.listen(0, common.mustCall(function() { |
| const socket = tls.connect({ |
| rejectUnauthorized: false, |
| host: 'localhost', |
| port: this.address().port, |
| ALPNProtocols: ['h2'] |
| }, () => { |
| const proxy = new JSSocket(socket); |
| const client = h2.connect(`https://localhost:${this.address().port}`, { |
| createConnection: () => proxy |
| }); |
| const req = client.request(); |
| |
| server.on('request', () => { |
| socket.destroy(); |
| }); |
| |
| req.on('close', common.mustCall(() => { |
| client.close(); |
| server.close(); |
| })); |
| }); |
| })); |