1 | 'use strict'
|
2 |
|
3 | const t = require('tap')
|
4 | const Fastify = require('../..')
|
5 | const http2 = require('http2')
|
6 | const semver = require('semver')
|
7 | const { promisify } = require('util')
|
8 | const connect = promisify(http2.connect)
|
9 | const once = require('events.once')
|
10 |
|
11 | t.test('http/2 request while fastify closing', t => {
|
12 | let fastify
|
13 | try {
|
14 | fastify = Fastify({
|
15 | http2: true
|
16 | })
|
17 | t.pass('http2 successfully loaded')
|
18 | } catch (e) {
|
19 | t.fail('http2 loading failed', e)
|
20 | }
|
21 |
|
22 | fastify.get('/', () => Promise.resolve({}))
|
23 |
|
24 | fastify.listen(0, err => {
|
25 | t.error(err)
|
26 | fastify.server.unref()
|
27 |
|
28 |
|
29 | t.test('return 200', { skip: semver.lt(process.versions.node, '10.15.0') }, t => {
|
30 | const url = `http://127.0.0.1:${fastify.server.address().port}`
|
31 | const session = http2.connect(url, function () {
|
32 | this.request({
|
33 | ':method': 'GET',
|
34 | ':path': '/'
|
35 | }).on('response', headers => {
|
36 | t.strictEqual(headers[':status'], 503)
|
37 | t.end()
|
38 | this.destroy()
|
39 | }).on('error', () => {
|
40 |
|
41 |
|
42 |
|
43 | })
|
44 | fastify.close()
|
45 | })
|
46 | session.on('error', () => {
|
47 |
|
48 |
|
49 |
|
50 | t.end()
|
51 | })
|
52 | })
|
53 |
|
54 | t.end()
|
55 | })
|
56 | })
|
57 |
|
58 | t.test('http/2 request while fastify closing - return503OnClosing: false', t => {
|
59 | let fastify
|
60 | try {
|
61 | fastify = Fastify({
|
62 | http2: true,
|
63 | return503OnClosing: false
|
64 | })
|
65 | t.pass('http2 successfully loaded')
|
66 | } catch (e) {
|
67 | t.fail('http2 loading failed', e)
|
68 | }
|
69 |
|
70 | fastify.get('/', () => Promise.resolve({}))
|
71 |
|
72 | fastify.listen(0, err => {
|
73 | t.error(err)
|
74 | fastify.server.unref()
|
75 |
|
76 |
|
77 | t.test('return 200', { skip: semver.lt(process.versions.node, '10.15.0') }, t => {
|
78 | const url = `http://127.0.0.1:${fastify.server.address().port}`
|
79 | const session = http2.connect(url, function () {
|
80 | this.request({
|
81 | ':method': 'GET',
|
82 | ':path': '/'
|
83 | }).on('response', headers => {
|
84 | t.strictEqual(headers[':status'], 200)
|
85 | t.end()
|
86 | this.destroy()
|
87 | }).on('error', () => {
|
88 |
|
89 |
|
90 |
|
91 | })
|
92 | fastify.close()
|
93 | })
|
94 | session.on('error', () => {
|
95 |
|
96 |
|
97 |
|
98 | t.end()
|
99 | })
|
100 | })
|
101 |
|
102 | t.end()
|
103 | })
|
104 | })
|
105 |
|
106 |
|
107 | t.test('http/2 closes successfully with async await', { skip: semver.lt(process.versions.node, '10.15.0') }, async t => {
|
108 | const fastify = Fastify({
|
109 | http2SessionTimeout: 100,
|
110 | http2: true
|
111 | })
|
112 |
|
113 | await fastify.listen(0)
|
114 |
|
115 | const url = `http://127.0.0.1:${fastify.server.address().port}`
|
116 | const session = await connect(url)
|
117 |
|
118 | session.on('error', () => {})
|
119 | await fastify.close()
|
120 | })
|
121 |
|
122 |
|
123 | t.test('http/2 server side session emits a timeout event', { skip: semver.lt(process.versions.node, '10.15.0') }, async t => {
|
124 | let _resolve
|
125 | const p = new Promise((resolve) => { _resolve = resolve })
|
126 |
|
127 | const fastify = Fastify({
|
128 | http2SessionTimeout: 100,
|
129 | http2: true
|
130 | })
|
131 |
|
132 | fastify.get('/', async (req) => {
|
133 | req.raw.stream.session.on('timeout', () => _resolve())
|
134 | return {}
|
135 | })
|
136 |
|
137 | await fastify.listen(0)
|
138 |
|
139 | const url = `http://127.0.0.1:${fastify.server.address().port}`
|
140 | const session = await connect(url)
|
141 | const req = session.request({
|
142 | ':method': 'GET',
|
143 | ':path': '/'
|
144 | }).end()
|
145 |
|
146 | const [headers] = await once(req, 'response')
|
147 | t.strictEqual(headers[':status'], 200)
|
148 | req.resume()
|
149 |
|
150 |
|
151 | session.on('error', () => {})
|
152 | await p
|
153 | await fastify.close()
|
154 | })
|