misc: accept empty content as json input (#51270)

This commit is contained in:
Frédéric Péters 2021-02-18 20:28:26 +01:00
parent acb9207bc6
commit 5b75505744
2 changed files with 70 additions and 5 deletions

View File

@ -3155,6 +3155,67 @@ def test_workflow_trigger(pub, local_user):
resp = get_app(pub).post(sign_uri(formdata.get_url() + 'jump/trigger/XXX', user=local_user), status=200)
def test_workflow_trigger_with_data(pub, local_user):
workflow = Workflow(name='test')
st1 = workflow.add_status('Status1', 'st1')
jump = JumpWorkflowStatusItem()
jump.trigger = 'XXX'
jump.status = 'st2'
st1.items.append(jump)
jump.parent = st1
st2 = workflow.add_status('Status2', 'st2')
workflow.store()
FormDef.wipe()
formdef = FormDef()
formdef.name = 'test'
formdef.fields = []
formdef.workflow_id = workflow.id
formdef.store()
formdef.data_class().wipe()
formdata = formdef.data_class()()
formdata.just_created()
formdata.store()
get_app(pub).post_json(
sign_uri(formdata.get_url() + 'jump/trigger/XXX'), status=200, params={'test': 'data'}
)
assert formdef.data_class().get(formdata.id).status == 'wf-st2'
assert formdef.data_class().get(formdata.id).workflow_data == {'test': 'data'}
# post with empty dictionary
formdata.store() # reset
get_app(pub).post_json(sign_uri(formdata.get_url() + 'jump/trigger/XXX'), status=200, params={})
assert formdef.data_class().get(formdata.id).status == 'wf-st2'
assert not formdef.data_class().get(formdata.id).workflow_data
# post with empty data
formdata.store() # reset
get_app(pub).post(sign_uri(formdata.get_url() + 'jump/trigger/XXX'), status=200)
assert formdef.data_class().get(formdata.id).status == 'wf-st2'
assert not formdef.data_class().get(formdata.id).workflow_data
# post with empty data, but declare json content-type
formdata.store() # reset
get_app(pub).post(
sign_uri(formdata.get_url() + 'jump/trigger/XXX'),
status=200,
headers={'content-type': 'application/json'},
)
assert formdef.data_class().get(formdata.id).status == 'wf-st2'
assert not formdef.data_class().get(formdata.id).workflow_data
# post with invalid JSON data
formdata.store() # reset
get_app(pub).post(
sign_uri(formdata.get_url() + 'jump/trigger/XXX'),
status=400,
headers={'content-type': 'application/json'},
params='ERROR',
)
def test_workflow_trigger_with_condition(pub, local_user):
workflow = Workflow(name='test')
st1 = workflow.add_status('Status1', 'st1')

View File

@ -152,11 +152,15 @@ class HTTPRequest(quixote.http_request.HTTPRequest):
from .misc import json_loads
length = int(self.environ.get('CONTENT_LENGTH') or '0')
payload = self.stdin.read(length)
try:
self._json = json_loads(payload)
except ValueError as e:
raise RequestError('invalid json payload (%s)' % str(e))
if length:
payload = self.stdin.read(length)
try:
self._json = json_loads(payload)
except ValueError as e:
raise RequestError('invalid json payload (%s)' % str(e))
else:
# consider empty post as an empty dictionary
self._json = {}
# remove characters that are not valid XML so it doesn't have to happen
# down the chain.
illegal_xml_chars = re.compile(r'[\x00-\x08\x0b\x0c\x0e-\x1f\ud800-\udfff\ufffe\uffff]')