Projet

Général

Profil

0002-wscall-allow-extra-data-on-POST-6622.patch

Thomas Noël, 31 août 2015 17:47

Télécharger (5,01 ko)

Voir les différences:

Subject: [PATCH 2/2] wscall: allow extra data on POST (#6622)

 tests/test_workflows.py | 12 ++++++++++++
 wcs/wf/wscall.py        | 41 +++++++++++++++++++++++++++++++++++------
 2 files changed, 47 insertions(+), 6 deletions(-)
tests/test_workflows.py
411 411
    item = WebserviceCallStatusItem()
412 412
    item.url = 'http://remote.example.net'
413 413
    item.post = False
414
    item.post_data = {'justone': '1', 'str': '"abcd"',
415
            'evalme': 'form_number', 'error':'1=3'}
416
    pub.substitutions.feed(formdata)
417
    item.perform(formdata)
418
    assert http_requests.get_last('url') == 'http://remote.example.net'
419
    assert http_requests.get_last('method') == 'POST'
420
    payload = json.loads(http_requests.get_last('body'))
421
    assert payload == {'justone': 1, 'str': 'abcd', 'evalme': formdata.id}
422

  
423
    item = WebserviceCallStatusItem()
424
    item.url = 'http://remote.example.net'
425
    item.post = False
414 426
    item.request_signature_key = 'xxx'
415 427
    item.perform(formdata)
416 428
    assert 'signature=' in http_requests.get_last('url')
wcs/wf/wscall.py
15 15
# along with this program; if not, see <http://www.gnu.org/licenses/>.
16 16

  
17 17
import json
18
import sys
18 19

  
19 20
from qommon.form import *
20
from qommon.misc import http_get_page, http_post_request, get_variadic_url
21
from qommon.misc import http_get_page, http_post_request, get_variadic_url, JSONEncoder
21 22
from wcs.workflows import WorkflowStatusItem, register_item_class, template_on_formdata
22 23
from wcs.api import sign_url
23 24

  
......
32 33
    varname = None
33 34
    post = True
34 35
    request_signature_key = None
36
    post_data = None
35 37

  
36 38
    def get_parameters(self):
37
        return ('url', 'post', 'varname', 'request_signature_key')
39
        return ('url', 'post', 'varname', 'request_signature_key', 'post_data')
38 40

  
39 41
    def add_parameters_widgets(self, form, parameters, prefix='', formdef=None):
40 42
        if 'url' in parameters:
......
45 47
            form.add(CheckboxWidget, '%spost' % prefix,
46 48
                    title=_('Post formdata (JSON)'),
47 49
                    value=self.post)
50
        if 'post_data' in parameters:
51
            form.add(WidgetDict, '%spost_data' % prefix,
52
                    title=_('Post data (Python expressions)'),
53
                    value=self.post_data or {})
48 54
        if 'varname' in parameters:
49 55
            form.add(VarnameWidget, '%svarname' % prefix,
50 56
                     title=_('Variable Name'), value=self.varname)
51
        if 'request_signature_key':
57
        if 'request_signature_key' in parameters:
52 58
            form.add(StringWidget, '%srequest_signature_key' % prefix,
53 59
                    title=_('Request Signature Key'),
54 60
                    value=self.request_signature_key)
......
69 75

  
70 76
        headers = {'Content-type': 'application/json',
71 77
                'Accept': 'application/json'}
78
        post_data = None # payload
79

  
80
        # if self.post_data exists, post_data is a dict built from it
81
        if self.post_data:
82
            post_data = {}
83
            eval_globals = get_publisher().get_global_eval_dict()
84
            eval_locals = get_publisher().substitutions.get_context_variables()
85
            for (key, expression) in self.post_data.items():
86
                try:
87
                    post_data[key] = eval(expression, eval_globals, eval_locals)
88
                except:
89
                    get_publisher().notify_of_exception(sys.exc_info())
90

  
91
        # if formdata has to be sent, it's the payload. If post_data exists,
92
        # it's added in formdata['extra']
72 93
        if self.post:
73
            formdata_as_json = formdata.export_to_json()
74
            response, status, data, auth_header = http_post_request(
75
                    url, formdata_as_json, headers=headers, timeout=TIMEOUT)
94
            formdata_dict = formdata.get_json_export_dict()
95
            if post_data is not None:
96
                formdata_dict['extra'] = post_data
97
            post_data = formdata_dict
98

  
99
        if post_data is not None:
100
            post_data = json.dumps(post_data, cls=JSONEncoder,
101
                    encoding=get_publisher().site_charset)
102
            response, status, data, authheader = http_post_request(
103
                    url, post_data, headers=headers, timeout=TIMEOUT)
76 104
        else:
77 105
            response, status, data, auth_header = http_get_page(
78 106
                    url, headers=headers, timeout=TIMEOUT)
107

  
79 108
        if self.varname:
80 109
            workflow_data = {'%s_status' % self.varname: status}
81 110
            if status == 200:
82
-