misc: accept empty content as json input (#51270)
This commit is contained in:
parent
acb9207bc6
commit
5b75505744
|
@ -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')
|
||||
|
|
|
@ -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]')
|
||||
|
|
Loading…
Reference in New Issue