diff --git a/packages/core/src/vendor/getIpAddress.ts b/packages/core/src/vendor/getIpAddress.ts index da71a42f0778..92f7a194047f 100644 --- a/packages/core/src/vendor/getIpAddress.ts +++ b/packages/core/src/vendor/getIpAddress.ts @@ -52,10 +52,18 @@ export const ipHeaderNames = [ * will be returned. */ export function getClientIPAddress(headers: { [key: string]: string | string[] | undefined }): string | null { + // Build a map of lowercase header names to their values for case-insensitive lookup + // This is needed because headers from different sources may have different casings + const lowerCaseHeaders: { [key: string]: string | string[] | undefined } = {}; + + for (const key of Object.keys(headers)) { + lowerCaseHeaders[key.toLowerCase()] = headers[key]; + } + // This will end up being Array because of the various possible values a header // can take const headerValues = ipHeaderNames.map((headerName: string) => { - const rawValue = headers[headerName]; + const rawValue = lowerCaseHeaders[headerName.toLowerCase()]; const value = Array.isArray(rawValue) ? rawValue.join(';') : rawValue; if (headerName === 'Forwarded') { diff --git a/packages/core/test/lib/vendor/getClientIpAddress.test.ts b/packages/core/test/lib/vendor/getClientIpAddress.test.ts index ee530566ad60..0ee1948385f0 100644 --- a/packages/core/test/lib/vendor/getClientIpAddress.test.ts +++ b/packages/core/test/lib/vendor/getClientIpAddress.test.ts @@ -29,4 +29,13 @@ describe('getClientIPAddress', () => { expect(ip).toEqual(expectedIP); }); + + it('should find headers regardless of case', () => { + const headers = { + 'Cf-Connecting-Ip': '1.1.1.1', + }; + + const ip = getClientIPAddress(headers); + expect(ip).toEqual('1.1.1.1'); + }); });