rsnext/test/e2e/app-dir/x-forwarded-headers/x-forwarded-headers.test.ts
Tom Milewski c26c7713b5
fix: set x-forwarded-host based on request (#58500)
Co-authored-by: @BRKalow <bryce@clerk.dev>

### What?

A number of our customers have been experiencing issues stemming from an
`x-forwarded-host` header that doesn't match the `host` header.

### Why?

[This PR](https://github.com/vercel/next.js/pull/57815) removes
functionality which sets `x-forwarded-host` to `req.headers['host']` and
relies solely on the server's hostname and port.

This can be seen locally when visiting the app via a localhost
subdomain.

The `x-forwarded-host` header will remain as `localhost:${port}` while
the actual requested host will contain the subdomain.

### Related 

- https://github.com/vercel/next.js/pull/57815#issuecomment-1808496790

---------

Co-authored-by: BRKalow <bryce@clerk.dev>
Co-authored-by: Zack Tanner <zacktanner@gmail.com>
2023-11-16 12:00:41 +01:00

67 lines
2.5 KiB
TypeScript

import { createNextDescribe } from 'e2e-utils'
createNextDescribe('x-forwarded-headers', { files: __dirname }, ({ next }) => {
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)
})
})
})