• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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