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.
		
		
		
		
		
			
		
			
				
					243 lines
				
				6.2 KiB
			
		
		
			
		
	
	
					243 lines
				
				6.2 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								'use strict'
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const http = require('http')
							 | 
						||
| 
								 | 
							
								const os = require('os')
							 | 
						||
| 
								 | 
							
								const semver = require('semver')
							 | 
						||
| 
								 | 
							
								const { test, skip } = require('tap')
							 | 
						||
| 
								 | 
							
								const { sink, once } = require('./helper')
							 | 
						||
| 
								 | 
							
								const pino = require('../')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const { pid } = process
							 | 
						||
| 
								 | 
							
								const hostname = os.hostname()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								test('http request support', async ({ ok, same, error, teardown }) => {
							 | 
						||
| 
								 | 
							
								  let originalReq
							 | 
						||
| 
								 | 
							
								  const instance = pino(sink((chunk, enc) => {
							 | 
						||
| 
								 | 
							
								    ok(new Date(chunk.time) <= new Date(), 'time is greater than Date.now()')
							 | 
						||
| 
								 | 
							
								    delete chunk.time
							 | 
						||
| 
								 | 
							
								    same(chunk, {
							 | 
						||
| 
								 | 
							
								      pid,
							 | 
						||
| 
								 | 
							
								      hostname,
							 | 
						||
| 
								 | 
							
								      level: 30,
							 | 
						||
| 
								 | 
							
								      msg: 'my request',
							 | 
						||
| 
								 | 
							
								      req: {
							 | 
						||
| 
								 | 
							
								        method: originalReq.method,
							 | 
						||
| 
								 | 
							
								        url: originalReq.url,
							 | 
						||
| 
								 | 
							
								        headers: originalReq.headers,
							 | 
						||
| 
								 | 
							
								        remoteAddress: originalReq.socket.remoteAddress,
							 | 
						||
| 
								 | 
							
								        remotePort: originalReq.socket.remotePort
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    })
							 | 
						||
| 
								 | 
							
								  }))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  const server = http.createServer((req, res) => {
							 | 
						||
| 
								 | 
							
								    originalReq = req
							 | 
						||
| 
								 | 
							
								    instance.info(req, 'my request')
							 | 
						||
| 
								 | 
							
								    res.end('hello')
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								  server.unref()
							 | 
						||
| 
								 | 
							
								  server.listen()
							 | 
						||
| 
								 | 
							
								  const err = await once(server, 'listening')
							 | 
						||
| 
								 | 
							
								  error(err)
							 | 
						||
| 
								 | 
							
								  const res = await once(http.get('http://localhost:' + server.address().port), 'response')
							 | 
						||
| 
								 | 
							
								  res.resume()
							 | 
						||
| 
								 | 
							
								  server.close()
							 | 
						||
| 
								 | 
							
								})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								test('http request support via serializer', async ({ ok, same, error, teardown }) => {
							 | 
						||
| 
								 | 
							
								  let originalReq
							 | 
						||
| 
								 | 
							
								  const instance = pino({
							 | 
						||
| 
								 | 
							
								    serializers: {
							 | 
						||
| 
								 | 
							
								      req: pino.stdSerializers.req
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }, sink((chunk, enc) => {
							 | 
						||
| 
								 | 
							
								    ok(new Date(chunk.time) <= new Date(), 'time is greater than Date.now()')
							 | 
						||
| 
								 | 
							
								    delete chunk.time
							 | 
						||
| 
								 | 
							
								    same(chunk, {
							 | 
						||
| 
								 | 
							
								      pid,
							 | 
						||
| 
								 | 
							
								      hostname,
							 | 
						||
| 
								 | 
							
								      level: 30,
							 | 
						||
| 
								 | 
							
								      msg: 'my request',
							 | 
						||
| 
								 | 
							
								      req: {
							 | 
						||
| 
								 | 
							
								        method: originalReq.method,
							 | 
						||
| 
								 | 
							
								        url: originalReq.url,
							 | 
						||
| 
								 | 
							
								        headers: originalReq.headers,
							 | 
						||
| 
								 | 
							
								        remoteAddress: originalReq.socket.remoteAddress,
							 | 
						||
| 
								 | 
							
								        remotePort: originalReq.socket.remotePort
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    })
							 | 
						||
| 
								 | 
							
								  }))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  const server = http.createServer(function (req, res) {
							 | 
						||
| 
								 | 
							
								    originalReq = req
							 | 
						||
| 
								 | 
							
								    instance.info({ req }, 'my request')
							 | 
						||
| 
								 | 
							
								    res.end('hello')
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								  server.unref()
							 | 
						||
| 
								 | 
							
								  server.listen()
							 | 
						||
| 
								 | 
							
								  const err = await once(server, 'listening')
							 | 
						||
| 
								 | 
							
								  error(err)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  const res = await once(http.get('http://localhost:' + server.address().port), 'response')
							 | 
						||
| 
								 | 
							
								  res.resume()
							 | 
						||
| 
								 | 
							
								  server.close()
							 | 
						||
| 
								 | 
							
								})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// skipped because request connection is deprecated since v13, and request socket is always available
							 | 
						||
| 
								 | 
							
								skip('http request support via serializer without request connection', async ({ ok, same, error, teardown }) => {
							 | 
						||
| 
								 | 
							
								  let originalReq
							 | 
						||
| 
								 | 
							
								  const instance = pino({
							 | 
						||
| 
								 | 
							
								    serializers: {
							 | 
						||
| 
								 | 
							
								      req: pino.stdSerializers.req
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }, sink((chunk, enc) => {
							 | 
						||
| 
								 | 
							
								    ok(new Date(chunk.time) <= new Date(), 'time is greater than Date.now()')
							 | 
						||
| 
								 | 
							
								    delete chunk.time
							 | 
						||
| 
								 | 
							
								    const expected = {
							 | 
						||
| 
								 | 
							
								      pid,
							 | 
						||
| 
								 | 
							
								      hostname,
							 | 
						||
| 
								 | 
							
								      level: 30,
							 | 
						||
| 
								 | 
							
								      msg: 'my request',
							 | 
						||
| 
								 | 
							
								      req: {
							 | 
						||
| 
								 | 
							
								        method: originalReq.method,
							 | 
						||
| 
								 | 
							
								        url: originalReq.url,
							 | 
						||
| 
								 | 
							
								        headers: originalReq.headers
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    if (semver.gte(process.version, '13.0.0')) {
							 | 
						||
| 
								 | 
							
								      expected.req.remoteAddress = originalReq.socket.remoteAddress
							 | 
						||
| 
								 | 
							
								      expected.req.remotePort = originalReq.socket.remotePort
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    same(chunk, expected)
							 | 
						||
| 
								 | 
							
								  }))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  const server = http.createServer(function (req, res) {
							 | 
						||
| 
								 | 
							
								    originalReq = req
							 | 
						||
| 
								 | 
							
								    delete req.connection
							 | 
						||
| 
								 | 
							
								    instance.info({ req }, 'my request')
							 | 
						||
| 
								 | 
							
								    res.end('hello')
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								  server.unref()
							 | 
						||
| 
								 | 
							
								  server.listen()
							 | 
						||
| 
								 | 
							
								  const err = await once(server, 'listening')
							 | 
						||
| 
								 | 
							
								  error(err)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  const res = await once(http.get('http://localhost:' + server.address().port), 'response')
							 | 
						||
| 
								 | 
							
								  res.resume()
							 | 
						||
| 
								 | 
							
								  server.close()
							 | 
						||
| 
								 | 
							
								})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								test('http response support', async ({ ok, same, error, teardown }) => {
							 | 
						||
| 
								 | 
							
								  let originalRes
							 | 
						||
| 
								 | 
							
								  const instance = pino(sink((chunk, enc) => {
							 | 
						||
| 
								 | 
							
								    ok(new Date(chunk.time) <= new Date(), 'time is greater than Date.now()')
							 | 
						||
| 
								 | 
							
								    delete chunk.time
							 | 
						||
| 
								 | 
							
								    same(chunk, {
							 | 
						||
| 
								 | 
							
								      pid,
							 | 
						||
| 
								 | 
							
								      hostname,
							 | 
						||
| 
								 | 
							
								      level: 30,
							 | 
						||
| 
								 | 
							
								      msg: 'my response',
							 | 
						||
| 
								 | 
							
								      res: {
							 | 
						||
| 
								 | 
							
								        statusCode: originalRes.statusCode,
							 | 
						||
| 
								 | 
							
								        headers: originalRes.getHeaders()
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    })
							 | 
						||
| 
								 | 
							
								  }))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  const server = http.createServer(function (req, res) {
							 | 
						||
| 
								 | 
							
								    originalRes = res
							 | 
						||
| 
								 | 
							
								    res.end('hello')
							 | 
						||
| 
								 | 
							
								    instance.info(res, 'my response')
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								  server.unref()
							 | 
						||
| 
								 | 
							
								  server.listen()
							 | 
						||
| 
								 | 
							
								  const err = await once(server, 'listening')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  error(err)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  const res = await once(http.get('http://localhost:' + server.address().port), 'response')
							 | 
						||
| 
								 | 
							
								  res.resume()
							 | 
						||
| 
								 | 
							
								  server.close()
							 | 
						||
| 
								 | 
							
								})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								test('http response support via a serializer', async ({ ok, same, error, teardown }) => {
							 | 
						||
| 
								 | 
							
								  const instance = pino({
							 | 
						||
| 
								 | 
							
								    serializers: {
							 | 
						||
| 
								 | 
							
								      res: pino.stdSerializers.res
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }, sink((chunk, enc) => {
							 | 
						||
| 
								 | 
							
								    ok(new Date(chunk.time) <= new Date(), 'time is greater than Date.now()')
							 | 
						||
| 
								 | 
							
								    delete chunk.time
							 | 
						||
| 
								 | 
							
								    same(chunk, {
							 | 
						||
| 
								 | 
							
								      pid,
							 | 
						||
| 
								 | 
							
								      hostname,
							 | 
						||
| 
								 | 
							
								      level: 30,
							 | 
						||
| 
								 | 
							
								      msg: 'my response',
							 | 
						||
| 
								 | 
							
								      res: {
							 | 
						||
| 
								 | 
							
								        statusCode: 200,
							 | 
						||
| 
								 | 
							
								        headers: {
							 | 
						||
| 
								 | 
							
								          'x-single': 'y',
							 | 
						||
| 
								 | 
							
								          'x-multi': [1, 2]
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    })
							 | 
						||
| 
								 | 
							
								  }))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  const server = http.createServer(function (req, res) {
							 | 
						||
| 
								 | 
							
								    res.setHeader('x-single', 'y')
							 | 
						||
| 
								 | 
							
								    res.setHeader('x-multi', [1, 2])
							 | 
						||
| 
								 | 
							
								    res.end('hello')
							 | 
						||
| 
								 | 
							
								    instance.info({ res }, 'my response')
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  server.unref()
							 | 
						||
| 
								 | 
							
								  server.listen()
							 | 
						||
| 
								 | 
							
								  const err = await once(server, 'listening')
							 | 
						||
| 
								 | 
							
								  error(err)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  const res = await once(http.get('http://localhost:' + server.address().port), 'response')
							 | 
						||
| 
								 | 
							
								  res.resume()
							 | 
						||
| 
								 | 
							
								  server.close()
							 | 
						||
| 
								 | 
							
								})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								test('http request support via serializer in a child', async ({ ok, same, error, teardown }) => {
							 | 
						||
| 
								 | 
							
								  let originalReq
							 | 
						||
| 
								 | 
							
								  const instance = pino({
							 | 
						||
| 
								 | 
							
								    serializers: {
							 | 
						||
| 
								 | 
							
								      req: pino.stdSerializers.req
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }, sink((chunk, enc) => {
							 | 
						||
| 
								 | 
							
								    ok(new Date(chunk.time) <= new Date(), 'time is greater than Date.now()')
							 | 
						||
| 
								 | 
							
								    delete chunk.time
							 | 
						||
| 
								 | 
							
								    same(chunk, {
							 | 
						||
| 
								 | 
							
								      pid,
							 | 
						||
| 
								 | 
							
								      hostname,
							 | 
						||
| 
								 | 
							
								      level: 30,
							 | 
						||
| 
								 | 
							
								      msg: 'my request',
							 | 
						||
| 
								 | 
							
								      req: {
							 | 
						||
| 
								 | 
							
								        method: originalReq.method,
							 | 
						||
| 
								 | 
							
								        url: originalReq.url,
							 | 
						||
| 
								 | 
							
								        headers: originalReq.headers,
							 | 
						||
| 
								 | 
							
								        remoteAddress: originalReq.socket.remoteAddress,
							 | 
						||
| 
								 | 
							
								        remotePort: originalReq.socket.remotePort
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    })
							 | 
						||
| 
								 | 
							
								  }))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  const server = http.createServer(function (req, res) {
							 | 
						||
| 
								 | 
							
								    originalReq = req
							 | 
						||
| 
								 | 
							
								    const child = instance.child({ req })
							 | 
						||
| 
								 | 
							
								    child.info('my request')
							 | 
						||
| 
								 | 
							
								    res.end('hello')
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  server.unref()
							 | 
						||
| 
								 | 
							
								  server.listen()
							 | 
						||
| 
								 | 
							
								  const err = await once(server, 'listening')
							 | 
						||
| 
								 | 
							
								  error(err)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  const res = await once(http.get('http://localhost:' + server.address().port), 'response')
							 | 
						||
| 
								 | 
							
								  res.resume()
							 | 
						||
| 
								 | 
							
								  server.close()
							 | 
						||
| 
								 | 
							
								})
							 |