summaryrefslogtreecommitdiffstats
path: root/deluge/ui/web/server.py
diff options
context:
space:
mode:
Diffstat (limited to 'deluge/ui/web/server.py')
-rw-r--r--deluge/ui/web/server.py48
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")