From 8f4b5ba3f49415cd440d022ef6e0864d3396b5d2 Mon Sep 17 00:00:00 2001 From: Stepan Henek Date: Fri, 8 Mar 2019 23:56:34 +0100 Subject: [PATCH] fix: Wsgi - valid JSONs ([], {}) are evaluated as raw data It should be evaluated as empty JSON object/array Note that according to RFC 4627 top level elements can be empty objects or arrays --- sentry_sdk/integrations/_wsgi_common.py | 2 +- tests/integrations/flask/test_flask.py | 22 ++++++++++++++++++++++ tests/integrations/pyramid/test_pyramid.py | 22 ++++++++++++++++++++++ 3 files changed, 45 insertions(+), 1 deletion(-) diff --git a/sentry_sdk/integrations/_wsgi_common.py b/sentry_sdk/integrations/_wsgi_common.py index 0a8075b2e6..b9825589ed 100644 --- a/sentry_sdk/integrations/_wsgi_common.py +++ b/sentry_sdk/integrations/_wsgi_common.py @@ -42,7 +42,7 @@ def extract_into_event(self, event): ) else: parsed_body = self.parsed_body() - if parsed_body: + if parsed_body is not None: data = parsed_body elif self.raw_data(): data = AnnotatedValue( diff --git a/tests/integrations/flask/test_flask.py b/tests/integrations/flask/test_flask.py index c6f476f8d9..45beae9073 100644 --- a/tests/integrations/flask/test_flask.py +++ b/tests/integrations/flask/test_flask.py @@ -214,6 +214,28 @@ def index(): assert len(event["request"]["data"]["foo"]["bar"]) == 512 +@pytest.mark.parametrize("data", [{}, []], ids=["empty-dict", "empty-list"]) +def test_flask_empty_json_request(sentry_init, capture_events, app, data): + sentry_init(integrations=[flask_sentry.FlaskIntegration()]) + + @app.route("/", methods=["POST"]) + def index(): + assert request.json == data + assert request.data == json.dumps(data).encode("ascii") + assert not request.form + capture_message("hi") + return "ok" + + events = capture_events() + + client = app.test_client() + response = client.post("/", content_type="application/json", data=json.dumps(data)) + assert response.status_code == 200 + + event, = events + assert event["request"]["data"] == data + + def test_flask_medium_formdata_request(sentry_init, capture_events, app): sentry_init(integrations=[flask_sentry.FlaskIntegration()]) diff --git a/tests/integrations/pyramid/test_pyramid.py b/tests/integrations/pyramid/test_pyramid.py index bd2dd4ec59..c8a09d4b38 100644 --- a/tests/integrations/pyramid/test_pyramid.py +++ b/tests/integrations/pyramid/test_pyramid.py @@ -142,6 +142,28 @@ def index(request): assert len(event["request"]["data"]["foo"]["bar"]) == 512 +@pytest.mark.parametrize("data", [{}, []], ids=["empty-dict", "empty-list"]) +def test_flask_empty_json_request(sentry_init, capture_events, route, get_client, data): + sentry_init(integrations=[PyramidIntegration()]) + + @route("/") + def index(request): + assert request.json == data + assert request.text == json.dumps(data) + assert not request.POST + capture_message("hi") + return Response("ok") + + events = capture_events() + + client = get_client() + response = client.post("/", content_type="application/json", data=json.dumps(data)) + assert response[1] == "200 OK" + + event, = events + assert event["request"]["data"] == data + + def test_files_and_form(sentry_init, capture_events, route, get_client): sentry_init(integrations=[PyramidIntegration()], request_bodies="always")