Now rely on wsme.rest.args to parse the parameters, which avoids a lot of code duplication

This commit is contained in:
Christophe de Vienne 2013-01-17 22:49:00 +01:00
parent f3bb716b0e
commit 23bac07fee

View File

@ -1,9 +1,7 @@
import os.path import os.path
import logging import logging
import six
from wsme.utils import OrderedDict from wsme.utils import OrderedDict
from wsme.exc import ClientSideError, UnknownArgument, MissingArgument
from wsme.protocol import CallContext, Protocol from wsme.protocol import CallContext, Protocol
import wsme.rest import wsme.rest
@ -50,14 +48,19 @@ class RestProtocol(Protocol):
outmime = request.accept.best_match(self.content_types) outmime = request.accept.best_match(self.content_types)
outformat = None outformat = None
informat = None
for dfname, df in self.dataformats.items(): for dfname, df in self.dataformats.items():
if ext == '.' + dfname: if ext == '.' + dfname:
outformat = df outformat = df
if not inmime:
informat = df
if outformat is None and request.accept: if outformat is None and request.accept:
for dfname, df in self.dataformats.items(): for dfname, df in self.dataformats.items():
if outmime in df.accept_content_types: if outmime in df.accept_content_types:
outformat = df outformat = df
if not inmime:
informat = df
if outformat is None: if outformat is None:
for dfname, df in self.dataformats.items(): for dfname, df in self.dataformats.items():
@ -68,6 +71,10 @@ class RestProtocol(Protocol):
context.outformat_options = { context.outformat_options = {
'nest_result': getattr(self, 'nest_result', False) 'nest_result': getattr(self, 'nest_result', False)
} }
if not inmime and informat:
inmime = informat.content_type
log.debug("Inferred input type: %s" % inmime)
context.inmime = inmime
yield context yield context
def extract_path(self, context): def extract_path(self, context):
@ -102,61 +109,15 @@ class RestProtocol(Protocol):
request = context.request request = context.request
funcdef = context.funcdef funcdef = context.funcdef
if 'Content-Type' in request.headers \ args, kwargs = wsme.rest.args.combine_args(
and ("application/x-www-form-urlencoded"
in request.headers['Content-Type']
or "multipart/form-data"
in request.headers['Content-Type']):
# The params were read from the body, ignoring the body then
pass
elif len(request.params) and request.content_length:
log.warning("The request has both a body and params.")
log.debug("Params: %s" % request.params)
log.debug("Body: %s" % request.body)
raise ClientSideError(
"Cannot read parameters from both a body and GET/POST params")
param_args = (), {}
body = None
if 'body' in request.params:
body = request.params['body']
body_mimetype = context.outformat.content_type
else:
param_args = wsme.rest.args.args_from_params(
funcdef, request.params
)
if request.content_length:
body = request.body
body_mimetype = request.content_type
if isinstance(body, six.binary_type):
body = body.decode('utf8')
if body and body_mimetype in self.content_types:
body_args = wsme.rest.args.args_from_body(
funcdef, body, body_mimetype
)
else:
body_args = ((), {})
args, kw = wsme.rest.args.combine_args(
funcdef, funcdef,
param_args, wsme.rest.args.args_from_params(funcdef, request.params,
body_args context.inmime),
wsme.rest.args.args_from_body(
funcdef, request.body, request.content_type)
) )
assert len(args) == 0
for a in funcdef.arguments: return kwargs
if a.mandatory and a.name not in kw:
raise MissingArgument(a.name)
argnames = set((a.name for a in funcdef.arguments))
for k in kw:
if k not in argnames:
raise UnknownArgument(k)
return kw
def encode_result(self, context, result): def encode_result(self, context, result):
out = context.outformat.encode_result( out = context.outformat.encode_result(