diff --git a/couchpotato/api.py b/couchpotato/api.py index 93d8a251..029ebce2 100644 --- a/couchpotato/api.py +++ b/couchpotato/api.py @@ -1,3 +1,4 @@ +from couchpotato.core.helpers.request import getParams from tornado.web import RequestHandler, asynchronous import json import urllib @@ -54,6 +55,9 @@ class ApiHandler(RequestHandler): for x in self.request.arguments: kwargs[x] = urllib.unquote(self.get_argument(x)) + # Split array arguments + kwargs = getParams(kwargs) + # Remove t random string try: del kwargs['t'] except: pass diff --git a/couchpotato/core/helpers/request.py b/couchpotato/core/helpers/request.py new file mode 100644 index 00000000..0ac84ef8 --- /dev/null +++ b/couchpotato/core/helpers/request.py @@ -0,0 +1,52 @@ +from couchpotato.core.helpers.encoding import toUnicode +from couchpotato.core.helpers.variable import natcmp +from urllib import unquote +import re + + +def getParams(params): + + reg = re.compile('^[a-z0-9_\.]+$') + + current = temp = {} + for param, value in sorted(params.iteritems()): + + nest = re.split("([\[\]]+)", param) + if len(nest) > 1: + nested = [] + for key in nest: + if reg.match(key): + nested.append(key) + + current = temp + + for item in nested: + if item is nested[-1]: + current[item] = toUnicode(unquote(value)) + else: + try: + current[item] + except: + current[item] = {} + + current = current[item] + else: + temp[param] = toUnicode(unquote(value)) + + return dictToList(temp) + +def dictToList(params): + + if type(params) is dict: + new = {} + for x, value in params.iteritems(): + try: + new_value = [dictToList(value[k]) for k in sorted(value.iterkeys(), cmp = natcmp)] + except: + new_value = value + + new[x] = new_value + else: + new = params + + return new