Skip to content

Commit

Permalink
Merge pull request #469 from rollbar/fixed/issue-344-include_request_…
Browse files Browse the repository at this point in the history
…body-not-respected

Fixed #344 not checking `include_request_body` setting for various frameworks.
  • Loading branch information
danielmorell authored Jan 31, 2025
2 parents 3aca977 + 8f00dbc commit 6901051
Show file tree
Hide file tree
Showing 3 changed files with 68 additions and 29 deletions.
63 changes: 34 additions & 29 deletions rollbar/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -1265,11 +1265,12 @@ def _build_werkzeug_request_data(request):
'files_keys': list(request.files.keys()),
}

try:
if request.json:
request_data['body'] = request.json
except Exception:
pass
if SETTINGS['include_request_body']:
try:
if request.json:
request_data['body'] = request.json
except Exception:
pass

return request_data

Expand Down Expand Up @@ -1297,13 +1298,15 @@ def _build_bottle_request_data(request):
'GET': dict(request.query)
}

if request.json:
try:
request_data['body'] = request.body.getvalue()
except:
pass
else:
request_data['POST'] = dict(request.forms)

if SETTINGS['include_request_body']:
if request.json:
try:
request_data['body'] = request.body.getvalue()
except:
pass
else:
request_data['POST'] = dict(request.forms)

return request_data

Expand All @@ -1317,13 +1320,14 @@ def _build_sanic_request_data(request):
'GET': dict(request.args)
}

if request.json:
try:
request_data['body'] = request.json
except:
pass
else:
request_data['POST'] = request.form
if SETTINGS['include_request_body']:
if request.json:
try:
request_data['body'] = request.json
except:
pass
else:
request_data['POST'] = request.form

return request_data

Expand Down Expand Up @@ -1354,16 +1358,17 @@ def _build_wsgi_request_data(request):

request_data['headers'] = _extract_wsgi_headers(request.items())

try:
length = int(request.get('CONTENT_LENGTH', 0))
except ValueError:
length = 0
input = request.get('wsgi.input')
if length and input and hasattr(input, 'seek') and hasattr(input, 'tell'):
pos = input.tell()
input.seek(0, 0)
request_data['body'] = input.read(length)
input.seek(pos, 0)
if SETTINGS['include_request_body']:
try:
length = int(request.get('CONTENT_LENGTH', 0))
except ValueError:
length = 0
input = request.get('wsgi.input')
if length and input and hasattr(input, 'seek') and hasattr(input, 'tell'):
pos = input.tell()
input.seek(0, 0)
request_data['body'] = input.read(length)
input.seek(pos, 0)

return request_data

Expand Down
19 changes: 19 additions & 0 deletions rollbar/test/flask_tests/test_flask.py
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,7 @@ def assertStringEqual(self, left, right):

@mock.patch('rollbar.send_payload')
def test_uncaught(self, send_payload):
rollbar.SETTINGS['include_request_body'] = True
resp = self.client.get('/cause_error?foo=bar',
headers={'X-Real-Ip': '1.2.3.4', 'User-Agent': 'Flask Test'})
self.assertEqual(resp.status_code, 500)
Expand Down Expand Up @@ -115,6 +116,7 @@ def test_uncaught(self, send_payload):

@mock.patch('rollbar.send_payload')
def test_uncaught_json_request(self, send_payload):
rollbar.SETTINGS['include_request_body'] = True
json_body = {"hello": "world"}
json_body_str = json.dumps(json_body)
resp = self.client.post('/cause_error', data=json_body_str,
Expand Down Expand Up @@ -178,3 +180,20 @@ def test_uncaught_no_username_no_email(self, send_payload):

rollbar.SETTINGS['capture_email'] = True
rollbar.SETTINGS['capture_username'] = True

@mock.patch('rollbar.send_payload')
def test_uncaught_no_body(self, send_payload):
rollbar.SETTINGS['include_request_body'] = False

resp = self.client.get('/cause_error?foo=bar',
headers={'X-Real-Ip': '1.2.3.4', 'User-Agent': 'Flask Test'})
self.assertEqual(resp.status_code, 500)

self.assertEqual(send_payload.called, True)
payload = send_payload.call_args[0][0]
data = payload['data']

self.assertIn('request', data)
self.assertNotIn('body', data['request'])

rollbar.SETTINGS['include_request_body'] = True
15 changes: 15 additions & 0 deletions rollbar/test/test_rollbar.py
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,7 @@ def test_server_data(self):
self.assertEqual(server_data['root'], '/home/test/')

def test_wsgi_request_data(self):
rollbar.SETTINGS['include_request_body'] = True
request = {
'CONTENT_LENGTH': str(len('body body body')),
'CONTENT_TYPE': '',
Expand Down Expand Up @@ -120,6 +121,20 @@ def test_wsgi_request_data(self):
self.assertDictEqual(data['GET'], {'format': 'json', 'param1': 'value1', 'param2': 'value2'})
self.assertDictEqual(data['headers'], {'Connection': 'close', 'Host': 'example.com', 'User-Agent': 'Agent'})

def test_wsgi_request_data_no_body(self):
rollbar.SETTINGS['include_request_body'] = False
request = {
'CONTENT_LENGTH': str(len('body body body')),
'REMOTE_ADDR': '127.0.0.1',
'SERVER_NAME': 'example.com',
'SERVER_PORT': '80',
'wsgi.input': StringIO('body body body'),
'wsgi.url_scheme': 'http',
}
data = rollbar._build_wsgi_request_data(request)
self.assertNotIn('body', data)
rollbar.SETTINGS['include_request_body'] = True

def test_starlette_request_data(self):
try:
from starlette.requests import Request
Expand Down

0 comments on commit 6901051

Please sign in to comment.