Skip to content

Commit b47ed93

Browse files
shenekuntitaker
authored andcommitted
fix: Wsgi - valid JSONs ([], {}) are evaluated as raw data (#286)
It should be evaluated as empty JSON object/array Note that according to RFC 4627 top level elements can be empty objects or arrays
1 parent 3e7070b commit b47ed93

File tree

3 files changed

+45
-1
lines changed

3 files changed

+45
-1
lines changed

sentry_sdk/integrations/_wsgi_common.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ def extract_into_event(self, event):
4242
)
4343
else:
4444
parsed_body = self.parsed_body()
45-
if parsed_body:
45+
if parsed_body is not None:
4646
data = parsed_body
4747
elif self.raw_data():
4848
data = AnnotatedValue(

tests/integrations/flask/test_flask.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,28 @@ def index():
214214
assert len(event["request"]["data"]["foo"]["bar"]) == 512
215215

216216

217+
@pytest.mark.parametrize("data", [{}, []], ids=["empty-dict", "empty-list"])
218+
def test_flask_empty_json_request(sentry_init, capture_events, app, data):
219+
sentry_init(integrations=[flask_sentry.FlaskIntegration()])
220+
221+
@app.route("/", methods=["POST"])
222+
def index():
223+
assert request.json == data
224+
assert request.data == json.dumps(data).encode("ascii")
225+
assert not request.form
226+
capture_message("hi")
227+
return "ok"
228+
229+
events = capture_events()
230+
231+
client = app.test_client()
232+
response = client.post("/", content_type="application/json", data=json.dumps(data))
233+
assert response.status_code == 200
234+
235+
event, = events
236+
assert event["request"]["data"] == data
237+
238+
217239
def test_flask_medium_formdata_request(sentry_init, capture_events, app):
218240
sentry_init(integrations=[flask_sentry.FlaskIntegration()])
219241

tests/integrations/pyramid/test_pyramid.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,28 @@ def index(request):
142142
assert len(event["request"]["data"]["foo"]["bar"]) == 512
143143

144144

145+
@pytest.mark.parametrize("data", [{}, []], ids=["empty-dict", "empty-list"])
146+
def test_flask_empty_json_request(sentry_init, capture_events, route, get_client, data):
147+
sentry_init(integrations=[PyramidIntegration()])
148+
149+
@route("/")
150+
def index(request):
151+
assert request.json == data
152+
assert request.text == json.dumps(data)
153+
assert not request.POST
154+
capture_message("hi")
155+
return Response("ok")
156+
157+
events = capture_events()
158+
159+
client = get_client()
160+
response = client.post("/", content_type="application/json", data=json.dumps(data))
161+
assert response[1] == "200 OK"
162+
163+
event, = events
164+
assert event["request"]["data"] == data
165+
166+
145167
def test_files_and_form(sentry_init, capture_events, route, get_client):
146168
sentry_init(integrations=[PyramidIntegration()], request_bodies="always")
147169

0 commit comments

Comments
 (0)