Closed
Description
Expected Behaviour
I think I would expect (global) middleware to be triggered when a not-found route is used. I have middleware that implements desirable behaviour even when the route is not found.
Current Behaviour
Currently global middleware seems to be bypassed when a not found route is hit.
Code snippet
from aws_lambda_powertools.event_handler import APIGatewayRestResolver, Response
from aws_lambda_powertools.event_handler.middlewares import NextMiddleware
def test_resolve():
def log_middleware(
app: APIGatewayRestResolver, next_middleware: NextMiddleware
) -> Response:
print("middleware before")
return next_middleware(app)
app = APIGatewayRestResolver()
app.use(middlewares=[log_middleware])
@app.get("/listItems")
def list_items():
return [{"id": 1}, {"id": 2}]
@app.not_found
def not_found(exc):
return Response(status_code=404)
# calling this triggers middleware
app.resolve(
{
"path": "/listItems",
"httpMethod": "GET",
"requestContext": {},
},
{},
)
# calling this does not trigger middleware
app.resolve(
{
"path": "/junk",
"httpMethod": "GET",
"requestContext": {},
},
{},
)
Possible Solution
The solution I've used currently is to use catch all route handlers to sweep up any unexpected routes, which looks to app like a "valid" route. This means middleware is triggered.
Another solution would be to trigger global middleware before route resolution.
Steps to Reproduce
I think I've supplied enough context. The above code snippet should run under pytest -rP
Please let me know if more is needed.
Powertools for AWS Lambda (Python) version
latest
AWS Lambda function runtime
3.11
Packaging format used
PyPi
Debugging logs
No response
Metadata
Metadata
Assignees
Labels
Type
Projects
Status
Shipped