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.
172 lines
4.8 KiB
172 lines
4.8 KiB
4 years ago
|
'use strict'
|
||
|
|
||
|
const t = require('tap')
|
||
|
const test = t.test
|
||
|
const sget = require('simple-get').concat
|
||
|
const fastify = require('..')
|
||
|
|
||
|
const sgetForwardedRequest = (app, forHeader, path) => {
|
||
|
sget({
|
||
|
method: 'GET',
|
||
|
headers: {
|
||
|
'X-Forwarded-For': forHeader,
|
||
|
'X-Forwarded-Host': 'example.com'
|
||
|
},
|
||
|
url: 'http://localhost:' + app.server.address().port + path
|
||
|
}, () => {})
|
||
|
}
|
||
|
|
||
|
const testRequestValues = (t, req, options) => {
|
||
|
if (options.ip) {
|
||
|
if (options.modifyCoreObjects) {
|
||
|
t.ok(req.raw.ip, 'ip is defined')
|
||
|
t.equal(req.raw.ip, options.ip, 'gets ip from x-forwarded-for')
|
||
|
}
|
||
|
t.ok(req.ip, 'ip is defined')
|
||
|
t.equal(req.ip, options.ip, 'gets ip from x-forwarded-for')
|
||
|
}
|
||
|
if (options.hostname) {
|
||
|
if (options.modifyCoreObjects) {
|
||
|
t.ok(req.raw.hostname, 'hostname is defined')
|
||
|
t.equal(req.raw.hostname, options.hostname, 'gets hostname from x-forwarded-host')
|
||
|
}
|
||
|
t.ok(req.hostname, 'hostname is defined')
|
||
|
t.equal(req.hostname, options.hostname, 'gets hostname from x-forwarded-host')
|
||
|
}
|
||
|
if (options.ips) {
|
||
|
if (options.modifyCoreObjects) {
|
||
|
t.deepEqual(req.raw.ips, options.ips, 'gets ips from x-forwarded-for')
|
||
|
}
|
||
|
t.deepEqual(req.ips, options.ips, 'gets ips from x-forwarded-for')
|
||
|
}
|
||
|
}
|
||
|
|
||
|
test('trust proxy, add properties to node req', (t) => {
|
||
|
t.plan(15)
|
||
|
const modifyCoreObjects = true
|
||
|
const app = fastify({
|
||
|
trustProxy: true,
|
||
|
modifyCoreObjects
|
||
|
})
|
||
|
app.get('/trustproxy', function (req, reply) {
|
||
|
testRequestValues(t, req, { ip: '1.1.1.1', hostname: 'example.com', modifyCoreObjects })
|
||
|
reply.code(200).send({ ip: req.ip, hostname: req.hostname })
|
||
|
})
|
||
|
|
||
|
app.get('/trustproxychain', function (req, reply) {
|
||
|
testRequestValues(t, req, { ip: '2.2.2.2', ips: ['127.0.0.1', '1.1.1.1', '2.2.2.2'], modifyCoreObjects })
|
||
|
reply.code(200).send({ ip: req.ip, hostname: req.hostname })
|
||
|
})
|
||
|
|
||
|
t.tearDown(app.close.bind(app))
|
||
|
|
||
|
app.listen(0, (err) => {
|
||
|
app.server.unref()
|
||
|
t.error(err)
|
||
|
sgetForwardedRequest(app, '1.1.1.1', '/trustproxy')
|
||
|
sgetForwardedRequest(app, '2.2.2.2, 1.1.1.1', '/trustproxychain')
|
||
|
})
|
||
|
})
|
||
|
|
||
|
test('trust proxy, not add properties to node req', (t) => {
|
||
|
t.plan(8)
|
||
|
const app = fastify({
|
||
|
trustProxy: true
|
||
|
})
|
||
|
app.get('/trustproxy', function (req, reply) {
|
||
|
testRequestValues(t, req, { ip: '1.1.1.1', hostname: 'example.com' })
|
||
|
reply.code(200).send({ ip: req.ip, hostname: req.hostname })
|
||
|
})
|
||
|
|
||
|
app.get('/trustproxychain', function (req, reply) {
|
||
|
testRequestValues(t, req, { ip: '2.2.2.2', ips: ['127.0.0.1', '1.1.1.1', '2.2.2.2'] })
|
||
|
reply.code(200).send({ ip: req.ip, hostname: req.hostname })
|
||
|
})
|
||
|
|
||
|
t.tearDown(app.close.bind(app))
|
||
|
|
||
|
app.listen(0, (err) => {
|
||
|
app.server.unref()
|
||
|
t.error(err)
|
||
|
sgetForwardedRequest(app, '1.1.1.1', '/trustproxy')
|
||
|
sgetForwardedRequest(app, '2.2.2.2, 1.1.1.1', '/trustproxychain')
|
||
|
})
|
||
|
})
|
||
|
|
||
|
test('trust proxy chain', (t) => {
|
||
|
t.plan(3)
|
||
|
const app = fastify({
|
||
|
trustProxy: ['127.0.0.1', '192.168.1.1']
|
||
|
})
|
||
|
|
||
|
app.get('/trustproxychain', function (req, reply) {
|
||
|
testRequestValues(t, req, { ip: '1.1.1.1' })
|
||
|
reply.code(200).send({ ip: req.ip, hostname: req.hostname })
|
||
|
})
|
||
|
|
||
|
t.tearDown(app.close.bind(app))
|
||
|
|
||
|
app.listen(0, (err) => {
|
||
|
app.server.unref()
|
||
|
t.error(err)
|
||
|
sgetForwardedRequest(app, '192.168.1.1, 1.1.1.1', '/trustproxychain')
|
||
|
})
|
||
|
})
|
||
|
|
||
|
test('trust proxy function', (t) => {
|
||
|
t.plan(3)
|
||
|
const app = fastify({
|
||
|
trustProxy: (address) => address === '127.0.0.1'
|
||
|
})
|
||
|
app.get('/trustproxyfunc', function (req, reply) {
|
||
|
testRequestValues(t, req, { ip: '1.1.1.1' })
|
||
|
reply.code(200).send({ ip: req.ip, hostname: req.hostname })
|
||
|
})
|
||
|
|
||
|
t.tearDown(app.close.bind(app))
|
||
|
|
||
|
app.listen(0, (err) => {
|
||
|
app.server.unref()
|
||
|
t.error(err)
|
||
|
sgetForwardedRequest(app, '1.1.1.1', '/trustproxyfunc')
|
||
|
})
|
||
|
})
|
||
|
|
||
|
test('trust proxy number', (t) => {
|
||
|
t.plan(4)
|
||
|
const app = fastify({
|
||
|
trustProxy: 1
|
||
|
})
|
||
|
app.get('/trustproxynumber', function (req, reply) {
|
||
|
testRequestValues(t, req, { ip: '1.1.1.1', ips: ['127.0.0.1', '1.1.1.1'] })
|
||
|
reply.code(200).send({ ip: req.ip, hostname: req.hostname })
|
||
|
})
|
||
|
|
||
|
t.tearDown(app.close.bind(app))
|
||
|
|
||
|
app.listen(0, (err) => {
|
||
|
app.server.unref()
|
||
|
t.error(err)
|
||
|
sgetForwardedRequest(app, '2.2.2.2, 1.1.1.1', '/trustproxynumber')
|
||
|
})
|
||
|
})
|
||
|
|
||
|
test('trust proxy IP addresses', (t) => {
|
||
|
t.plan(4)
|
||
|
const app = fastify({
|
||
|
trustProxy: '127.0.0.1, 2.2.2.2'
|
||
|
})
|
||
|
app.get('/trustproxyipaddrs', function (req, reply) {
|
||
|
testRequestValues(t, req, { ip: '1.1.1.1', ips: ['127.0.0.1', '1.1.1.1'] })
|
||
|
reply.code(200).send({ ip: req.ip, hostname: req.hostname })
|
||
|
})
|
||
|
|
||
|
t.tearDown(app.close.bind(app))
|
||
|
|
||
|
app.listen(0, (err) => {
|
||
|
app.server.unref()
|
||
|
t.error(err)
|
||
|
sgetForwardedRequest(app, '3.3.3.3, 2.2.2.2, 1.1.1.1', '/trustproxyipaddrs')
|
||
|
})
|
||
|
})
|