| // Flags: --expose-internals |
| |
| 'use strict'; |
| |
| const common = require('../common'); |
| if (!common.hasCrypto) |
| common.skip('missing crypto'); |
| const assert = require('assert'); |
| const h2 = require('http2'); |
| const { kSocket } = require('internal/http2/util'); |
| const { once } = require('events'); |
| |
| const server = h2.createServer(); |
| |
| // We use the lower-level API here |
| server.on('stream', common.mustCall(onStream)); |
| |
| function onStream(stream) { |
| stream.respond(); |
| stream.write('test'); |
| |
| const socket = stream.session[kSocket]; |
| |
| // When the socket is destroyed, the close events must be triggered |
| // on the socket, server and session. |
| socket.on('close', common.mustCall()); |
| stream.on('close', common.mustCall()); |
| server.on('close', common.mustCall()); |
| stream.session.on('close', common.mustCall(() => server.close())); |
| |
| // Also, the aborted event must be triggered on the stream |
| stream.on('aborted', common.mustCall()); |
| |
| assert.notStrictEqual(stream.session, undefined); |
| socket.destroy(); |
| } |
| |
| server.listen(0); |
| |
| server.on('listening', common.mustCall(async () => { |
| const client = h2.connect(`http://localhost:${server.address().port}`); |
| // The client may have an ECONNRESET error here depending on the operating |
| // system, due mainly to differences in the timing of socket closing. Do |
| // not wrap this in a common mustCall. |
| client.on('error', (err) => { |
| if (err.code !== 'ECONNRESET') |
| throw err; |
| }); |
| client.on('close', common.mustCall()); |
| |
| const req = client.request({ ':method': 'POST' }); |
| // The client may have an ECONNRESET error here depending on the operating |
| // system, due mainly to differences in the timing of socket closing. Do |
| // not wrap this in a common mustCall. |
| req.on('error', (err) => { |
| if (err.code !== 'ECONNRESET') |
| throw err; |
| }); |
| |
| req.on('aborted', common.mustCall()); |
| req.resume(); |
| |
| try { |
| await once(req, 'end'); |
| } catch { |
| // Continue regardless of error. |
| } |
| })); |