diff options
| author | 2012-09-22 16:21:17 +0200 | |
|---|---|---|
| committer | 2012-09-22 16:21:17 +0200 | |
| commit | 2bbdd6cf3a0ea429583a9e4b840e68c238e08a46 (patch) | |
| tree | 3adf00866aa7fe5ac59bd5430754ad9dfcbc72b8 /module/web | |
| parent | added websocket backend, removed thrift (diff) | |
| download | pyload-2bbdd6cf3a0ea429583a9e4b840e68c238e08a46.tar.xz | |
web socket api handler
Diffstat (limited to 'module/web')
| -rw-r--r-- | module/web/api_app.py | 35 | ||||
| -rw-r--r-- | module/web/filters.py | 62 | ||||
| -rw-r--r-- | module/web/webinterface.py | 22 | 
3 files changed, 23 insertions, 96 deletions
| diff --git a/module/web/api_app.py b/module/web/api_app.py index b2d7fa5b6..c3237c743 100644 --- a/module/web/api_app.py +++ b/module/web/api_app.py @@ -10,19 +10,8 @@ from bottle import route, request, response, HTTPError  from utils import set_session, get_user_api  from webinterface import PYLOAD -from module.common.json_layer import json -from module.utils import remove_chars, to_dict -from module.lib.SafeEval import const_eval as literal_eval -from module.Api import BaseObject - -# json encoder that accepts TBase objects -class TBaseEncoder(json.JSONEncoder): - -    def default(self, o): -        if isinstance(o, BaseObject): -            return to_dict(o) -        return json.JSONEncoder.default(self, o) - +from module.remote.json_converter import loads, dumps +from module.utils import remove_chars  def add_header(r):      r.headers.replace("Content-type", "application/json") @@ -43,10 +32,10 @@ def call_api(func, args=""):      api = get_user_api(s)      if not api: -        return HTTPError(403, json.dumps("Forbidden")) +        return HTTPError(403, dumps("Forbidden"))      if not PYLOAD.isAuthorized(func, api.user): -        return HTTPError(401, json.dumps("Unauthorized")) +        return HTTPError(401, dumps("Unauthorized"))      args = args.split("/")[1:]      kwargs = {} @@ -59,23 +48,23 @@ def call_api(func, args=""):          return callApi(func, *args, **kwargs)      except Exception, e:          print_exc() -        return HTTPError(500, json.dumps({"error": e.message, "traceback": format_exc()})) +        return HTTPError(500, dumps({"error": e.message, "traceback": format_exc()}))  # Better error codes on invalid input  def callApi(func, *args, **kwargs):      if not hasattr(PYLOAD.EXTERNAL, func) or func.startswith("_"):          print "Invalid API call", func -        return HTTPError(404, json.dumps("Not Found")) +        return HTTPError(404, dumps("Not Found"))      # TODO: encoding -    result = getattr(PYLOAD, func)(*[literal_eval(x) for x in args], -                                   **dict([(x, literal_eval(y)) for x, y in kwargs.iteritems()])) +    result = getattr(PYLOAD, func)(*[loads(x) for x in args], +                                   **dict([(x, loads(y)) for x, y in kwargs.iteritems()]))      # null is invalid json response      if result is None: result = True -    return json.dumps(result, cls=TBaseEncoder) +    return dumps(result)  #post -> username, password @@ -89,17 +78,17 @@ def login():      user = PYLOAD.checkAuth(username, password)      if not user: -        return json.dumps(False) +        return dumps(False)      s = set_session(request, user)      # get the session id by dirty way, documentations seems wrong      try:          sid = s._headers["cookie_out"].split("=")[1].split(";")[0] -        return json.dumps(sid) +        return dumps(sid)      except:          print "Could not get session" -        return json.dumps(True) +        return dumps(True)  @route("/api/logout") diff --git a/module/web/filters.py b/module/web/filters.py deleted file mode 100644 index 13b8345fc..000000000 --- a/module/web/filters.py +++ /dev/null @@ -1,62 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -import os -from os.path import abspath, commonprefix, join - -quotechar = "::/" - -try: -    from os.path import relpath -except: -    from posixpath import curdir, sep, pardir -    def relpath(path, start=curdir): -        """Return a relative version of a path""" -        if not path: -            raise ValueError("no path specified") -        start_list = abspath(start).split(sep) -        path_list = abspath(path).split(sep) -        # Work out how much of the filepath is shared by start and path. -        i = len(commonprefix([start_list, path_list])) -        rel_list = [pardir] * (len(start_list)-i) + path_list[i:] -        if not rel_list: -            return curdir -        return join(*rel_list) - - -def quotepath(path): -    try: -        return path.replace("../", quotechar) -    except AttributeError: -        return path -    except: -        return "" - -def unquotepath(path): -    try: -        return path.replace(quotechar, "../") -    except AttributeError: -        return path -    except: -        return "" - -def path_make_absolute(path): -    p = os.path.abspath(path) -    if p[-1] == os.path.sep: -        return p -    else: -        return p + os.path.sep - -def path_make_relative(path): -    p = relpath(path) -    if p[-1] == os.path.sep: -        return p -    else: -        return p + os.path.sep - -def truncate(value, n): -    if (n - len(value)) < 3: -        return value[:n]+"..." -    return value - -def date(date, format): -    return date
\ No newline at end of file diff --git a/module/web/webinterface.py b/module/web/webinterface.py index ae97406c7..196825bfb 100644 --- a/module/web/webinterface.py +++ b/module/web/webinterface.py @@ -30,7 +30,7 @@ PYLOAD_DIR = abspath(join(PROJECT_DIR, "..", ".."))  sys.path.append(PYLOAD_DIR)  from module import InitHomeDir -from module.utils import decode, format_size +from module.utils import format_size  import bottle  from bottle import run, app @@ -64,7 +64,7 @@ PREFIX = config.get('webinterface', 'prefix')  if PREFIX:      PREFIX = PREFIX.rstrip("/") -    if not PREFIX.startswith("/"): +    if PREFIX and not PREFIX.startswith("/"):          PREFIX = "/" + PREFIX  DEBUG = config.get("general", "debug_mode") or "-d" in sys.argv or "--debug" in sys.argv @@ -84,28 +84,26 @@ loader = PrefixLoader({  env = Environment(loader=loader, extensions=['jinja2.ext.i18n', 'jinja2.ext.autoescape'], trim_blocks=True, auto_reload=False,      bytecode_cache=bcc) -from filters import quotepath, path_make_relative, path_make_absolute, truncate, date +# Filter -env.filters["quotepath"] = quotepath -env.filters["truncate"] = truncate -env.filters["date"] = date -env.filters["path_make_relative"] = path_make_relative -env.filters["path_make_absolute"] = path_make_absolute -env.filters["decode"] = decode  env.filters["type"] = lambda x: str(type(x))  env.filters["formatsize"] = format_size  env.filters["getitem"] = lambda x, y: x.__getitem__(y) -if PREFIX: +if not PREFIX:      env.filters["url"] = lambda x: x  else:      env.filters["url"] = lambda x: PREFIX + x if x.startswith("/") else x +# Locale +  gettext.setpaths([join(os.sep, "usr", "share", "pyload", "locale"), None])  translation = gettext.translation("django", join(PYLOAD_DIR, "locale"),      languages=[config.get("general", "language"), "en"],fallback=True)  translation.install(True)  env.install_gettext_translations(translation) +# Middlewares +  from beaker.middleware import SessionMiddleware  session_opts = { @@ -125,6 +123,9 @@ import pyload_app  import cnl_app  import api_app + +# Server Adapter +  def run_simple(host="0.0.0.0", port="8000"):      run(app=web, host=host, port=port, quiet=True) @@ -140,7 +141,6 @@ def run_threaded(host="0.0.0.0", port="8000", threads=6, cert="", key=""):          CherryPyWSGIServer.ssl_certificate = cert          CherryPyWSGIServer.ssl_private_key = key -      # todo: threads configurable      from utils import CherryPyWSGI      CherryPyWSGI.numthreads = threads | 
