diff --git a/packages/parser/src/schemas/api-gateway.ts b/packages/parser/src/schemas/api-gateway.ts index 9baa7c322e..98cbe70ae1 100644 --- a/packages/parser/src/schemas/api-gateway.ts +++ b/packages/parser/src/schemas/api-gateway.ts @@ -30,7 +30,9 @@ const APIGatewayEventIdentity = z.object({ * * See aws-powertools/powertools-lambda-python#1562 for more information. */ - sourceIp: z.union([z.ipv4(), z.literal('test-invoke-source-ip')]).optional(), + sourceIp: z + .union([z.ipv4(), z.ipv6(), z.literal('test-invoke-source-ip')]) + .optional(), user: z.string().nullish(), userAgent: z.string().nullish(), userArn: z.string().nullish(), diff --git a/packages/parser/src/schemas/api-gatewayv2.ts b/packages/parser/src/schemas/api-gatewayv2.ts index bff5fdfdd6..5bfb0c3a59 100644 --- a/packages/parser/src/schemas/api-gatewayv2.ts +++ b/packages/parser/src/schemas/api-gatewayv2.ts @@ -110,7 +110,7 @@ const APIGatewayRequestContextV2Schema = z.object({ method: APIGatewayHttpMethod, path: z.string(), protocol: z.string(), - sourceIp: z.ipv4(), + sourceIp: z.union([z.ipv4(), z.ipv6()]), userAgent: z.string(), }), requestId: z.string(), diff --git a/packages/parser/tests/unit/schema/apigw.test.ts b/packages/parser/tests/unit/schema/apigw.test.ts index 62f92aabec..4f6567348a 100644 --- a/packages/parser/tests/unit/schema/apigw.test.ts +++ b/packages/parser/tests/unit/schema/apigw.test.ts @@ -4,6 +4,7 @@ import { APIGatewayRequestAuthorizerEventSchema, APIGatewayTokenAuthorizerEventSchema, } from '../../../src/schemas/index.js'; +import type { APIGatewayProxyEvent } from '../../../src/types/schema.js'; import { getTestEvent } from '../helpers/utils.js'; describe('Schema: API Gateway REST', () => { @@ -98,6 +99,40 @@ describe('Schema: API Gateway REST', () => { // Assess expect(parsedEvent).toEqual(event); }); + it('parses an event with IPv6 sourceIp', () => { + // Prepare + const event = getTestEvent({ + eventsPath, + filename: 'no-auth', + }); + // Add IPv6 address to the event + event.requestContext.identity.sourceIp = + '2001:0db8:85a3:0000:0000:8a2e:0370:7334'; + + // Act + const parsedEvent = APIGatewayProxyEventSchema.parse(event); + + // Assess + expect(parsedEvent.requestContext.identity.sourceIp).toEqual( + '2001:0db8:85a3:0000:0000:8a2e:0370:7334' + ); + }); + + it('parses an event with shortened IPv6 sourceIp', () => { + // Prepare + const event = getTestEvent({ + eventsPath, + filename: 'no-auth', + }); + // Add shortened IPv6 address to the event + event.requestContext.identity.sourceIp = '::1'; + + // Act + const parsedEvent = APIGatewayProxyEventSchema.parse(event); + + // Assess + expect(parsedEvent.requestContext.identity.sourceIp).toEqual('::1'); + }); }); describe('APIGatewayRequestAuthorizerEventSchema', () => { diff --git a/packages/parser/tests/unit/schema/apigwv2.test.ts b/packages/parser/tests/unit/schema/apigwv2.test.ts index a205470143..e470bbec19 100644 --- a/packages/parser/tests/unit/schema/apigwv2.test.ts +++ b/packages/parser/tests/unit/schema/apigwv2.test.ts @@ -45,6 +45,41 @@ describe('Schema: API Gateway HTTP (v2)', () => { expect(parsedEvent).toEqual(event); }); + it('parses an event with IPv6 sourceIp', () => { + // Prepare + const event = getTestEvent({ + eventsPath, + filename: 'no-auth', + }); + // Add IPv6 address to the event + event.requestContext.http.sourceIp = + '2001:0db8:85a3:0000:0000:8a2e:0370:7334'; + + // Act + const parsedEvent = APIGatewayProxyEventV2Schema.parse(event); + + // Assess + expect(parsedEvent.requestContext.http.sourceIp).toEqual( + '2001:0db8:85a3:0000:0000:8a2e:0370:7334' + ); + }); + + it('parses an event with shortened IPv6 sourceIp', () => { + // Prepare + const event = getTestEvent({ + eventsPath, + filename: 'no-auth', + }); + // Add shortened IPv6 address to the event + event.requestContext.http.sourceIp = '::1'; + + // Act + const parsedEvent = APIGatewayProxyEventV2Schema.parse(event); + + // Assess + expect(parsedEvent.requestContext.http.sourceIp).toEqual('::1'); + }); + it('parses an event with a JWT authorizer', () => { // Prepare const event = getTestEvent({