bug: API Gateway REST body validation applies the application/json model to unmatched content types #65
AndreKurait
started this conversation in
Bugs (AWS)
Replies: 1 comment
|
Hi @AndreKurait. Thanks for the report. The issue was fixed in the localstack/localstack:dev image. Please update the image and try again. Let me know how it goes. |
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Additional version check — 2026-10-08
Still reproduced: the two matching-content-type controls pass, while both unmatched content types incorrectly return HTTP 400.
The comparison used an unmodified
localstack/localstack-pro:2026.8.1Linux ARM64 image,repository digest
sha256:4aef81c531684570d7b3cfd2805afa02194c929d52bbeedabb7d4874798b1572.Vendor packages were
localstack-core 2026.8.1,moto-ext 5.1.48, and bundledboto3/botocore 1.43.78. HTTP probes used a separateboto3/botocore 1.43.101client; the process-local security-group probe used the bundled interpreter.
The same scripts were used, with no custom extensions or provider source changes.
Owned test containers and the disposable network were removed.
This is a second specifically tested version, not a claim to have tested the latest release.
Existing report search
I searched the LocalStack issue tracker and current organization Discussions for this operation and failure. I did not find an existing report for this exact reproduction.
Current behavior
A REST API POST method enables body validation and declares only
{"application/json": "RequiredValue"}as its request-model mapping. That model requires a string property namedvalue. There is no$defaultmodel.application/json{}application/json{"value":"ok"}application/x-amz-json-1.1{}text/plain{}The MOCK integration explicitly defines templates for all three tested content types, so integration passthrough/template selection does not account for the 400 responses.
All four results were reproduced through public APIs on a fresh, unmodified LocalStack container. The script deletes the API and verifies its absence.
Expected behavior
Skip body validation when no request model matches the content type and no
$defaultmodel is configured. The exact-match model should still validateapplication/jsonrequests. Request-parameter validation and integration-template selection are independent.Reference: API Gateway request validation.
The comparison to AWS is based on this documented contract; an equivalent live AWS run has not been performed.
Environment
localstack/localstack-pro:2026.7.5.sha256:0d74e1d2d7ce13a3cb25fc64cf15eb225f1c95c762e56e057bc6a9ed0ed29306.localstack-core 2026.7.5,moto-ext 5.1.46,moto.__version__ = 5.1.21.dev,boto3/botocore 1.43.51.Fresh confirmation on 2026-10-08: the same discrepancy reproduced on Linux ARM64 against the same unmodified image, using a separate
boto3/botocore 1.43.101client. The disposable container and network were removed after the run. The startup block below includes the run's disabled DNS listener/default EC2-image downloads and temporary state storage; no provider source or extension was changed.Steps to reproduce
Start a disposable instance on a free loopback port:
Run the block in a disposable shell. Port 4567 must be free. The client needs
boto3; it uses only dummy credentials and a loopback endpoint. It creates disposable resources and cleans them up infinally; the shell trap removes the container even when the script reports failure. A nonzero exit is expected while the reported discrepancy is present. No Docker socket mount or application services are required.Complete standalone reproducer: apigateway_model_content_type.py
All reactions