You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							187 lines
						
					
					
						
							4.7 KiB
						
					
					
				
			
		
		
	
	
							187 lines
						
					
					
						
							4.7 KiB
						
					
					
				| 'use strict'
 | |
| 
 | |
| const t = require('tap')
 | |
| const Fastify = require('../..')
 | |
| const http2 = require('http2')
 | |
| const semver = require('semver')
 | |
| const { promisify } = require('util')
 | |
| const connect = promisify(http2.connect)
 | |
| const { once } = require('events')
 | |
| 
 | |
| const { buildCertificate } = require('../build-certificate')
 | |
| t.before(buildCertificate)
 | |
| 
 | |
| function getUrl (app) {
 | |
|   const { address, port } = app.server.address()
 | |
|   if (address === '::1') {
 | |
|     return `http://[${address}]:${port}`
 | |
|   } else {
 | |
|     return `http://${address}:${port}`
 | |
|   }
 | |
| }
 | |
| 
 | |
| t.test('http/2 request while fastify closing', t => {
 | |
|   let fastify
 | |
|   try {
 | |
|     fastify = Fastify({
 | |
|       http2: true
 | |
|     })
 | |
|     t.pass('http2 successfully loaded')
 | |
|   } catch (e) {
 | |
|     t.fail('http2 loading failed', e)
 | |
|   }
 | |
| 
 | |
|   fastify.get('/', () => Promise.resolve({}))
 | |
| 
 | |
|   fastify.listen(0, err => {
 | |
|     t.error(err)
 | |
|     fastify.server.unref()
 | |
| 
 | |
|     // Skipped because there is likely a bug on Node 8.
 | |
|     t.test('return 200', { skip: semver.lt(process.versions.node, '10.15.0') }, t => {
 | |
|       const url = getUrl(fastify)
 | |
|       const session = http2.connect(url, function () {
 | |
|         this.request({
 | |
|           ':method': 'GET',
 | |
|           ':path': '/'
 | |
|         }).on('response', headers => {
 | |
|           t.equal(headers[':status'], 503)
 | |
|           t.end()
 | |
|           this.destroy()
 | |
|         }).on('error', () => {
 | |
|           // Nothing to do here,
 | |
|           // we are not interested in this error that might
 | |
|           // happen or not
 | |
|         })
 | |
|         fastify.close()
 | |
|       })
 | |
|       session.on('error', () => {
 | |
|         // Nothing to do here,
 | |
|         // we are not interested in this error that might
 | |
|         // happen or not
 | |
|         t.end()
 | |
|       })
 | |
|     })
 | |
| 
 | |
|     t.end()
 | |
|   })
 | |
| })
 | |
| 
 | |
| t.test('http/2 request while fastify closing - return503OnClosing: false', t => {
 | |
|   let fastify
 | |
|   try {
 | |
|     fastify = Fastify({
 | |
|       http2: true,
 | |
|       return503OnClosing: false
 | |
|     })
 | |
|     t.pass('http2 successfully loaded')
 | |
|   } catch (e) {
 | |
|     t.fail('http2 loading failed', e)
 | |
|   }
 | |
| 
 | |
|   fastify.get('/', () => Promise.resolve({}))
 | |
| 
 | |
|   fastify.listen(0, err => {
 | |
|     t.error(err)
 | |
|     fastify.server.unref()
 | |
| 
 | |
|     // Skipped because there is likely a bug on Node 8.
 | |
|     t.test('return 200', { skip: semver.lt(process.versions.node, '10.15.0') }, t => {
 | |
|       const url = getUrl(fastify)
 | |
|       const session = http2.connect(url, function () {
 | |
|         this.request({
 | |
|           ':method': 'GET',
 | |
|           ':path': '/'
 | |
|         }).on('response', headers => {
 | |
|           t.equal(headers[':status'], 200)
 | |
|           t.end()
 | |
|           this.destroy()
 | |
|         }).on('error', () => {
 | |
|           // Nothing to do here,
 | |
|           // we are not interested in this error that might
 | |
|           // happen or not
 | |
|         })
 | |
|         fastify.close()
 | |
|       })
 | |
|       session.on('error', () => {
 | |
|         // Nothing to do here,
 | |
|         // we are not interested in this error that might
 | |
|         // happen or not
 | |
|         t.end()
 | |
|       })
 | |
|     })
 | |
| 
 | |
|     t.end()
 | |
|   })
 | |
| })
 | |
| 
 | |
| // Skipped because there is likely a bug on Node 8.
 | |
| t.test('http/2 closes successfully with async await', { skip: semver.lt(process.versions.node, '10.15.0') }, async t => {
 | |
|   const fastify = Fastify({
 | |
|     http2SessionTimeout: 100,
 | |
|     http2: true
 | |
|   })
 | |
| 
 | |
|   await fastify.listen(0)
 | |
| 
 | |
|   const url = getUrl(fastify)
 | |
|   const session = await connect(url)
 | |
|   // An error might or might not happen, as it's OS dependent.
 | |
|   session.on('error', () => {})
 | |
|   await fastify.close()
 | |
| })
 | |
| 
 | |
| // Skipped because there is likely a bug on Node 8.
 | |
| t.test('https/2 closes successfully with async await', { skip: semver.lt(process.versions.node, '10.15.0') }, async t => {
 | |
|   const fastify = Fastify({
 | |
|     http2SessionTimeout: 100,
 | |
|     http2: true,
 | |
|     https: {
 | |
|       key: global.context.key,
 | |
|       cert: global.context.cert
 | |
|     }
 | |
|   })
 | |
| 
 | |
|   await fastify.listen(0)
 | |
| 
 | |
|   const url = getUrl(fastify)
 | |
|   const session = await connect(url)
 | |
|   // An error might or might not happen, as it's OS dependent.
 | |
|   session.on('error', () => {})
 | |
|   await fastify.close()
 | |
| })
 | |
| 
 | |
| // Skipped because there is likely a bug on Node 8.
 | |
| t.test('http/2 server side session emits a timeout event', { skip: semver.lt(process.versions.node, '10.15.0') }, async t => {
 | |
|   let _resolve
 | |
|   const p = new Promise((resolve) => { _resolve = resolve })
 | |
| 
 | |
|   const fastify = Fastify({
 | |
|     http2SessionTimeout: 100,
 | |
|     http2: true
 | |
|   })
 | |
| 
 | |
|   fastify.get('/', async (req) => {
 | |
|     req.raw.stream.session.on('timeout', () => _resolve())
 | |
|     return {}
 | |
|   })
 | |
| 
 | |
|   await fastify.listen(0)
 | |
| 
 | |
|   const url = getUrl(fastify)
 | |
|   const session = await connect(url)
 | |
|   const req = session.request({
 | |
|     ':method': 'GET',
 | |
|     ':path': '/'
 | |
|   }).end()
 | |
| 
 | |
|   const [headers] = await once(req, 'response')
 | |
|   t.equal(headers[':status'], 200)
 | |
|   req.resume()
 | |
| 
 | |
|   // An error might or might not happen, as it's OS dependent.
 | |
|   session.on('error', () => {})
 | |
|   await p
 | |
|   await fastify.close()
 | |
| })
 |