diff --git a/wsme/rest/args.py b/wsme/rest/args.py index 7769e18..0bdc7d0 100644 --- a/wsme/rest/args.py +++ b/wsme/rest/args.py @@ -9,6 +9,7 @@ from wsme.exc import ClientSideError, UnknownArgument from wsme.types import iscomplex, list_attributes, Unset from wsme.types import UserType, ArrayType, DictType, File from wsme.utils import parse_isodate, parse_isotime, parse_isodatetime +import wsme.runtime ARRAY_MAX_SIZE = 1000 @@ -273,8 +274,10 @@ def get_args(funcdef, args, kwargs, params, form, body, mimetype): (from_params, from_form_params, from_body) ) - return combine_args( + args, kwargs = combine_args( funcdef, (from_args, from_params_and_body), allow_override=True ) + wsme.runtime.check_arguments(funcdef, args, kwargs) + return args, kwargs diff --git a/wsme/rest/protocol.py b/wsme/rest/protocol.py index 8e8c4ac..85c76fd 100644 --- a/wsme/rest/protocol.py +++ b/wsme/rest/protocol.py @@ -6,6 +6,7 @@ from wsme.protocol import CallContext, Protocol import wsme.rest import wsme.rest.args +import wsme.runtime log = logging.getLogger(__name__) @@ -120,7 +121,7 @@ class RestProtocol(Protocol): (wsme.rest.args.args_from_params(funcdef, request.params), wsme.rest.args.args_from_body(funcdef, body, context.inmime)) ) - assert len(args) == 0 + wsme.runtime.check_arguments(funcdef, args, kwargs) return kwargs def encode_result(self, context, result): diff --git a/wsme/root.py b/wsme/root.py index 0ce9431..157704c 100644 --- a/wsme/root.py +++ b/wsme/root.py @@ -7,7 +7,7 @@ import six import webob -from wsme.exc import ClientSideError, MissingArgument, UnknownFunction +from wsme.exc import ClientSideError, UnknownFunction from wsme.protocol import getprotocol from wsme.rest import scan_api from wsme import spore @@ -180,10 +180,6 @@ class WSRoot(object): kw = protocol.read_arguments(context) args = list(args) - for arg in context.funcdef.arguments: - if arg.mandatory and arg.name not in kw: - raise MissingArgument(arg.name) - txn = self.begin() try: result = context.func(*args, **kw) diff --git a/wsme/runtime.py b/wsme/runtime.py new file mode 100644 index 0000000..e114d13 --- /dev/null +++ b/wsme/runtime.py @@ -0,0 +1,9 @@ +from wsme.exc import MissingArgument + + +def check_arguments(funcdef, args, kw): + """Check if some arguments are missing""" + assert len(args) == 0 + for arg in funcdef.arguments: + if arg.mandatory and arg.name not in kw: + raise MissingArgument(arg.name) diff --git a/wsmeext/cornice.py b/wsmeext/cornice.py index 53a4d4f..3e8b469 100644 --- a/wsmeext/cornice.py +++ b/wsmeext/cornice.py @@ -19,6 +19,7 @@ from __future__ import absolute_import import wsme from wsme.rest import json as restjson from wsme.rest import xml as restxml +import wsme.runtime import functools from wsme.rest.args import ( @@ -76,6 +77,7 @@ def signature(*args, **kwargs): (args_from_params(funcdef, request.params), args_from_body(funcdef, request.body, request.content_type)) ) + wsme.runtime.check_arguments(funcdef, args, kwargs) request.override_renderer = 'wsme' + get_outputformat(request) if funcdef.pass_request: kwargs[funcdef.pass_request] = request diff --git a/wsmeext/extdirect/protocol.py b/wsmeext/extdirect/protocol.py index c510f2c..4cd7986 100644 --- a/wsmeext/extdirect/protocol.py +++ b/wsmeext/extdirect/protocol.py @@ -363,9 +363,11 @@ class ExtDirectProtocol(Protocol): def read_arguments(self, context): if isinstance(context, ExtCallContext): - return self.read_std_arguments(context) + kwargs = self.read_std_arguments(context) elif isinstance(context, FormExtCallContext): - return self.read_form_arguments(context) + kwargs = self.read_form_arguments(context) + wsme.runtime.check_arguments(context.funcdef, (), kwargs) + return kwargs def encode_result(self, context, result): return json.dumps({ diff --git a/wsmeext/soap/protocol.py b/wsmeext/soap/protocol.py index ca65a81..599aea3 100644 --- a/wsmeext/soap/protocol.py +++ b/wsmeext/soap/protocol.py @@ -25,6 +25,8 @@ except ImportError: from wsme.protocol import CallContext, Protocol, expose import wsme.types +import wsme.runtime + from wsme import exc from wsme.utils import parse_isodate, parse_isotime, parse_isodatetime @@ -384,7 +386,7 @@ class SoapProtocol(Protocol): 'type': self.typenamespace, }) kw[name] = value - + wsme.runtime.check_arguments(context.funcdef, (), kw) return kw def soap_response(self, path, funcdef, result):