UNPKG

4.15 kBJavaScriptView Raw
1'use strict'
2
3const t = require('tap')
4const Fastify = require('../..')
5const http2 = require('http2')
6const semver = require('semver')
7const { promisify } = require('util')
8const connect = promisify(http2.connect)
9const once = require('events.once')
10
11t.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 // Skipped because there is likely a bug on Node 8.
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 // Nothing to do here,
41 // we are not interested in this error that might
42 // happen or not
43 })
44 fastify.close()
45 })
46 session.on('error', () => {
47 // Nothing to do here,
48 // we are not interested in this error that might
49 // happen or not
50 t.end()
51 })
52 })
53
54 t.end()
55 })
56})
57
58t.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 // Skipped because there is likely a bug on Node 8.
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 // Nothing to do here,
89 // we are not interested in this error that might
90 // happen or not
91 })
92 fastify.close()
93 })
94 session.on('error', () => {
95 // Nothing to do here,
96 // we are not interested in this error that might
97 // happen or not
98 t.end()
99 })
100 })
101
102 t.end()
103 })
104})
105
106// Skipped because there is likely a bug on Node 8.
107t.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 // An error might or might not happen, as it's OS dependent.
118 session.on('error', () => {})
119 await fastify.close()
120})
121
122// Skipped because there is likely a bug on Node 8.
123t.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 // An error might or might not happen, as it's OS dependent.
151 session.on('error', () => {})
152 await p
153 await fastify.close()
154})