Core: Allow compressed requests for query-protocol (#7382)

This commit is contained in:
Bert Blommers 2024-02-21 22:03:38 +00:00 committed by GitHub
parent f9add957c9
commit cfbc275e02
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 40 additions and 4 deletions

View File

@ -343,8 +343,6 @@ class BaseResponse(_TemplateEnvironmentMixin, ActionAuthenticatorMixin):
if hasattr(self.body, "read"):
self.body = self.body.read()
raw_body = self.body
# https://github.com/getmoto/moto/issues/6692
# Content coming from SDK's can be GZipped for performance reasons
if (
@ -379,7 +377,7 @@ class BaseResponse(_TemplateEnvironmentMixin, ActionAuthenticatorMixin):
OrderedDict(
(key, [value])
for key, value in parse_qsl(
raw_body, keep_blank_values=True
self.body, keep_blank_values=True
)
)
)

View File

@ -2,6 +2,7 @@ import copy
from datetime import datetime, timedelta, timezone
from decimal import Decimal
from operator import itemgetter
from unittest import SkipTest
from uuid import uuid4
import boto3
@ -10,7 +11,7 @@ from botocore.exceptions import ClientError
from dateutil.tz import tzutc
from freezegun import freeze_time
from moto import mock_aws
from moto import mock_aws, settings
from moto.core import DEFAULT_ACCOUNT_ID as ACCOUNT_ID
from moto.core.utils import utcnow
@ -27,6 +28,43 @@ def test_put_metric_data_no_dimensions():
assert {"Namespace": "tester", "MetricName": "metric", "Dimensions": []} in metrics
@mock_aws
def test_put_a_ton_of_metric_data():
"""
A sufficiently large call with metric data triggers request compression
Moto should decompress the request if this is the case, and the request should succeed
"""
if not settings.TEST_DECORATOR_MODE:
raise SkipTest("Can't test large requests in ServerMode")
cloudwatch = boto3.client("cloudwatch", "us-east-1")
metrics = []
metric_dimensions = [{"Name": "Environment", "Value": "env1"}]
metric_args = {"Unit": "Seconds", "MetricName": "TestCWMetrics"}
for type, licences in {
k: v
for k, v in {
"userTypes": [{"id": f"UserType{x}"} for x in range(0, 50)]
}.items()
if k in ["userTypes", "appBundles", "apps", "extensions", "portalCapabilities"]
}.items():
for licence in licences:
metrics.append(
{
**metric_args,
"Dimensions": [
*metric_dimensions,
{"Name": "Type", "Value": f"{type}/{licence['id']}"},
],
"Value": 1,
}
)
cloudwatch.put_metric_data(Namespace="acme", MetricData=metrics)
# We don't really need any assertions - we just need to know that the call succeeds
@mock_aws
def test_put_metric_data_can_not_have_nan():
client = boto3.client("cloudwatch", region_name="us-west-2")