From 3163f27b0911e10e7c9dff15d992f7a4247cc5df Mon Sep 17 00:00:00 2001 From: Leandro Damascena Date: Sat, 20 Jun 2026 11:44:42 +0100 Subject: [PATCH 1/2] refactor: promote HttpResolver to stable --- .../event_handler/http_resolver.py | 20 ++++++------------- docs/core/event_handler/api_gateway.md | 2 +- docs/includes/_http_resolver_local.md | 8 ++------ .../_pydantic/test_http_resolver_pydantic.py | 4 ---- .../test_http_resolver.py | 6 +----- 5 files changed, 10 insertions(+), 30 deletions(-) diff --git a/aws_lambda_powertools/event_handler/http_resolver.py b/aws_lambda_powertools/event_handler/http_resolver.py index 6ec0b064974..7206dbe6f1c 100644 --- a/aws_lambda_powertools/event_handler/http_resolver.py +++ b/aws_lambda_powertools/event_handler/http_resolver.py @@ -1,7 +1,6 @@ from __future__ import annotations import base64 -import warnings from typing import TYPE_CHECKING, Any, Callable from urllib.parse import parse_qs @@ -162,21 +161,16 @@ def get_remaining_time_in_millis(self) -> int: # pragma: no cover class HttpResolverLocal(ApiGatewayResolver): """ - ASGI-compatible HTTP resolver for local development and testing. + ASGI-compatible HTTP resolver. - This resolver is designed specifically for local development workflows. - It allows you to run your Powertools application locally with any ASGI server + It allows you to run your Powertools application with any ASGI server (uvicorn, hypercorn, daphne, etc.) while maintaining full compatibility with Lambda. The same code works in both environments - locally via ASGI and in Lambda via the handler. + If your Lambda is behind Lambda Web Adapter or any other HTTP proxy, it works seamlessly. Supports both sync and async route handlers. - WARNING - ------- - This is intended for local development and testing only. - The API may change in future releases. Do not use in production environments. - Example ------- ```python @@ -210,11 +204,6 @@ def __init__( strip_prefixes: list[str | Any] | None = None, enable_validation: bool = False, ): - warnings.warn( - "HttpResolverLocal is intended for local development and testing only. " - "The API may change in future releases. Do not use in production environments.", - stacklevel=2, - ) super().__init__( proxy_type=ProxyEventType.APIGatewayProxyEvent, # Use REST API format internally cors=cors, @@ -351,3 +340,6 @@ async def _send_response(self, send: Callable, response: dict) -> None: "body": body_bytes, }, ) + + +HttpResolver = HttpResolverLocal diff --git a/docs/core/event_handler/api_gateway.md b/docs/core/event_handler/api_gateway.md index c4508976157..67bb07a25cc 100644 --- a/docs/core/event_handler/api_gateway.md +++ b/docs/core/event_handler/api_gateway.md @@ -64,7 +64,7 @@ By default, we will use `APIGatewayRestResolver` throughout the documentation. Y | **[`ALBResolver`](#application-load-balancer)** | Amazon Application Load Balancer (ALB) | | **[`LambdaFunctionUrlResolver`](#lambda-function-url)** | AWS Lambda Function URL | | **[`VPCLatticeResolver`](#vpc-lattice)** | Amazon VPC Lattice | -| **[`HttpResolverLocal`](#http-resolver-local)** | Local development with ASGI servers | +| **[`HttpResolverLocal`](#http-resolver-local)** | ASGI-compatible resolver | #### Response auto-serialization diff --git a/docs/includes/_http_resolver_local.md b/docs/includes/_http_resolver_local.md index a9789a54746..496b42eb4f2 100644 --- a/docs/includes/_http_resolver_local.md +++ b/docs/includes/_http_resolver_local.md @@ -1,11 +1,7 @@ -#### Http Resolver (Local Development) +#### Http Resolver (ASGI) -???+ warning "Local Development Only" - `HttpResolverLocal` is intended for local development and testing only. - The API may change in future releases. **Do not use in production environments.** - -When developing locally, you can use `HttpResolverLocal` to run your API with any ASGI server like [uvicorn](https://www.uvicorn.org/){target="_blank"}. It implements the [ASGI specification](https://asgi.readthedocs.io/){target="_blank"}, is lightweight with no external dependencies, and the same code works on any compute platform, including Lambda. +`HttpResolver` is an ASGI-compatible resolver that lets you run your Powertools application with any ASGI server like [uvicorn](https://www.uvicorn.org/){target="_blank"}. It implements the [ASGI specification](https://asgi.readthedocs.io/){target="_blank"}, is lightweight with no external dependencies, and works seamlessly with Lambda or any environment that speaks HTTP. If your Lambda is behind [Lambda Web Adapter](https://github.com/awslabs/aws-lambda-web-adapter){target="_blank"} or any other HTTP proxy that speaks the HTTP protocol, it works seamlessly. diff --git a/tests/functional/event_handler/_pydantic/test_http_resolver_pydantic.py b/tests/functional/event_handler/_pydantic/test_http_resolver_pydantic.py index 7cab58a1b70..e088527e359 100644 --- a/tests/functional/event_handler/_pydantic/test_http_resolver_pydantic.py +++ b/tests/functional/event_handler/_pydantic/test_http_resolver_pydantic.py @@ -13,10 +13,6 @@ from aws_lambda_powertools.event_handler.http_resolver import MockLambdaContext from aws_lambda_powertools.event_handler.openapi.params import Query -# Suppress warning for all tests -pytestmark = pytest.mark.filterwarnings("ignore:HttpResolverLocal is intended for local development") - - # ============================================================================= # ASGI Test Helpers # ============================================================================= diff --git a/tests/functional/event_handler/required_dependencies/test_http_resolver.py b/tests/functional/event_handler/required_dependencies/test_http_resolver.py index ada85cf59fc..4665812e64a 100644 --- a/tests/functional/event_handler/required_dependencies/test_http_resolver.py +++ b/tests/functional/event_handler/required_dependencies/test_http_resolver.py @@ -1,4 +1,4 @@ -"""Tests for HttpResolverLocal - ASGI-compatible HTTP resolver for local development.""" +"""Tests for HttpResolverLocal - ASGI-compatible HTTP resolver.""" from __future__ import annotations @@ -11,10 +11,6 @@ from aws_lambda_powertools.event_handler import HttpResolverLocal, Response from aws_lambda_powertools.event_handler.http_resolver import MockLambdaContext -# Suppress warning for all tests -pytestmark = pytest.mark.filterwarnings("ignore:HttpResolverLocal is intended for local development") - - # ============================================================================= # ASGI Test Helpers # ============================================================================= From 8ba42a964f7d131e4871c9dad5d13c3a801cb214 Mon Sep 17 00:00:00 2001 From: Leandro Damascena Date: Sat, 20 Jun 2026 16:26:29 +0100 Subject: [PATCH 2/2] refactor: promote HttpResolver to stable --- aws_lambda_powertools/event_handler/__init__.py | 3 ++- examples/event_handler_rest/src/http_resolver_basic.py | 4 ++-- .../src/http_resolver_exception_handling.py | 4 ++-- .../src/http_resolver_validation_swagger.py | 4 ++-- 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/aws_lambda_powertools/event_handler/__init__.py b/aws_lambda_powertools/event_handler/__init__.py index 98433b2e29b..2e4c008ec63 100644 --- a/aws_lambda_powertools/event_handler/__init__.py +++ b/aws_lambda_powertools/event_handler/__init__.py @@ -18,7 +18,7 @@ ) from aws_lambda_powertools.event_handler.depends import DependencyResolutionError, Depends from aws_lambda_powertools.event_handler.events_appsync.appsync_events import AppSyncEventsResolver -from aws_lambda_powertools.event_handler.http_resolver import HttpResolverLocal +from aws_lambda_powertools.event_handler.http_resolver import HttpResolver, HttpResolverLocal from aws_lambda_powertools.event_handler.lambda_function_url import ( LambdaFunctionUrlResolver, ) @@ -39,6 +39,7 @@ "CORSConfig", "Depends", "DependencyResolutionError", + "HttpResolver", "HttpResolverLocal", "LambdaFunctionUrlResolver", "Request", diff --git a/examples/event_handler_rest/src/http_resolver_basic.py b/examples/event_handler_rest/src/http_resolver_basic.py index 63d291c8e47..7f6aaadc57d 100644 --- a/examples/event_handler_rest/src/http_resolver_basic.py +++ b/examples/event_handler_rest/src/http_resolver_basic.py @@ -1,6 +1,6 @@ -from aws_lambda_powertools.event_handler import HttpResolverLocal +from aws_lambda_powertools.event_handler import HttpResolver -app = HttpResolverLocal() +app = HttpResolver() @app.get("/hello/") diff --git a/examples/event_handler_rest/src/http_resolver_exception_handling.py b/examples/event_handler_rest/src/http_resolver_exception_handling.py index 787687e6248..7a952812017 100644 --- a/examples/event_handler_rest/src/http_resolver_exception_handling.py +++ b/examples/event_handler_rest/src/http_resolver_exception_handling.py @@ -1,6 +1,6 @@ -from aws_lambda_powertools.event_handler import HttpResolverLocal, Response +from aws_lambda_powertools.event_handler import HttpResolver, Response -app = HttpResolverLocal() +app = HttpResolver() class NotFoundError(Exception): diff --git a/examples/event_handler_rest/src/http_resolver_validation_swagger.py b/examples/event_handler_rest/src/http_resolver_validation_swagger.py index 2c694c87bcc..d35e7964b9e 100644 --- a/examples/event_handler_rest/src/http_resolver_validation_swagger.py +++ b/examples/event_handler_rest/src/http_resolver_validation_swagger.py @@ -1,6 +1,6 @@ from pydantic import BaseModel -from aws_lambda_powertools.event_handler import HttpResolverLocal +from aws_lambda_powertools.event_handler import HttpResolver class User(BaseModel): @@ -8,7 +8,7 @@ class User(BaseModel): age: int -app = HttpResolverLocal(enable_validation=True) +app = HttpResolver(enable_validation=True) app.enable_swagger( title="My API",