1'use strict'; 2 3const common = require('../common'); 4if (!common.hasCrypto) 5 common.skip('missing crypto'); 6 7const assert = require('assert'); 8const events = require('events'); 9const { createServer, connect } = require('http2'); 10 11events.captureRejections = true; 12 13{ 14 // Test error thrown in the server 'stream' event, 15 // after a respond() 16 17 const server = createServer(); 18 server.on('stream', common.mustCall(async (stream) => { 19 server.close(); 20 21 stream.respond({ ':status': 200 }); 22 23 const _err = new Error('kaboom'); 24 stream.on('error', common.mustCall((err) => { 25 assert.strictEqual(err, _err); 26 })); 27 throw _err; 28 })); 29 30 server.listen(0, common.mustCall(() => { 31 const { port } = server.address(); 32 const session = connect(`http://localhost:${port}`); 33 34 const req = session.request(); 35 36 req.on('error', common.mustCall((err) => { 37 assert.strictEqual(err.code, 'ERR_HTTP2_STREAM_ERROR'); 38 })); 39 40 req.on('close', common.mustCall(() => { 41 session.close(); 42 })); 43 })); 44} 45 46{ 47 // Test error thrown in the server 'stream' event, 48 // before a respond(). 49 50 const server = createServer(); 51 server.on('stream', common.mustCall(async (stream) => { 52 server.close(); 53 54 stream.on('error', common.mustNotCall()); 55 56 throw new Error('kaboom'); 57 })); 58 59 server.listen(0, common.mustCall(() => { 60 const { port } = server.address(); 61 const session = connect(`http://localhost:${port}`); 62 63 const req = session.request(); 64 65 req.on('response', common.mustCall((headers) => { 66 assert.strictEqual(headers[':status'], 500); 67 })); 68 69 req.on('close', common.mustCall(() => { 70 session.close(); 71 })); 72 })); 73} 74 75{ 76 // Test error thrown in 'request' event 77 78 const server = createServer(common.mustCall(async (req, res) => { 79 server.close(); 80 res.setHeader('content-type', 'application/json'); 81 const _err = new Error('kaboom'); 82 throw _err; 83 })); 84 85 server.listen(0, common.mustCall(() => { 86 const { port } = server.address(); 87 const session = connect(`http://localhost:${port}`); 88 89 const req = session.request(); 90 91 req.on('response', common.mustCall((headers) => { 92 assert.strictEqual(headers[':status'], 500); 93 assert.strictEqual(Object.hasOwnProperty.call(headers, 'content-type'), 94 false); 95 })); 96 97 req.on('close', common.mustCall(() => { 98 session.close(); 99 })); 100 101 req.resume(); 102 })); 103} 104 105{ 106 // Test error thrown in the client 'stream' event 107 108 const server = createServer(); 109 server.on('stream', common.mustCall(async (stream) => { 110 const { port } = server.address(); 111 112 server.close(); 113 114 stream.pushStream({ 115 ':scheme': 'http', 116 ':path': '/foobar', 117 ':authority': `localhost:${port}`, 118 }, common.mustCall((err, push) => { 119 push.respond({ 120 'content-type': 'text/html', 121 ':status': 200 122 }); 123 push.end('pushed by the server'); 124 125 stream.end('test'); 126 })); 127 128 stream.respond({ 129 ':status': 200 130 }); 131 })); 132 133 server.listen(0, common.mustCall(() => { 134 const { port } = server.address(); 135 const session = connect(`http://localhost:${port}`); 136 137 const req = session.request(); 138 req.resume(); 139 140 session.on('stream', common.mustCall(async (stream) => { 141 session.close(); 142 143 const _err = new Error('kaboom'); 144 stream.on('error', common.mustCall((err) => { 145 assert.strictEqual(err, _err); 146 })); 147 throw _err; 148 })); 149 150 req.end(); 151 })); 152} 153