diff options
Diffstat (limited to 'deluge/ui/web/server.py')
-rw-r--r-- | deluge/ui/web/server.py | 48 |
1 files changed, 47 insertions, 1 deletions
diff --git a/deluge/ui/web/server.py b/deluge/ui/web/server.py index c9bc2a786..b775d9860 100644 --- a/deluge/ui/web/server.py +++ b/deluge/ui/web/server.py @@ -34,6 +34,7 @@ # import os +import json import time import shutil import urllib @@ -52,7 +53,7 @@ from deluge import common, component, configmanager from deluge.core.rpcserver import check_ssl_keys from deluge.ui import common as uicommon from deluge.ui.tracker_icons import TrackerIcons -from deluge.ui.web.auth import Auth +from deluge.ui.web.auth import Auth, AuthError, AUTH_LEVEL_DEFAULT from deluge.ui.web.common import Template, compress from deluge.ui.web.json_api import JSON, WebApi from deluge.ui.web.pluginmanager import PluginManager @@ -86,6 +87,8 @@ CONFIG_DEFAULTS = { "cert": "ssl/daemon.cert" } +PEERS_KEYS = ["peers"] + UI_CONFIG_KEYS = ( "theme", "sidebar_show_zero", "sidebar_multiple_filters", "show_session_speed", "base", "first_login" @@ -198,6 +201,46 @@ class Tracker(resource.Resource): d.addCallback(self.on_got_icon, request) return server.NOT_DONE_YET +class TorrentResource(resource.Resource): + """ + Base class for exposing parts of a torrent's information + as a REST-ish interface. + """ + + def getChild(self, path, request): + request.torrent_id = path + return self + + def send_response(self, response, request): + request.setHeader("content-type", "text/plain") + request.write(compress(json.dumps(response), request)) + request.finish() + +class Peers(TorrentResource): + """ + Returns a list of the peers that a torrent currently has in JSON format. + """ + + def on_got_peers(self, torrent, request): + peers = torrent["peers"] + self.send_response({ + "peers": peers, + "total": len(peers) + }, request) + + def render(self, request): + try: + component.get("Auth").check_request(request, + level=AUTH_LEVEL_DEFAULT) + except AuthError: + request.setResponseCode(http.FORBIDDEN) + return '<h1>Forbidden</h1>' + + component.get("SessionProxy" + ).get_torrent_status(request.torrent_id, PEERS_KEYS + ).addCallback(self.on_got_peers, request) + return server.NOT_DONE_YET + class Flag(resource.Resource): def getChild(self, path, request): request.country = path @@ -466,6 +509,9 @@ class TopLevel(resource.Resource): self.putChild("resources", static.File(rpath("resources"))) self.putChild("tracker", Tracker()) + # Torrent REST resources + self.putChild("peers", Peers()) + theme = component.get("DelugeWeb").config["theme"] if not os.path.isfile(rpath("themes", "css", "xtheme-%s.css" % theme)): theme = CONFIG_DEFAULTS.get("theme") |