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.py65
1 files changed, 32 insertions, 33 deletions
diff --git a/deluge/ui/web/server.py b/deluge/ui/web/server.py
index f391a78..77c1ddf 100644
--- a/deluge/ui/web/server.py
+++ b/deluge/ui/web/server.py
@@ -73,6 +73,20 @@ def rpath(*paths):
return common.resource_filename('deluge.ui.web', os.path.join(*paths))
+def absolute_base_url(base):
+ """Returns base as absolute URL for links"""
+ if not base:
+ base = '/'
+
+ if not base.startswith('/'):
+ base = '/' + base
+
+ if not base.endswith('/'):
+ base += '/'
+
+ return base
+
+
class GetText(resource.Resource):
def render(self, request):
request.setHeader(b'content-type', b'text/javascript; encoding=utf-8')
@@ -127,14 +141,12 @@ class Upload(resource.Resource):
request.setHeader(b'content-type', b'text/html')
request.setResponseCode(http.OK)
- return json.dumps({'success': bool(filenames), 'files': filenames}).encode(
- 'utf8'
- )
+ return json.dumps({'success': bool(filenames), 'files': filenames}).encode()
class Render(resource.Resource):
def __init__(self):
- resource.Resource.__init__(self)
+ super().__init__()
# Make a list of all the template files to check requests against.
self.template_files = fnmatch.filter(os.listdir(rpath('render')), '*.html')
@@ -163,7 +175,7 @@ class Render(resource.Resource):
class Tracker(resource.Resource):
def __init__(self):
- resource.Resource.__init__(self)
+ super().__init__()
try:
self.tracker_icons = component.get('TrackerIcons')
except KeyError:
@@ -178,7 +190,7 @@ class Tracker(resource.Resource):
request.setHeader(
b'cache-control', b'public, must-revalidate, max-age=86400'
)
- request.setHeader(b'content-type', icon.get_mimetype().encode('utf8'))
+ request.setHeader(b'content-type', icon.get_mimetype().encode())
request.setResponseCode(http.OK)
request.write(icon.get_data())
request.finish()
@@ -198,7 +210,7 @@ class Flag(resource.Resource):
return self
def render(self, request):
- flag = request.country.decode('utf-8').lower() + '.png'
+ flag = request.country.decode().lower() + '.png'
path = ('ui', 'data', 'pixmaps', 'flags', flag)
filename = common.resource_filename('deluge', os.path.join(*path))
if os.path.exists(filename):
@@ -447,7 +459,6 @@ class Themes(static.File):
class TopLevel(resource.Resource):
-
__stylesheets = [
'css/ext-all-notheme.css',
'css/ext-extensions.css',
@@ -455,7 +466,7 @@ class TopLevel(resource.Resource):
]
def __init__(self):
- resource.Resource.__init__(self)
+ super().__init__()
self.putChild(b'css', LookupResource('Css', rpath('css')))
if os.path.isfile(rpath('js', 'gettext.js')):
@@ -475,7 +486,8 @@ class TopLevel(resource.Resource):
self.putChild(
b'ui_images',
LookupResource(
- 'UI_Images', common.resource_filename('deluge.ui.data', 'pixmaps')
+ 'UI_Images',
+ common.resource_filename('deluge.ui', os.path.join('data', 'pixmaps')),
),
)
@@ -558,30 +570,21 @@ class TopLevel(resource.Resource):
self.__scripts.remove(script)
self.__debug_scripts.remove(script)
- def getChild(self, path, request): # NOQA: N802
- if not path:
- return self
- else:
- return resource.Resource.getChild(self, path, request)
-
def getChildWithDefault(self, path, request): # NOQA: N802
# Calculate the request base
- header = request.getHeader(b'x-deluge-base')
- base = header.decode('utf-8') if header else component.get('DelugeWeb').base
-
- # validate the base parameter
- if not base:
- base = '/'
+ header = request.getHeader('x-deluge-base')
+ config_base = component.get('DelugeWeb').base
+ base = header if header else config_base
- if base[0] != '/':
- base = '/' + base
+ first_request = not hasattr(request, 'base')
+ request.base = absolute_base_url(base).encode()
- if base[-1] != '/':
- base += '/'
+ base_resource = first_request and path.decode() == config_base.strip('/')
- request.base = base.encode('utf-8')
+ if not path or base_resource:
+ return self
- return resource.Resource.getChildWithDefault(self, path, request)
+ return super().getChildWithDefault(path, request)
def render(self, request):
uri_true = ('true', 'yes', 'on', '1')
@@ -653,7 +656,7 @@ class DelugeWeb(component.Component):
reactor). If False shares the process and twisted reactor from WebUI plugin or tests.
"""
- component.Component.__init__(self, 'DelugeWeb', depend=['Web'])
+ super().__init__('DelugeWeb', depend=['Web'])
self.config = configmanager.ConfigManager(
'web.conf', defaults=CONFIG_DEFAULTS, file_version=2
)
@@ -680,10 +683,6 @@ class DelugeWeb(component.Component):
elif options.no_ssl:
self.https = False
- if self.base != '/':
- # Strip away slashes and serve on the base path as well as root path
- self.top_level.putChild(self.base.strip('/'), self.top_level)
-
setup_translation()
# Remove twisted version number from 'server' http-header for security reasons