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.
		
		
		
		
		
			
		
			
				
					
					
						
							834 lines
						
					
					
						
							20 KiB
						
					
					
				
			
		
		
	
	
							834 lines
						
					
					
						
							20 KiB
						
					
					
				'use strict'
 | 
						|
const test = require('tap').test
 | 
						|
const FormData = require('form-data')
 | 
						|
const Fastify = require('fastify')
 | 
						|
const multipart = require('./../..')
 | 
						|
const http = require('http')
 | 
						|
const path = require('path')
 | 
						|
const fs = require('fs')
 | 
						|
const pump = require('pump')
 | 
						|
 | 
						|
const filePath = path.join(__dirname, '..', '..', 'README.md')
 | 
						|
 | 
						|
test('addToBody option', { skip: process.platform === 'win32' }, t => {
 | 
						|
  t.plan(8)
 | 
						|
 | 
						|
  const fastify = Fastify()
 | 
						|
  t.teardown(fastify.close.bind(fastify))
 | 
						|
 | 
						|
  fastify.register(multipart, { addToBody: true })
 | 
						|
 | 
						|
  fastify.post('/', function (req, reply) {
 | 
						|
    t.equal(req.body.myField, 'hello')
 | 
						|
    t.equal(req.body.myCheck, 'true')
 | 
						|
    t.match(req.body.myFile, [{
 | 
						|
      encoding: '7bit',
 | 
						|
      filename: 'README.md',
 | 
						|
      limit: false,
 | 
						|
      mimetype: 'text/markdown'
 | 
						|
    }])
 | 
						|
    t.type(req.body.myFile[0].data, Buffer)
 | 
						|
    t.equal(req.body.myFile[0].data.toString('utf8').substr(0, 20), '# @fastify/multipart')
 | 
						|
 | 
						|
    reply.send('ok')
 | 
						|
  })
 | 
						|
 | 
						|
  fastify.listen({ port: 0 }, function () {
 | 
						|
    // request
 | 
						|
    const form = new FormData()
 | 
						|
    const opts = {
 | 
						|
      protocol: 'http:',
 | 
						|
      hostname: 'localhost',
 | 
						|
      port: fastify.server.address().port,
 | 
						|
      path: '/',
 | 
						|
      headers: form.getHeaders(),
 | 
						|
      method: 'POST'
 | 
						|
    }
 | 
						|
 | 
						|
    const req = http.request(opts, (res) => {
 | 
						|
      t.equal(res.statusCode, 200)
 | 
						|
      res.resume()
 | 
						|
      res.on('end', () => {
 | 
						|
        t.pass('res ended successfully')
 | 
						|
      })
 | 
						|
    })
 | 
						|
 | 
						|
    const rs = fs.createReadStream(filePath)
 | 
						|
    form.append('myField', 'hello')
 | 
						|
    form.append('myCheck', 'true')
 | 
						|
    form.append('myFile', rs)
 | 
						|
    pump(form, req, function (err) {
 | 
						|
      t.error(err, 'client pump: no err')
 | 
						|
    })
 | 
						|
  })
 | 
						|
})
 | 
						|
 | 
						|
test('addToBody with limit exceeded', { skip: process.platform === 'win32' }, t => {
 | 
						|
  t.plan(5)
 | 
						|
 | 
						|
  const fastify = Fastify()
 | 
						|
  t.teardown(fastify.close.bind(fastify))
 | 
						|
 | 
						|
  fastify.register(multipart, { addToBody: true, limits: { fileSize: 1 } })
 | 
						|
 | 
						|
  fastify.post('/', function (req, reply) {
 | 
						|
    t.equal(req.body.myFile[0].limit, true)
 | 
						|
    t.equal(req.body.myFile[0].data, undefined)
 | 
						|
 | 
						|
    reply.send('ok')
 | 
						|
  })
 | 
						|
 | 
						|
  fastify.listen({ port: 0 }, function () {
 | 
						|
    // request
 | 
						|
    const form = new FormData()
 | 
						|
    const opts = {
 | 
						|
      protocol: 'http:',
 | 
						|
      hostname: 'localhost',
 | 
						|
      port: fastify.server.address().port,
 | 
						|
      path: '/',
 | 
						|
      headers: form.getHeaders(),
 | 
						|
      method: 'POST'
 | 
						|
    }
 | 
						|
 | 
						|
    const req = http.request(opts, (res) => {
 | 
						|
      t.equal(res.statusCode, 200)
 | 
						|
      res.resume()
 | 
						|
      res.on('end', () => {
 | 
						|
        t.pass('res ended successfully')
 | 
						|
      })
 | 
						|
    })
 | 
						|
 | 
						|
    const rs = fs.createReadStream(filePath)
 | 
						|
    form.append('myFile', rs)
 | 
						|
    pump(form, req, function (err) {
 | 
						|
      t.error(err, 'client pump: no err')
 | 
						|
    })
 | 
						|
  })
 | 
						|
})
 | 
						|
 | 
						|
test('addToBody option and multiple files', { skip: process.platform === 'win32' }, t => {
 | 
						|
  t.plan(7)
 | 
						|
 | 
						|
  const fastify = Fastify()
 | 
						|
  t.teardown(fastify.close.bind(fastify))
 | 
						|
 | 
						|
  let fileCounter = 0
 | 
						|
  const opts = {
 | 
						|
    addToBody: true,
 | 
						|
    onFile: (fieldName, stream, filename, encoding, mimetype) => {
 | 
						|
      fileCounter++
 | 
						|
      stream.resume()
 | 
						|
    }
 | 
						|
  }
 | 
						|
  fastify.register(multipart, opts)
 | 
						|
 | 
						|
  fastify.post('/', function (req, reply) {
 | 
						|
    t.match(req.body.myFile, [{
 | 
						|
      data: [],
 | 
						|
      encoding: '7bit',
 | 
						|
      filename: 'README.md',
 | 
						|
      limit: false,
 | 
						|
      mimetype: 'text/markdown'
 | 
						|
    }])
 | 
						|
 | 
						|
    t.match(req.body.myFileTwo, [{
 | 
						|
      data: [],
 | 
						|
      encoding: '7bit',
 | 
						|
      filename: 'README.md',
 | 
						|
      limit: false,
 | 
						|
      mimetype: 'text/markdown'
 | 
						|
    }])
 | 
						|
 | 
						|
    t.match(req.body.myFileThree, [{
 | 
						|
      data: [],
 | 
						|
      encoding: '7bit',
 | 
						|
      filename: 'README.md',
 | 
						|
      limit: false,
 | 
						|
      mimetype: 'text/markdown'
 | 
						|
    }])
 | 
						|
 | 
						|
    t.equal(fileCounter, 3, 'We must receive 3 file events')
 | 
						|
    reply.send('ok')
 | 
						|
  })
 | 
						|
 | 
						|
  fastify.listen({ port: 0 }, function () {
 | 
						|
    // request
 | 
						|
    const form = new FormData()
 | 
						|
    const opts = {
 | 
						|
      protocol: 'http:',
 | 
						|
      hostname: 'localhost',
 | 
						|
      port: fastify.server.address().port,
 | 
						|
      path: '/',
 | 
						|
      headers: form.getHeaders(),
 | 
						|
      method: 'POST'
 | 
						|
    }
 | 
						|
 | 
						|
    const req = http.request(opts, (res) => {
 | 
						|
      t.equal(res.statusCode, 200)
 | 
						|
      res.resume()
 | 
						|
      res.on('end', () => {
 | 
						|
        t.pass('res ended successfully')
 | 
						|
      })
 | 
						|
    })
 | 
						|
 | 
						|
    const rs1 = fs.createReadStream(filePath)
 | 
						|
    const rs2 = fs.createReadStream(filePath)
 | 
						|
    const rs3 = fs.createReadStream(filePath)
 | 
						|
    form.append('myFile', rs1)
 | 
						|
    form.append('myFileTwo', rs2)
 | 
						|
    form.append('myFileThree', rs3)
 | 
						|
    pump(form, req, function (err) {
 | 
						|
      t.error(err, 'client pump: no err')
 | 
						|
    })
 | 
						|
  })
 | 
						|
})
 | 
						|
 | 
						|
test('addToBody option and multiple files in one field', { skip: process.platform === 'win32' }, t => {
 | 
						|
  t.plan(7)
 | 
						|
 | 
						|
  const fastify = Fastify()
 | 
						|
  t.teardown(fastify.close.bind(fastify))
 | 
						|
 | 
						|
  const opts = {
 | 
						|
    addToBody: true
 | 
						|
  }
 | 
						|
  fastify.register(multipart, opts)
 | 
						|
 | 
						|
  fastify.post('/', function (req, reply) {
 | 
						|
    t.match(req.body.myFile, [{
 | 
						|
      encoding: '7bit',
 | 
						|
      filename: 'README.md',
 | 
						|
      limit: false,
 | 
						|
      mimetype: 'text/markdown'
 | 
						|
    }, {
 | 
						|
      encoding: '7bit',
 | 
						|
      filename: 'LICENSE',
 | 
						|
      limit: false,
 | 
						|
      mimetype: 'application/octet-stream'
 | 
						|
    }, {
 | 
						|
      encoding: '7bit',
 | 
						|
      filename: 'form.html',
 | 
						|
      limit: false,
 | 
						|
      mimetype: 'text/html'
 | 
						|
    }])
 | 
						|
    req.body.myFile.forEach(x => {
 | 
						|
      t.equal(Buffer.isBuffer(x.data), true)
 | 
						|
    })
 | 
						|
    reply.send('ok')
 | 
						|
  })
 | 
						|
 | 
						|
  fastify.listen({ port: 0 }, function () {
 | 
						|
    // request
 | 
						|
    const form = new FormData()
 | 
						|
    const opts = {
 | 
						|
      protocol: 'http:',
 | 
						|
      hostname: 'localhost',
 | 
						|
      port: fastify.server.address().port,
 | 
						|
      path: '/',
 | 
						|
      headers: form.getHeaders(),
 | 
						|
      method: 'POST'
 | 
						|
    }
 | 
						|
 | 
						|
    const req = http.request(opts, (res) => {
 | 
						|
      t.equal(res.statusCode, 200)
 | 
						|
      res.resume()
 | 
						|
      res.on('end', () => {
 | 
						|
        t.pass('res ended successfully')
 | 
						|
      })
 | 
						|
    })
 | 
						|
 | 
						|
    const rs1 = fs.createReadStream(path.join(__dirname, '..', '..', 'README.md'))
 | 
						|
    const rs2 = fs.createReadStream(path.join(__dirname, '..', '..', 'LICENSE'))
 | 
						|
    const rs3 = fs.createReadStream(path.join(__dirname, '..', '..', 'form.html'))
 | 
						|
    form.append('myFile', rs1)
 | 
						|
    form.append('myFile', rs2)
 | 
						|
    form.append('myFile', rs3)
 | 
						|
    pump(form, req, function (err) {
 | 
						|
      t.error(err, 'client pump: no err')
 | 
						|
    })
 | 
						|
  })
 | 
						|
})
 | 
						|
 | 
						|
test('addToBody option and multiple strings in one field', { skip: process.platform === 'win32' }, t => {
 | 
						|
  t.plan(4)
 | 
						|
 | 
						|
  const fastify = Fastify()
 | 
						|
  t.teardown(fastify.close.bind(fastify))
 | 
						|
 | 
						|
  const opts = {
 | 
						|
    addToBody: true
 | 
						|
  }
 | 
						|
  fastify.register(multipart, opts)
 | 
						|
 | 
						|
  fastify.post('/', function (req, reply) {
 | 
						|
    t.match(req.body.myField, ['1', '2', '3'])
 | 
						|
 | 
						|
    reply.send('ok')
 | 
						|
  })
 | 
						|
 | 
						|
  fastify.listen({ port: 0 }, function () {
 | 
						|
    // request
 | 
						|
    const form = new FormData()
 | 
						|
    const opts = {
 | 
						|
      protocol: 'http:',
 | 
						|
      hostname: 'localhost',
 | 
						|
      port: fastify.server.address().port,
 | 
						|
      path: '/',
 | 
						|
      headers: form.getHeaders(),
 | 
						|
      method: 'POST'
 | 
						|
    }
 | 
						|
 | 
						|
    const req = http.request(opts, (res) => {
 | 
						|
      t.equal(res.statusCode, 200)
 | 
						|
      res.resume()
 | 
						|
      res.on('end', () => {
 | 
						|
        t.pass('res ended successfully')
 | 
						|
      })
 | 
						|
    })
 | 
						|
 | 
						|
    form.append('myField', '1')
 | 
						|
    form.append('myField', '2')
 | 
						|
    form.append('myField', '3')
 | 
						|
    pump(form, req, function (err) {
 | 
						|
      t.error(err, 'client pump: no err')
 | 
						|
    })
 | 
						|
  })
 | 
						|
})
 | 
						|
 | 
						|
test('addToBody option and custom stream management', { skip: process.platform === 'win32' }, t => {
 | 
						|
  t.plan(7)
 | 
						|
 | 
						|
  const fastify = Fastify()
 | 
						|
  t.teardown(fastify.close.bind(fastify))
 | 
						|
 | 
						|
  const opts = {
 | 
						|
    addToBody: true,
 | 
						|
    onFile: (fieldName, stream, filename, encoding, mimetype) => {
 | 
						|
      t.equal(fieldName, 'myFile')
 | 
						|
      stream.resume()
 | 
						|
    }
 | 
						|
  }
 | 
						|
  fastify.register(multipart, opts)
 | 
						|
 | 
						|
  fastify.post('/', function (req, reply) {
 | 
						|
    t.equal(req.body.myField, 'hello')
 | 
						|
    t.equal(req.body.myCheck, 'true')
 | 
						|
    t.match(req.body.myFile, [{
 | 
						|
      data: [],
 | 
						|
      encoding: '7bit',
 | 
						|
      filename: 'README.md',
 | 
						|
      limit: false,
 | 
						|
      mimetype: 'text/markdown'
 | 
						|
    }])
 | 
						|
 | 
						|
    reply.send('ok')
 | 
						|
  })
 | 
						|
 | 
						|
  fastify.listen({ port: 0 }, function () {
 | 
						|
    // request
 | 
						|
    const form = new FormData()
 | 
						|
    const opts = {
 | 
						|
      protocol: 'http:',
 | 
						|
      hostname: 'localhost',
 | 
						|
      port: fastify.server.address().port,
 | 
						|
      path: '/',
 | 
						|
      headers: form.getHeaders(),
 | 
						|
      method: 'POST'
 | 
						|
    }
 | 
						|
 | 
						|
    const req = http.request(opts, (res) => {
 | 
						|
      t.equal(res.statusCode, 200)
 | 
						|
      res.resume()
 | 
						|
      res.on('end', () => {
 | 
						|
        t.pass('res ended successfully')
 | 
						|
      })
 | 
						|
    })
 | 
						|
 | 
						|
    const rs = fs.createReadStream(filePath)
 | 
						|
    form.append('myField', 'hello')
 | 
						|
    form.append('myCheck', 'true')
 | 
						|
    form.append('myFile', rs)
 | 
						|
    pump(form, req, function (err) {
 | 
						|
      t.error(err, 'client pump: no err')
 | 
						|
    })
 | 
						|
  })
 | 
						|
})
 | 
						|
 | 
						|
test('addToBody option with promise', { skip: process.platform === 'win32' }, t => {
 | 
						|
  t.plan(5)
 | 
						|
 | 
						|
  const fastify = Fastify()
 | 
						|
  t.teardown(fastify.close.bind(fastify))
 | 
						|
 | 
						|
  const opts = {
 | 
						|
    addToBody: true,
 | 
						|
    onFile: async (fieldName, stream, filename, encoding, mimetype) => {
 | 
						|
      await new Promise(resolve => setTimeout(resolve, 10))
 | 
						|
      t.equal(fieldName, 'myFile')
 | 
						|
      stream.resume()
 | 
						|
    }
 | 
						|
  }
 | 
						|
  fastify.register(multipart, opts)
 | 
						|
 | 
						|
  fastify.post('/', function (req, reply) {
 | 
						|
    t.match(req.body.myFile, [{
 | 
						|
      data: [],
 | 
						|
      encoding: '7bit',
 | 
						|
      filename: 'README.md',
 | 
						|
      limit: false,
 | 
						|
      mimetype: 'text/markdown'
 | 
						|
    }])
 | 
						|
 | 
						|
    reply.send('ok')
 | 
						|
  })
 | 
						|
 | 
						|
  fastify.listen({ port: 0 }, function () {
 | 
						|
    // request
 | 
						|
    const form = new FormData()
 | 
						|
    const opts = {
 | 
						|
      protocol: 'http:',
 | 
						|
      hostname: 'localhost',
 | 
						|
      port: fastify.server.address().port,
 | 
						|
      path: '/',
 | 
						|
      headers: form.getHeaders(),
 | 
						|
      method: 'POST'
 | 
						|
    }
 | 
						|
 | 
						|
    const req = http.request(opts, (res) => {
 | 
						|
      t.equal(res.statusCode, 200)
 | 
						|
      res.resume()
 | 
						|
      res.on('end', () => {
 | 
						|
        t.pass('res ended successfully')
 | 
						|
      })
 | 
						|
    })
 | 
						|
 | 
						|
    const rs = fs.createReadStream(filePath)
 | 
						|
    form.append('myFile', rs)
 | 
						|
    pump(form, req, function (err) {
 | 
						|
      t.error(err, 'client pump: no err')
 | 
						|
    })
 | 
						|
  })
 | 
						|
})
 | 
						|
 | 
						|
test('addToBody option with promise in error', { skip: process.platform === 'win32' }, t => {
 | 
						|
  t.plan(3)
 | 
						|
 | 
						|
  const fastify = Fastify()
 | 
						|
  t.teardown(fastify.close.bind(fastify))
 | 
						|
 | 
						|
  const opts = {
 | 
						|
    addToBody: true,
 | 
						|
    onFile: (fieldName, stream, filename, encoding, mimetype) => {
 | 
						|
      return Promise.reject(new Error('my error'))
 | 
						|
    }
 | 
						|
  }
 | 
						|
  fastify.register(multipart, opts)
 | 
						|
 | 
						|
  fastify.post('/', function (req, reply) {
 | 
						|
    t.fail('should not execute the handler')
 | 
						|
  })
 | 
						|
 | 
						|
  fastify.listen({ port: 0 }, function () {
 | 
						|
    // request
 | 
						|
    const form = new FormData()
 | 
						|
    const opts = {
 | 
						|
      protocol: 'http:',
 | 
						|
      hostname: 'localhost',
 | 
						|
      port: fastify.server.address().port,
 | 
						|
      path: '/',
 | 
						|
      headers: form.getHeaders(),
 | 
						|
      method: 'POST'
 | 
						|
    }
 | 
						|
 | 
						|
    const req = http.request(opts, (res) => {
 | 
						|
      t.equal(res.statusCode, 500)
 | 
						|
      res.resume()
 | 
						|
      res.on('end', () => {
 | 
						|
        t.pass('res ended successfully')
 | 
						|
      })
 | 
						|
    })
 | 
						|
 | 
						|
    const rs = fs.createReadStream(filePath)
 | 
						|
    form.append('myFile', rs)
 | 
						|
    pump(form, req, function (err) {
 | 
						|
      t.error(err, 'client pump: no err')
 | 
						|
    })
 | 
						|
  })
 | 
						|
})
 | 
						|
 | 
						|
test('addToBody with shared schema', { skip: process.platform === 'win32' }, (t) => {
 | 
						|
  t.plan(9)
 | 
						|
 | 
						|
  const fastify = Fastify()
 | 
						|
  t.teardown(fastify.close.bind(fastify))
 | 
						|
 | 
						|
  fastify.register(multipart, {
 | 
						|
    addToBody: true,
 | 
						|
    sharedSchemaId: 'mySharedSchema',
 | 
						|
    onFile: (fieldName, stream, filename, encoding, mimetype) => {
 | 
						|
      t.equal(fieldName, 'myFile')
 | 
						|
      t.equal(filename, 'README.md')
 | 
						|
      t.equal(encoding, '7bit')
 | 
						|
      t.equal(mimetype, 'text/markdown')
 | 
						|
      stream.resume()
 | 
						|
    }
 | 
						|
  })
 | 
						|
 | 
						|
  fastify.after(() => {
 | 
						|
    fastify.post('/', {
 | 
						|
      schema: {
 | 
						|
        body: {
 | 
						|
          type: 'object',
 | 
						|
          required: ['myField', 'myFile'],
 | 
						|
          properties: {
 | 
						|
            myField: { type: 'string' },
 | 
						|
            myFile: { type: 'array', items: fastify.getSchema('mySharedSchema') }
 | 
						|
          }
 | 
						|
        }
 | 
						|
      }
 | 
						|
    }, function (req, reply) {
 | 
						|
      t.equal(req.body.myField, 'hello')
 | 
						|
      t.match(req.body.myFile, [{
 | 
						|
        data: [],
 | 
						|
        encoding: '7bit',
 | 
						|
        filename: 'README.md',
 | 
						|
        limit: false,
 | 
						|
        mimetype: 'text/markdown'
 | 
						|
      }])
 | 
						|
      reply.send('ok')
 | 
						|
    })
 | 
						|
  })
 | 
						|
 | 
						|
  fastify.listen({ port: 0 }, function () {
 | 
						|
    // request
 | 
						|
    const form = new FormData()
 | 
						|
    const opts = {
 | 
						|
      protocol: 'http:',
 | 
						|
      hostname: 'localhost',
 | 
						|
      port: fastify.server.address().port,
 | 
						|
      path: '/',
 | 
						|
      headers: form.getHeaders(),
 | 
						|
      method: 'POST'
 | 
						|
    }
 | 
						|
 | 
						|
    const req = http.request(opts, (res) => {
 | 
						|
      t.equal(res.statusCode, 200)
 | 
						|
      res.resume()
 | 
						|
      res.on('end', () => {
 | 
						|
        t.pass('res ended successfully')
 | 
						|
        fastify.close()
 | 
						|
        t.end()
 | 
						|
      })
 | 
						|
    })
 | 
						|
 | 
						|
    const rs = fs.createReadStream(filePath)
 | 
						|
    form.append('myField', 'hello')
 | 
						|
    form.append('myFile', rs)
 | 
						|
    pump(form, req, function (err) {
 | 
						|
      t.error(err, 'client pump: no err')
 | 
						|
    })
 | 
						|
  })
 | 
						|
})
 | 
						|
 | 
						|
test('addToBody with shared schema (async/await)', { skip: process.platform === 'win32' }, async (t) => {
 | 
						|
  const fastify = Fastify()
 | 
						|
  t.teardown(fastify.close.bind(fastify))
 | 
						|
 | 
						|
  await fastify.register(multipart, {
 | 
						|
    addToBody: true,
 | 
						|
    sharedSchemaId: 'mySharedSchema',
 | 
						|
    onFile: (fieldName, stream, filename, encoding, mimetype) => {
 | 
						|
      t.equal(fieldName, 'myFile')
 | 
						|
      t.equal(filename, 'README.md')
 | 
						|
      t.equal(encoding, '7bit')
 | 
						|
      t.equal(mimetype, 'text/markdown')
 | 
						|
      stream.resume()
 | 
						|
    }
 | 
						|
  })
 | 
						|
 | 
						|
  fastify.post('/', {
 | 
						|
    schema: {
 | 
						|
      body: {
 | 
						|
        type: 'object',
 | 
						|
        required: ['myField', 'myFile'],
 | 
						|
        properties: {
 | 
						|
          myField: { type: 'string' },
 | 
						|
          myFile: { type: 'array', items: fastify.getSchema('mySharedSchema') }
 | 
						|
        }
 | 
						|
      }
 | 
						|
    }
 | 
						|
  }, function (req, reply) {
 | 
						|
    t.equal(req.body.myField, 'hello')
 | 
						|
    t.match(req.body.myFile, [{
 | 
						|
      data: [],
 | 
						|
      encoding: '7bit',
 | 
						|
      filename: 'README.md',
 | 
						|
      limit: false,
 | 
						|
      mimetype: 'text/markdown'
 | 
						|
    }])
 | 
						|
    reply.send('ok')
 | 
						|
  })
 | 
						|
 | 
						|
  await fastify.listen({ port: 0 })
 | 
						|
 | 
						|
  // request
 | 
						|
  const form = new FormData()
 | 
						|
  const opts = {
 | 
						|
    protocol: 'http:',
 | 
						|
    hostname: 'localhost',
 | 
						|
    port: fastify.server.address().port,
 | 
						|
    path: '/',
 | 
						|
    headers: form.getHeaders(),
 | 
						|
    method: 'POST'
 | 
						|
  }
 | 
						|
 | 
						|
  return new Promise((resolve, reject) => {
 | 
						|
    const req = http.request(opts, (res) => {
 | 
						|
      t.equal(res.statusCode, 200)
 | 
						|
      res.resume()
 | 
						|
      res.on('end', () => {
 | 
						|
        t.pass('res ended successfully')
 | 
						|
        fastify.close()
 | 
						|
        resolve()
 | 
						|
      })
 | 
						|
    })
 | 
						|
 | 
						|
    const rs = fs.createReadStream(filePath)
 | 
						|
    form.append('myField', 'hello')
 | 
						|
    form.append('myFile', rs)
 | 
						|
    pump(form, req, function (err) {
 | 
						|
      t.error(err, 'client pump: no err')
 | 
						|
    })
 | 
						|
  })
 | 
						|
})
 | 
						|
 | 
						|
test('addToBody with shared schema error', { skip: process.platform === 'win32' }, (t) => {
 | 
						|
  t.plan(3)
 | 
						|
 | 
						|
  const fastify = Fastify()
 | 
						|
  t.teardown(fastify.close.bind(fastify))
 | 
						|
 | 
						|
  fastify.register(multipart, {
 | 
						|
    addToBody: true,
 | 
						|
    sharedSchemaId: 'mySharedSchema'
 | 
						|
  }).then(() => {
 | 
						|
    fastify.post('/', {
 | 
						|
      schema: {
 | 
						|
        body: {
 | 
						|
          type: 'object',
 | 
						|
          required: ['myField', 'myFile'],
 | 
						|
          properties: {
 | 
						|
            myField: { type: 'string' },
 | 
						|
            myFile: { type: 'array', items: fastify.getSchema('mySharedSchema') }
 | 
						|
          }
 | 
						|
        }
 | 
						|
      }
 | 
						|
    }, function (req, reply) {
 | 
						|
      reply.send('ok')
 | 
						|
    })
 | 
						|
 | 
						|
    fastify.listen({ port: 0 }, function () {
 | 
						|
      // request
 | 
						|
      const form = new FormData()
 | 
						|
      const opts = {
 | 
						|
        protocol: 'http:',
 | 
						|
        hostname: 'localhost',
 | 
						|
        port: fastify.server.address().port,
 | 
						|
        path: '/',
 | 
						|
        headers: form.getHeaders(),
 | 
						|
        method: 'POST'
 | 
						|
      }
 | 
						|
 | 
						|
      const req = http.request(opts, (res) => {
 | 
						|
        t.equal(res.statusCode, 400)
 | 
						|
        res.resume()
 | 
						|
        res.on('end', () => {
 | 
						|
          t.pass('res ended successfully')
 | 
						|
        })
 | 
						|
      })
 | 
						|
 | 
						|
      const rs = fs.createReadStream(filePath)
 | 
						|
      // missing the myField parameter
 | 
						|
      form.append('myFile', rs)
 | 
						|
      pump(form, req, function (err) {
 | 
						|
        t.error(err, 'client pump: no err')
 | 
						|
      })
 | 
						|
    })
 | 
						|
  })
 | 
						|
})
 | 
						|
 | 
						|
test('addToBody without files and shared schema', { skip: process.platform === 'win32' }, t => {
 | 
						|
  t.plan(5)
 | 
						|
 | 
						|
  const fastify = Fastify()
 | 
						|
  t.teardown(fastify.close.bind(fastify))
 | 
						|
 | 
						|
  const opts = {
 | 
						|
    addToBody: true,
 | 
						|
    sharedSchemaId: 'mySharedSchema',
 | 
						|
    onFile: (fieldName, stream, filename, encoding, mimetype) => {
 | 
						|
      t.fail('there are not stream')
 | 
						|
    }
 | 
						|
  }
 | 
						|
  fastify.register(multipart, opts)
 | 
						|
 | 
						|
  fastify.post('/', {
 | 
						|
    schema: {
 | 
						|
      body: {
 | 
						|
        type: 'object',
 | 
						|
        required: ['myField', 'myField2'],
 | 
						|
        properties: {
 | 
						|
          myField: { type: 'string' },
 | 
						|
          myField2: { type: 'string' }
 | 
						|
        }
 | 
						|
      }
 | 
						|
    }
 | 
						|
  }, function (req, reply) {
 | 
						|
    t.equal(req.body.myField, 'hello')
 | 
						|
    t.equal(req.body.myField2, 'world')
 | 
						|
 | 
						|
    reply.send('ok')
 | 
						|
  })
 | 
						|
 | 
						|
  fastify.listen({ port: 0 }, function () {
 | 
						|
    // request
 | 
						|
    const form = new FormData()
 | 
						|
    const opts = {
 | 
						|
      protocol: 'http:',
 | 
						|
      hostname: 'localhost',
 | 
						|
      port: fastify.server.address().port,
 | 
						|
      path: '/',
 | 
						|
      headers: form.getHeaders(),
 | 
						|
      method: 'POST'
 | 
						|
    }
 | 
						|
 | 
						|
    const req = http.request(opts, (res) => {
 | 
						|
      t.equal(res.statusCode, 200)
 | 
						|
      res.resume()
 | 
						|
      res.on('end', () => {
 | 
						|
        t.pass('res ended successfully')
 | 
						|
      })
 | 
						|
    })
 | 
						|
 | 
						|
    form.append('myField', 'hello')
 | 
						|
    form.append('myField2', 'world')
 | 
						|
    pump(form, req, function (err) {
 | 
						|
      t.error(err, 'client pump: no err')
 | 
						|
    })
 | 
						|
  })
 | 
						|
})
 | 
						|
 | 
						|
test('addToBody option does not change behaviour on not-multipart request', { skip: process.platform === 'win32' }, t => {
 | 
						|
  t.plan(2)
 | 
						|
 | 
						|
  const fastify = Fastify()
 | 
						|
  t.teardown(fastify.close.bind(fastify))
 | 
						|
 | 
						|
  fastify.register(multipart, { addToBody: true })
 | 
						|
  fastify.get('/', async (req, rep) => { rep.send('hello') })
 | 
						|
  fastify.post('/', function (req, reply) { })
 | 
						|
 | 
						|
  fastify.listen({ port: 0 }, function () {
 | 
						|
    fastify.inject({
 | 
						|
      method: 'GET',
 | 
						|
      url: '/',
 | 
						|
      port: fastify.server.address().port
 | 
						|
    }, (err, res) => {
 | 
						|
      t.error(err)
 | 
						|
      t.equal(res.payload, 'hello')
 | 
						|
    })
 | 
						|
  })
 | 
						|
})
 | 
						|
 | 
						|
test('addToBody with __proto__ field', t => {
 | 
						|
  t.plan(3)
 | 
						|
 | 
						|
  const fastify = Fastify()
 | 
						|
  t.teardown(fastify.close.bind(fastify))
 | 
						|
 | 
						|
  const opts = {
 | 
						|
    addToBody: true,
 | 
						|
    onFile: (fieldName, stream, filename, encoding, mimetype) => {
 | 
						|
      t.fail('there are not stream')
 | 
						|
    }
 | 
						|
  }
 | 
						|
  fastify.register(multipart, opts)
 | 
						|
 | 
						|
  fastify.post('/', function (req, reply) {
 | 
						|
    t.fail('should not be called')
 | 
						|
  })
 | 
						|
 | 
						|
  fastify.listen({ port: 0 }, function () {
 | 
						|
    // request
 | 
						|
    const form = new FormData()
 | 
						|
    const opts = {
 | 
						|
      protocol: 'http:',
 | 
						|
      hostname: 'localhost',
 | 
						|
      port: fastify.server.address().port,
 | 
						|
      path: '/',
 | 
						|
      headers: form.getHeaders(),
 | 
						|
      method: 'POST'
 | 
						|
    }
 | 
						|
 | 
						|
    const req = http.request(opts, (res) => {
 | 
						|
      t.equal(res.statusCode, 500)
 | 
						|
      res.resume()
 | 
						|
      res.on('end', () => {
 | 
						|
        t.pass('res ended successfully')
 | 
						|
      })
 | 
						|
    })
 | 
						|
 | 
						|
    form.append('myField', 'hello')
 | 
						|
    form.append('__proto__', 'world')
 | 
						|
    pump(form, req, function (err) {
 | 
						|
      t.error(err, 'client pump: no err')
 | 
						|
    })
 | 
						|
  })
 | 
						|
})
 | 
						|
 | 
						|
test('addToBody with constructor field', t => {
 | 
						|
  t.plan(3)
 | 
						|
 | 
						|
  const fastify = Fastify()
 | 
						|
  t.teardown(fastify.close.bind(fastify))
 | 
						|
 | 
						|
  const opts = {
 | 
						|
    addToBody: true,
 | 
						|
    onFile: (fieldName, stream, filename, encoding, mimetype) => {
 | 
						|
      t.fail('there are not stream')
 | 
						|
    }
 | 
						|
  }
 | 
						|
  fastify.register(multipart, opts)
 | 
						|
 | 
						|
  fastify.post('/', function (req, reply) {
 | 
						|
    t.fail('should not be called')
 | 
						|
  })
 | 
						|
 | 
						|
  fastify.listen({ port: 0 }, function () {
 | 
						|
    // request
 | 
						|
    const form = new FormData()
 | 
						|
    const opts = {
 | 
						|
      protocol: 'http:',
 | 
						|
      hostname: 'localhost',
 | 
						|
      port: fastify.server.address().port,
 | 
						|
      path: '/',
 | 
						|
      headers: form.getHeaders(),
 | 
						|
      method: 'POST'
 | 
						|
    }
 | 
						|
 | 
						|
    const req = http.request(opts, (res) => {
 | 
						|
      t.equal(res.statusCode, 500)
 | 
						|
      res.resume()
 | 
						|
      res.on('end', () => {
 | 
						|
        t.pass('res ended successfully')
 | 
						|
      })
 | 
						|
    })
 | 
						|
 | 
						|
    form.append('myField', 'hello')
 | 
						|
    form.append('constructor', 'world')
 | 
						|
    pump(form, req, function (err) {
 | 
						|
      t.error(err, 'client pump: no err')
 | 
						|
    })
 | 
						|
  })
 | 
						|
})
 |