next.js/test/e2e/app-dir/x-forwarded-headers/x-forwarded-headers.test.ts
x-forwarded-headers.test.ts88 lines3.0 KB
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')
    })
  })
})
Quest for Codev2.0.0
/
SIGN IN