summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar RaNaN <Mast3rRaNaN@hotmail.de> 2013-09-13 16:23:54 +0200
committerGravatar RaNaN <Mast3rRaNaN@hotmail.de> 2013-09-13 16:23:54 +0200
commit5854aca376058c4b98ee205ee44ac956ebe50e23 (patch)
tree9cf89cb8457c390f7fdf8140dff6910bfdfabeda
parentgzip files on build, disabled gzip middleware (diff)
downloadpyload-5854aca376058c4b98ee205ee44ac956ebe50e23.tar.xz
some fixes for py 2.5
-rw-r--r--pyload/Core.py4
-rw-r--r--pyload/remote/json_converter.py12
-rw-r--r--pyload/web/api_app.py19
3 files changed, 23 insertions, 12 deletions
diff --git a/pyload/Core.py b/pyload/Core.py
index 15b036c7a..2d591a2bb 100644
--- a/pyload/Core.py
+++ b/pyload/Core.py
@@ -261,7 +261,7 @@ class Core(object):
def cleanTree(self):
- for path, dirs, files in walk(self.path("")):
+ for path, dirs, files in walk(self.path("pyload")):
for f in files:
if not f.endswith(".pyo") and not f.endswith(".pyc"):
continue
@@ -664,4 +664,4 @@ def main():
if __name__ == "__main__":
- print "This file can not be started directly." \ No newline at end of file
+ print "This file can not be started directly."
diff --git a/pyload/remote/json_converter.py b/pyload/remote/json_converter.py
index df397e8ba..a7a0645ce 100644
--- a/pyload/remote/json_converter.py
+++ b/pyload/remote/json_converter.py
@@ -6,7 +6,6 @@ try:
except ImportError:
import json
-
import apitypes
from apitypes import BaseObject
from apitypes import ExceptionObject
@@ -16,10 +15,9 @@ separators = (',', ':')
# json encoder that accepts api objects
class BaseEncoder(json.JSONEncoder):
-
def default(self, o):
if isinstance(o, BaseObject) or isinstance(o, ExceptionObject):
- ret = {"@class" : o.__class__.__name__}
+ ret = {"@class": o.__class__.__name__}
for att in o.__slots__:
ret[att] = getattr(o, att)
return ret
@@ -28,26 +26,28 @@ class BaseEncoder(json.JSONEncoder):
# more compact representation, only clients with information of the classes can handle it
class BaseEncoderCompact(json.JSONEncoder):
-
def default(self, o):
if isinstance(o, BaseObject) or isinstance(o, ExceptionObject):
- ret = {"@compact" : [o.__class__.__name__]}
+ ret = {"@compact": [o.__class__.__name__]}
ret["@compact"].extend(getattr(o, attr) for attr in o.__slots__)
return ret
return json.JSONEncoder.default(self, o)
+
def convert_obj(dct):
if '@class' in dct:
cls = getattr(apitypes, dct['@class'])
del dct['@class']
- return cls(**dct)
+ # convert keywords to str, <=2.6 does not accept unicode
+ return cls(**dict((str(x) if type(x) == unicode else x, y) for x, y in dct.iteritems()))
elif '@compact' in dct:
cls = getattr(apitypes, dct['@compact'][0])
return cls(*dct['@compact'][1:])
return dct
+
def dumps(*args, **kwargs):
if 'compact' in kwargs and kwargs['compact']:
kwargs['cls'] = BaseEncoderCompact
diff --git a/pyload/web/api_app.py b/pyload/web/api_app.py
index 66cdd58fd..af5c3074c 100644
--- a/pyload/web/api_app.py
+++ b/pyload/web/api_app.py
@@ -20,6 +20,10 @@ def add_header(r):
r.headers.append("Access-Control-Allow-Origin", request.get_header('Origin', '*'))
r.headers.append("Access-Control-Allow-Credentials", "true")
+# returns http error
+def error(code, msg):
+ return HTTPError(code, dumps(msg), **dict(response.headers))
+
# accepting positional arguments, as well as kwargs via post and get
# only forbidden path symbol are "?", which is used to separate GET data and #
@route("/api/<func><args:re:[^#?]*>")
@@ -67,8 +71,15 @@ def call_api(func, args=""):
# convert arguments from json to obj separately
for x, y in request.params.iteritems():
- if not x or not y or x == "session": continue
- kwargs[x] = loads(unquote(y))
+ try:
+ if not x or not y or x == "session": continue
+ kwargs[x] = loads(unquote(y))
+ except Exception, e:
+ # Unsupported input
+ msg = "Invalid Input %s, %s : %s" % (x, y, e.message)
+ print_exc()
+ print msg
+ return error(415, msg)
try:
result = getattr(api, func)(*args, **kwargs)
@@ -77,10 +88,10 @@ def call_api(func, args=""):
return dumps(result)
except ExceptionObject, e:
- return HTTPError(400, dumps(e), **response.headers)
+ return error(400, e.message)
except Exception, e:
print_exc()
- return HTTPError(500, dumps({"error": e.message, "traceback": format_exc()}), **response.headers)
+ return error(500, {"error": e.message, "traceback": format_exc()})
@route("/api/login")