import { nextTestSetup } from 'e2e-utils' describe('x-forwarded-headers', () => { const { next, skipped } = nextTestSetup({ files: __dirname, // This test is skipped because it sends requests with manipulated host headers // which doesn't work in a deployed environment skipDeployment: true, }) if (skipped) return it('should include x-forwarded-* headers', async () => { const res = await next.fetch('/') const headers = await res.json() const url = new URL(next.url) expect(headers['x-forwarded-host']).toBe(url.host) expect(headers['x-forwarded-port']).toBe(url.port) expect(headers['x-forwarded-proto']).toBe(url.protocol.replace(':', '')) expect(headers['middleware-x-forwarded-host']).toBe(url.host) expect(headers['middleware-x-forwarded-port']).toBe(url.port) expect(headers['middleware-x-forwarded-proto']).toBe( url.protocol.replace(':', '') ) }) describe('host header exists', () => { it('should include x-forwarded-* headers relative to host', async () => { const url = new URL(next.url) const reqHeaders = { host: `subdomain.localhost:${url.port}`, } const res = await next.fetch('/', { headers: reqHeaders, }) const headers = await res.json() expect(headers['x-forwarded-host']).toBe(reqHeaders.host) expect(headers['x-forwarded-port']).toBe(url.port) expect(headers['x-forwarded-proto']).toBe(url.protocol.replace(':', '')) expect(headers['middleware-x-forwarded-host']).toBe(reqHeaders.host) expect(headers['middleware-x-forwarded-port']).toBe(url.port) expect(headers['middleware-x-forwarded-proto']).toBe( url.protocol.replace(':', '') ) }) }) describe('already assigned', () => { it('should not override existing x-forwarded-* headers', async () => { const url = new URL(next.url) const reqHeaders = { host: `subdomain.localhost:${url.port}`, port: '1234', proto: 'https', } const res = await next.fetch('/', { headers: { host: 'override.localhost', 'x-forwarded-host': reqHeaders.host, 'x-forwarded-port': reqHeaders.port, 'x-forwarded-proto': reqHeaders.proto, }, }) const headers = await res.json() expect(headers['x-forwarded-host']).toBe(reqHeaders.host) expect(headers['x-forwarded-port']).toBe(reqHeaders.port) expect(headers['x-forwarded-proto']).toBe(reqHeaders.proto) expect(headers['middleware-x-forwarded-host']).toBe(reqHeaders.host) expect(headers['middleware-x-forwarded-port']).toBe(reqHeaders.port) expect(headers['middleware-x-forwarded-proto']).toBe(reqHeaders.proto) }) it('should work with multiple x-forwarded-* headers', async () => { const res = await next.fetch('/', { headers: { 'x-forwarded-proto': 'https, https' }, }) expect(res.status).toBe(200) const headers = await res.json() expect(headers['x-forwarded-proto']).toBe('https, https') }) }) })